知識ベース

汚染チェック

汚染チェックは、悪意のあるユーザーがホストコンピューターでコマンドを実行できないようにしてセキュリティを強化するように設計された、PerlやRubyなどの一部のコンピュータープログラミング言語の機能です。汚染チェックは、主にSQLインジェクションやバッファオーバーフロー攻撃アプローチなどの手法を使用して攻撃されるWebサイトに関連する特定のセキュリティリスクを強調します。

概要

汚染チェックの背後にある概念は、外部ユーザーが変更できる変数(たとえば、Webフォームのフィールドによって設定される変数)が潜在的なセキュリティリスクをもたらすことです。その変数が2番目の変数を設定する式で使用されている場合、その2番目の変数も疑わしくなります。汚染チェックツールは、外部入力の影響を受ける可能性のある変数のリストを形成する変数ごとに進めることができます。これらの変数のいずれかを使用して危険なコマンド(SQLデータベースまたはホストコンピューターのオペレーティングシステムへの直接コマンドなど)を実行すると、汚染チェッカーは、プログラムが潜在的に危険な汚染変数を使用していることを警告します。コンピュータープログラマーは、プログラムを再設計して、危険な入力の周囲に安全な壁を建てることができます。

汚染チェックは、非干渉の完全な検証の控えめな近似または安全な情報フローのより一般的な概念と見なすことができます。システムの情報フローは、そのシステムの単一の実行トレースを調べることでは検証できないため、汚染分析の結果は、それが適用されるシステムの情報フロー特性に関するおおよその情報を必ず反映します。

次の危険なPerlコードは、$ name変数の値をチェックしないことにより、大きなSQLインジェクションの脆弱性を開きます。

#!/ usr / bin / perl my $ name = $ cgi-> param( "name"); #ブラウザから名前を取得... $ dbh-> {TaintIn} = 1; $ dbh-> execute( "SELECT * FROM users WHERE name = '$ name';"); #SQLクエリを実行する

汚染チェックがオンになっている場合、汚染された変数がSQLクエリで使用されているため、Perlはコマンドの実行を拒否し、エラーメッセージで終了します。汚染チェックなしでは、ユーザーはfoo 'を入力できます。 DROP TABLE users-これにより、データベーステーブル全体を削除するコマンドを実行します。より安全なのは、汚染された$ nameの値をSQL文字列リテラルにエンコードし、その結果をSQLクエリで使用して、$ nameに埋め込まれた危険なコマンドが評価されないようにすることです。それを実現する別の方法は、準備されたステートメントを使用して、クエリのすべての変数入力をサニタイズすることです。

もう一つ注意すべきは、Perl DBIは、1のSQL文字列をチェックするために汚染モードを有効にするだけでなく、データベース・ハンドルのTaintIn属性を設定するために、1つを必要とすることです。

歴史

Perlは、-TスイッチがPerl 3に含まれていたため、少なくとも1989年からの汚染をサポートしていました。

1996年、Netscapeは、Netscape Navigator 3のクライアント側だけでなく、Netscape Communications Serverのサーバー側JavaScriptにもデータ汚染を実装しました。ページの作成者がスクリプトを修正して、それを利用できるようにする必要がありました。他のブラウザベンダーはこの機能を実装していません。また、Communications Serverの主要な競合であるMicrosoft(当時)の新しいInternet Information Serverも同様でした。