脆弱性とは、コンピュータのOSやソフトウェアにおいて、プログラムの不具合や設計上のミスが原因となって発生した情報セキュリティ上の欠陥のことを指します。本稿では、主なWebアプリケーションの脆弱性について解説します。
SQLインジェクション
SQLインジェクションとは、データベースサーバ(DBサーバ)と連携するWebアプリケーションにおいて、攻撃者が入力した文字列によって、DBサーバが誤動作または不正操作されてしまう脆弱性です。
Webアプリケーションは、利用者から入力情報を基にSQL文を生成しますが、入力された文字列の特殊文字が含まれていた場合に適切に処理しないと、DBサーバはそれをSQL文と解釈して、想定外の動作を起こすことが考えられます。
発生しうる脅威
SQLインジェクションで発生しうる脅威は以下になります。
- データベースに蓄積された非公開情報の閲覧、情報漏洩
- データベースに蓄積された情報の改ざん、消去
対策
SQLインジェクションの対策は以下になります。
- SQL文の組立てはプレースホルダで実装
プレースホルダでは、機械的な処理でSQL文が組み立てられるので、SQLインジェクションの脆弱性を解消できます。 - SQL文の組立てを文字列連結により行う場合はエスケープ処理
値を文字列型として埋め込む場合は、SQLの文法上特別な意味を持つ記号文字をエスケープ処理(無害化処理)を行います。 - Webアプリケーションに渡されるパラメタにSQL文を直接指定しない。
OSコマンド・インジェクション
OSコマンド・インジェクションとは、外部からの攻撃により、WebサーバのOSコマンドが不正に実行されてしまう脆弱性です。特に、外部プログラムを呼び出す関数等を使用しているWebアプリケーションは注意を要します。
発生しうる脅威
OSコマンド・インジェクションで発生しうる脅威は以下になります。
- サーバ内ファイル漏えい、改ざん、削除
- 不正なシステム操作、不正なプログラムの実行
対策
OSコマンド・インジェクションの対策は以下になります。
- シェルを起動できる言語機能の利用を避ける
- シェルを起動できる言語機能の利用する場合は、引数の文字の組み合わせにを制限する(ホワイトリスト化)
クロスサイト・スクリプティング
クロスサイト・スクリプティングとは、Webアプリケーションに不正なスクリプトを埋めこむことができてしまう脆弱性です。この不正なスクリプトの埋め込みは、利用者が悪意のあるWebサイトをクリックすることなどで実行されてしまいます。
さらに、その不正なスクリプトが埋めこまれたWebサイトに利用者がアクセスすると、利用者のブラウザ上で不正なスクリプトが実行され、情報漏えいなどの原因となります。
発生しうる脅威
クロスサイト・スクリプティングで発生しうる脅威は以下になります。
- Webサイトの改ざん
- フィッシング詐欺による重要情報の漏えい
対策
クロスサイト・スクリプティングの対策は以下になります。いずれも、不正なスクリプトを読み込まないための措置になります。
- Webサイトに出力する全ての要素に対し、エスケープ処理(無害化処理)を施す
- URLを出力するときは、「http://」や「https://」で始まるURLのみ許可する、または、URLにスクリプトを埋めこまれないようホワイトリスト化する
- Webページに出力する <script>…</script> 要素の内容を、外部からの入力で動的に生成しない
- スタイルシートを任意のサイトから取り込めるようにしない
- HTTPレスポンスヘッダの Content-Type フィールドで文字コード(charset)を指定する
- HTMLテキストを入力する場合は、構文解析を行い、ホワイトリスト化する
クロスサイト・リクエスト・フォージェリ
クロスサイト・リクエスト・フォージェリ(CSRF)とは、Webサイトにログイン中の利用者からリクエストについて、それが利用者が意図したリクエストか識別する仕組みを持たないことによる脆弱性です。
攻撃者により用意された罠により、利用者が意図しない処理を実行されられた場合、その攻撃を受けてしまう可能性があります。
発生しうる脅威
クロスサイト・リクエスト・フォージェリで発生しうる脅威は以下になります。
- ログイン後の利用者のみが利用可能なサービスへのアクセス
- ログイン後の利用者のみが編集可能な情報の改ざん、情報漏えい
対策
クロスサイト・リクエスト・フォージェリの対策は以下になります。いずれも、重要な処理を実行する際の、利用者のなりすましを防ぐための措置になります。
- POSTメソッドを使って hidden パラメタに秘密情報を入れて渡し、処理の際にはその秘密情報が正しいか確認する
- 処理を実行する直前のページで再度パスワード入力を求める
- Referer が正しいリンク元かを確認する
バッファオーバーフロー
バッファオーバーフローとは、プログラムが入力されたデータのサイズを適切に処理しないことで、プログラムが確保したメモリの領域を超えて、領域外のメモリが上書きされてしまう脆弱性です。
特に、バッファオーバーフローは、CやC++、アセンブラなど、直接メモリを操作できる言語が使われている場合に起り易くなります。
発生しうる脅威
バッファオーバーフローで発生しうる脅威は以下になります。
- 意図しないプログラムの異常終了
- バックドアの設置、他のシステムへの攻撃など悪意のあるプログラムの実行
対策
バッファオーバーフローの対策は以下になります。
- 直接メモリにアクセスできない言語を使う
- 直接メモリをアクセスできる言語を使う場合は、最小限にする
セッション・ハイジャック
セッション・ハイジャックとは、セッション管理に不備により、攻撃者にセッションIDが不正に取得(ハイジャック)されてしまう脆弱性です。これにより、攻撃者による利用者のなりすましが行われる可能性があります。
発生しうる脅威
セッション・ハイジャックで発生しうる脅威は以下になります。
- ログイン後の利用者のみが利用可能なサービスへのアクセス
- ログイン後の利用者のみが編集可能な情報の改ざん、情報漏えい
対策
セッション・ハイジャックの対策は以下になります。
- セッションIDをURLパラメタに格納しない
- HTTPS通信で利用するCookieにはsecure属性を付ける
- ログイン成功後に新しくセッションを開始する
HTTPヘッダ・インジェクション
HTTPヘッダ・インジェクションとは、攻撃者により、HTTPレスポンスに任意のヘッダフィールドやボディを追加されてしまう脆弱性です。この攻撃は、HTTPレスポンスのヘッダが、外部から渡されるパラメタなどを利用して生成するWebアプリケーションで発生します。
これにより、そのHTTPレスポンスを受信した利用者のブラウザ上で、不正なスクリプトが実行される可能性があります。
発生しうる脅威
HTTPヘッダ・インジェクションで発生しうる脅威は以下になります。
- Webサイトの改ざん
- フィッシング詐欺による重要情報の漏えい
対策
HTTPヘッダ・インジェクションの対策は以下になります。
- Webアプリケーションの実行環境や言語に用意されているヘッダ出力用のAPIを利用する
- 改行を許可しないよう、開発者自身で適切な処理を行う
メールヘッダ・インジェクション
メールヘッダ・インジェクションとは、メール送信機能を持つWebアプリケーションにおいて、外部の利用者により、メールアドレスが自由に設定できてしまう脆弱性です。これにより、管理者が設定していない宛先にメールが送信される可能性があります。
発生しうる脅威
メールヘッダ・インジェクションで発生しうる脅威は以下になります。
- メールの第三者中継による迷惑メールの送信
対策
メールヘッダ・インジェクションの対策は以下になります。
- メールヘッダを固定値にする
- メールヘッダを固定値にできない場合は、Webアプリケーションの実行環境などに用意されているメール送信用APIを使用する
- HTMLで宛先を指定しない
パス・トラバーサル
パス・トラバーサルとは、攻撃者により、Webサーバ上の任意のファイルが指定されてしまう脆弱性です。これによりWebアプリケーションが意図しない処理を行ってしまう可能性があります。
発生しうる脅威
パス・トラバーサル発生しうる脅威は以下になります。
- サーバ内ファイルの閲覧、情報漏えい
- サーバ内ファイルの改ざん、削除
対策
パス・トラバーサルの対策は以下になります。
- 外部からのパラメタでWebサーバ内のファイル名を直接指定させない
- ファイルを開く際は固定のディレクトリを指定させる
クリックジャッキング
クリックジャッキングとは、利用者が意図しない操作(クリック)をするように、罠ページが仕組まれてしまう脆弱性です。利用者からは罠ページが見えて、罠ページ上のコンテンツをクリックしたつもりが、別のサイトのコンテンツがクリックしてしまう可能性があります。
発生しうる脅威
クリックジャッキングで発生しうる脅威は以下になります。
- ログイン後の利用者のみが利用可能なサービスへのアクセス
- ログイン後の利用者のみが編集可能な情報の改ざん、情報漏えい
対策
クリックジャッキングの対策は以下になります。
- 他ドメインのサイトからのframe要素やiframe要素による読み込みを制限する
- 処理を実行する直前のページで再度パスワードの読み込みを求める