平成23年秋 応用情報技術者試験 午後 問9
問9 Webアプリケーションのセキュリティ対策に関する次の記述を読んで、設問1〜4に答えよ。
W社は、インターネット上で日用雑貨品の会員制通信販売システムを運営する会社である。この通信販売システム(以下、本システムという)は、商品検索、注文、会員管理、会員掲示板などの機能を提供する。
本システムの機能を利用するには、あらかじめ会員管理機能を使って、会員登録しなければならない。
図1は、会員掲示板機能を使った会員掲示板画面の例である。
ある日、会員情報が知らぬ間に書き換わっていたり、覚えの無い商品が届いたりしたとのクレームが複数の会員から寄せられた。情報システム部門で本システムを調べたところ、クレームに該当する登録情報の変更処理や商品の注文処理が確認された。
情報システム部門の責任者であるA部長は、セキュリティ事故が発生したと判断して、本システムの利用を直ちに停止し、外部のセキュリティ専門会社の支援を受けながら対策をとることを指示した。
後日、外部のセキュリティ専門会社から、今回のセキュリティ事故に対する調査報告書が届けられた。調査報告書に記載された内容は、次のとおりである。
〔セキュリティ事故の経過〕
(1)会員Xは、本システムのトップ画面から、会員ログインページのボタンを押した。
(2)本システムは、ログイン画面を表示した。
(3)会員Xは、ログイン画面で、自身のアカウント名とパスワードを入力した。
(4)本システムは、アカウント名とパスワードを確認して、セッションIDを発行し、cookieを利用して会員のブラウザに戻した。
(5)会員Xは、会員メニュー画面で、会員掲示板機能を選択した。
(6)本システムは、会員掲示板画面を表示した。
(7)会員Xが、特定の会員掲示板ページを参照したときに、悪意のあるコードが自動的に実行され、会員Xの登録情報を書き換える処理と、注文処理が行われた。
〔想定される原因〕
(1)会員掲示板ページを出力する処理に問題があり、この問題を悪用した<script>タグを用いた悪意のあるコードが、会員掲示板ページに埋め込まれた形跡があった。
(2)ログインした会員が、この悪意のあるコードが埋め込まれた会員掲示板ページを参照すると、そのコードが自動的に実行され、会員の登録情報を書き換える処理や特定の商品の注文処理が行われるようになっていた。
〔原因から想定される脅威〕
(1)登録情報や会員掲示板情報に対して、ログインした会員が予期しない処理を勝手に実行させられることによって起こる情報の改ざん
(2)ログインした会員が予期しない注文処理を勝手に実行させられることによって起こるサービスの悪用
〔対策の提言〕
(1)入力された文字列は、そのままではなく、エスケープ処理を適切に施してからブラウザに表示する。入力データに”<”、”>”、”&”などのHTMLの特別な記号文字が存在した場合、その記号文字が有する特別な働きを無効にする文字や文字列に置き換える。例えば、”>”は”>”、”<”は”<”、”&”は”&”とする。これによって、タグの文字列”<script>”は、文字列”<script>”に書き換わる。
<script>タグを用いたコードにエスケープ処理を適切に施す目的:scriptタグを無効にする。/悪意のあるコードを実行させない。
HTMLでは、<script>タグ内の文字列はプログラムと認識され自動的に実行されます。
これを悪用すると、例えば、攻撃者が掲示板の投稿に<script>タグと不正コードを入力すると、その投稿を表示したブラウザで不正コードが実行されてしまいます。
エスケープ処理を施すことで、不正コードが含めていてもブラウザ上では文字列と認識されるため、スクリプトとして実行されることが無くなります。
(2)特に、会員情報の登録処理や注文処理のような重要な処理を実行するページには(a:POST)メソッドでアクセスするようにし、そのhiddenパラメタに秘密情報(ページトークン)が挿入されるように、前のページを自動生成する。実行ページでは、その値が正しい場合だけ処理を行う。もし(a:POST)メソッドの代わりに(b:GET)メソッドでアクセスすると、秘密情報をURLに付加して送信することになるので、ここでは利用を避けるべきである。また、HTMLフォームで<form>タグを用いる場合、メソッド属性の指定を省略すると(b:GET)メソッドと解釈されるので、適切に指定する必要がある。
HTTPでサーバにリクエストを送信して、結果を得るために使用されるメソッドにはGETとPOSTがあります。
- GET:最も基本的なメソッドで、URLの後ろにファイルやプログラムの内容を付加して送信する。
- POST:パラメタはURLではなく、HTTPリクエストのメッセージボディ部に格納して送信する。
GETメソッドでは、URL上でパラメタが見える状態にあり、秘密情報の取得や、パラメタの改ざんされる可能性が高くなります。このため重要データの送信の際は、POSTメソッドを使うべきです。
また、入力データは<form>タグで送信することも可能ですが、指定しない限り、GETメソッドで送信してしまいます。POSTメソッドで送信するには、属性値(method=”POST”)を設定する必要があります。
今回のように、ログインした会員だけが、予期しない処理を実行させられてしまうセキュリティ攻撃は、クロスサイトリクエストフォージェリーと呼ばれている。
この攻撃が成功する主たる要因は、会員の正しい要求と悪意のあるコードの要求を区別できないことである。
この後、A部長は、外部のセキュリティ専門会社の提言に従い、今回のセキュリティ攻撃の根本的な原因を解消すべく、本システムの改善を行うことにした。
提言された対策(1)を本システムの全てのプログラムに適用し、その上で重要な処理を行う注文機能と会員管理機能に対して、提言された対策(2)を適用した。会員登録時における本システムと会員のブラウザとの間の情報の流れは、図2のとおりである。
【出典:応用情報技術者試験 平成22年度秋期午後問9(一部、加工あり)】
秘密情報(ページトークン)を送受信する適切な箇所:④、⑤
クロスサイトリクエストフォージェリ(CSRF)は、Webブラウザで不正に操作する攻撃手法の一つで、利用者に偽装したURLを開かせることで特定のサイト上で操作を行わせる攻撃です。
会員制サイトなどログインやセッション管理を伴うWebアプリケーションにおいて、会員がログイン状態であるときに、意図しない不正な処理を行わせたりするのに利用されます。
対処方法としては本文に以下の記述があります。
会員情報の登録処理や注文処理のような重要な処理を実行するページにはPOSTメソッドでアクセスするようにし、そのhiddenパラメタに秘密情報(ページトークン)が挿入されるように、前のページを自動生成する。実行ページでは、その値が正しい場合だけ処理を行う。
この他にも、処理確定前に、パスワードの再入力や参照元情報の検証などの対処方法などがあります。
図2の処理の流れにおいて、処理実行のリクエストが行われる一つ前の確認画面で、秘密情報(ページトークン)をクライアントに送ります。クライアントで処理実行リクエストに秘密情報(ページトークン)を一緒に送ることで、適切な処理のみを行うようにすることができます。