公開日:2007年9月26日
独立行政法人情報処理推進機構
セキュリティセンター
本ページの情報は2007年9月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。
ソフトウェアに対する攻撃の多くは、不正な入力データがプログラムに侵入する形態をとる。
プログラムにデータが入ってくる経路には多くのものがある。ネットワーク、ローカル端末、環境変数、コマンドライン引数、ファイル、データベース等である。プログラムは、これらから得た値を使用する前にその妥当性を十分に検査する必要がある。
入力検査の方式には、ホワイトリスト方式とブラックリスト方式のふたつがある。
──受理するデータの条件を記述し、該当しないものを拒絶する
──拒絶するデータの条件を記述し、該当しないものを受理する
ブラックリスト方式で注意すべき点は、拒絶すべきデータの条件に漏れがある場合や、新たな攻撃手法が開発された場合、攻撃者に入力検査を迂回されるおそれがあることである。可能ならば、ホワイトリスト方式を採用するのがよい。
その一方でホワイトリスト方式の注意点は、入力データの仕様によってはホワイトリストとして条件を記述できないケースがある点である。例えば、すべて英字からなる文字列についてほとんどすべての綴りを受け入れるがいくつかのキーワードのみは避けたいという仕様の場合、ホワイトリスト方式は使えない。
どちらか一方のみで対処するというのではなく、そのデータの仕様に最も合致した形でこれらふたつを組み合わせるとよい。
入力検査の種類は、概ね次のようなものである。実装にあたっては、可能な限り複数の検査を組み合わせるのがよい。
ひとつの入力データ項目のみを調べる検査。単項目検査にはさらに次の種類がある。
これらはおおむね上記の配列の順序で適用する。
複数の入力データ項目の組み合わせが所定の条件を満たしているか否かの検査。組合せ検査は、用途に応じて次のふたつに分かれる。
複雑なロジックを試行して妥当な結果が得られるか否かによって判定を行う検査。
プログラムが不正なデータの投入を警戒すべき入力経路には次のものがある。カテゴリごとにおおよその危険度を示した。
これらの経路から入力するデータはどれも検査の必要がある。
ネットワークを通じてデータを受け取るプログラムに対しては、そのネットワークに接続可能なユーザ全員が攻撃データを送りつける機会をもつ。
サーバプログラムは普通のクライアントの振りをしたコンピュータから攻撃を受け、クライアントプログラムは善良なサーバの振りをしたマシンから攻撃を受けるおそれがある。また、両者が正規のものであっても通信が途中で改ざんされ、攻撃データが入り込むおそれがある。
ネットワーク入力は最も入力検査を強化すべき入力経路である。
ネットワーク受信ファイルを読み込む場合には、フォーマット検査を厳密に行う。画像、音声、動画等のマルチメディアコンテンツ系のファイルは複雑なフォーマットをもっている。このようなファイルの内部にはバッファオーバーフロー攻撃データや整数オーバーフロー攻撃データが仕込まれるおそれがある。
マルチメディアコンテンツを再生するライブラリそのものによるファイルフォーマット検査にはしばしば不備が見つかるため、ライブラリを使うアプリケーション自身が自衛のための検査をする必要がある。
ネットワーク受信ファイルの検査については『受信ファイルの検査』を見られたい。
ローカル端末にアクセス可能なユーザは、ソフトウェアに対してさまざまな攻撃データを入力し得る。プログラムは、ローカル端末からの入力を十分に検査する必要がある。
多くのプラットフォームでは環境変数が用いられている。環境変数はアプリケーションプログラムが直接参照するものもあれば、ロードするライブラリの制御等、見えないところで効果をおよぼすものもある。これらが不正に設定されているとソフトウェアが侵害されるおそれがある。ローカルコンピュータにログイン可能なユーザは、環境変数の値を細工することが可能である。
環境変数の検査については『環境変数の検査とリセット』を見られたい。
ローカルコンピュータにログイン可能なユーザは、細工した値をコマンドライン引数に与えてプログラムを呼び出すことが可能である。プログラムは、コマンドライン引数を十分に検査する必要がある。
ローカルファイルを読み込む際にもいくつか注意すべき点がある。
ローカルファイルの検査については『ファイルの別名検査』を見られたい。
ローカルデータベースから得られた値であっても、そこに格納される時点で外部から攻撃パターンを受け入れているおそれがある。プログラムは、ローカルデータベースからの入力値を十分に検査する必要がある。