今回はセッションに関連したぜい弱性について解説する。まずは,クロスサイト・リクエスト・フォージェリ(CSRF)を取り上げよう。
CSRFのぜい弱性とは,「サイト利用者が意図しないところで,何らかの情報変更を無理やり実行させられてしまう」問題のことである。例えば,「自分の名前で勝手にブログに書き込まれる」,「パスワードがいつのまにか書き換えられる」などといった問題が発生することになる。
攻撃は次のように実行される。
- ユーザーが,ターゲット・サイト http://target.example.com にログインする。
- http://target.example.comのサーバーが,ユーザーのブラウザにクッキーをセットする。
- ユーザーが,メールによる誘導などによって,罠を仕掛けられた攻撃者のサイト http://attacker.example.com にアクセスする。
<body onload="document.form.submit();"/>
<form name="form" action="http://target.example.com/addComment" method="post">
<input type="hidden" name="entry_id" value="12345"/>
<input type="hidden" name="comment" value="HelloHello"/>
</form>
図1●クロスサイト・リクエスト・フォージェリのぜい弱性を突いた攻撃の例 |
例に挙げた罠は,ページが読み込まれたら勝手にターゲット・サイトにコメントを書き込むという攻撃コードである。この罠は攻撃者のサイト上にしかけられ,ユーザーが攻撃者のサイトにアクセスすることで発動する。ターゲット・サイトへの入力コメントは攻撃者からではなく,ユーザーのブラウザから勝手に送られる,ということに着目してほしい。入力コメントを送る際には,ブラウザからクッキーを送るため,サーバー側では正当なユーザーからのアクセスだと判断して処理を続ける。
攻撃の内容が,例として挙げた「ブログへの意図しないコメントの書き込み」程度なら,さほど大きな被害をもたらすものではない。ただ,この攻撃は以下の特徴を持つことから,甚大な被害をもたらす可能性があることを認識しておきたい。
・インターネット上に公開されていないアプリケーションも攻撃の対象となるx
(例えば,開発環境上で動作する管理画面や,ルータの管理画面など)
・ベーシック認証により管理されているアプリケーションも攻撃の対象となる
(ベーシック認証情報が送信される条件はクッキーが送信される条件と類似している)
・罠にかかったユーザーの権限が高いほど被害は大きくなる
第1回で説明したクッキーのexpires属性が指定されていると,この攻撃が成功する可能性が高くなる。この場合,ブラウザが起動されている必要はないから,インスタント・メッセンジャーなどで送られたURLのリンクを踏むだけで攻撃が成立する可能性がある。
対策
この攻撃が成立してしまう要因は,「正常な通信と,罠経由での通信に違いがない※1」ことである。逆に言えば,対策は「正常な通信と,罠経由での通信に差分を発生させる」ことである。例えば,「攻撃者が推測できない値を,処理実行のために必要な値として含める」ことで実現できる。
1.処理完了の前画面へのアクセス時に,クライアントにひも付けたランダムな値(トークン)を発行する(図2)
2.その値をhiddenに含め,処理完了時画面へのアクセス時に送信させる
3.処理完了画面では,送信されてきたトークンが正しいものであることを,処理実行前にチェックする
図2●利用の都度変わるTokenを利用すればCSRFの攻撃は防げる |
この際,クライアントにひも付けたランダムな値を,クッキーで管理してはいけない。クッキーはブラウザによって自動的に送信されるから,この対策は意味を持たない。トークンとして,アプリケーション全体で同一の値を使わないようにすることも大切だ。攻撃者にとってその値が既知のものとなってしまうと,正常な通信と,罠経由での通信に差分を発生させる要件が満たせなくなる。
次回は,もう一つの代表的なぜい弱性であるセッション・フィクセーションについて解説する。
|