II-20-3. Webシステムの脆弱性

ネットワークサーバの中でも主流のWebシステムに関して、その脆弱性評価の方法とリスク、対処方法を説明する。ApacheやOpenSSLといった個別の実装に関する脆弱性に加え、パラメータ操作による攻撃やOSコマンド/SQLインジェクションといった攻撃に対する対策、Webアプリケーションを監査するツールについて述べる。

【学習の要点】

* Webシステムは、ユーザの入力できる値(フォームフィールド、クエリパラメータ)から脆弱になることが多い。入力値を常に適切にサニティチェックを行う必要がある。

* 定評のあるApache, OpenSSLにも潜在的な不良が存在する可能性がある。報告されている脆弱性に対するパッチを適切なタイミングで適用する必要がある。

* Webに限らず、ソフトウェアに対してすべての脆弱性を発見できるとは限らないが、パターン化された攻撃に対しては必ず対策を講じる必要がある。Webアプリケーションの場合、SQLインジェクション、クロスサイトスクリプティング、セッションハイジャックなど、よく知られた攻撃は確実に避けられるべきである。

図II-20-3. インジェクション攻撃への対策

【解説】

1) Webシステムの潜在的危険性

* Webシステムは、CGIやSSIといった、ユーザが実行できるプログラムを含むことができる。プログラムが脆弱であったり、不適切なパーミッションであれば、悪意のある者が任意のプログラムを実行できてしまうことがある。

* Webシステムの使用するディレクトリツリーは、適切な所有権とパーミッションを設定し、不用意にCGIやSSIの実行を許可するべきではない。

2) Webアプリケーションの脆弱性

* 多くのWebアプリケーションは、HTMLのフォームに入力された値をGETまたはPOSTメソッドで受け取る。受け取った値について十分な検証が行なわれるべきである。

* Webアプリケーションの実体がシェルによるCGIであったり、Webアプリケーションから外部プログラムを起動していたり、SQLでデータベースに問い合わせを行なっているような場合、悪意のある者によって任意のプログラムが実行されたり、不適切な情報を取得されたりすることがあり得る。これらについて十分に対策を施す必要がある。

* Webアプリケーション内で、バッファオーバーフローを発生させるような関数を使用するべきではない。よく知られたバッファオーバーフローを発生させる関数には、gets(), strcpy(), getwd(), scanf(), sprintf()などがある。

* PerlやPHPを使用しているからといって、バッファオーバーフローの問題を無視してよいわけではない。これらの言語が内部的にC言語のgets()やstrcpy()を使用する拡張関数を定義する場合はとりわけ注意が必要である。

3) パターン化されたWebアプリケーションへの攻撃

* Webアプリケーションの受け取るリクエストパラメータの値に巧みに制御文字を含ませることにより、任意のOSコマンドを実行したり、任意のSQL文を発行することが可能である。これらは、OSコマンドインジェクション、SQLインジェクトションとして知られる。

* インジェクション攻撃は、Webアプリケーション内で、リクエストパラメータの値に対してサニティチェックを行い、無害化することで避けることができる。具体的には制御文字を含むかどうかを検査し、含んでいる場合はエスケープ処理により無害化するか、アクセスを禁止する。

* リクエストパラメータの値を適切に無害化しないことによる被害は他にもある。JavascriptやJavaアプレット、ActiveXのコードを起動するコードの書かれた値がリクエストパラメータとして送信され、サーバ側で無害化を行なわずにブラウザにそのまま入力値を表示することにより、ユーザのブラウザ上で悪意のあるスクリプトが実行される。この手口はクロスサイトスクリプティング(XSS)として知られる。

* XSSによる具体的な被害として、セッションハイジャック、フィッシングなどが挙げられ、被害は利用者側に及ぶ。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。