第4章 セッション対策
セッション乗っ取り:#4 セッションIDのお膳立て

セッションIDのお膳立て

「セッションIDのお膳立て」は、Webアプリケーションのセッション乗っ取りの際に攻撃者が用いる手口のひとつである。

ちなみにWebセキュリティを説明する他のサイトや文献等においては、「セッションフィクセーション(session fixation)」、「セッションIDの強制」、「セッションIDの固定化」等と表現されることがある。

セッションIDのお膳立て
図4-7: セッションID のお膳立て

セッションの乗っ取りは、正規ユーザが現在用いているセッションIDを別の人物(攻撃者)が行使し、ユーザ本人にのみ可能なはずのWebアプリケーション操作を勝手に行ってしまう行為である。その結果、クレジットカード番号の盗み出し、無断の買い物、コミュニティからの退会、他ユーザへの犯罪・迷惑行為等、各種の被害が生じうる。

攻撃者がセッションを乗っ取るためには、正規ユーザのセッションIDを掌握する必要があるが、そのための手口には次の3つがある。:

この3番目がセッションIDの「お膳立て」と表現した「フィクセーション(fixation)」の意味合いである。

セッションIDのお膳立てのメカニズム

セッションIDのお膳立ては、次のようにして成立する。

(1) 隙のあるWebアプリケーションエンジン

セッションIDはWebサーバ側が発行してブラウザに預け、Webサーバへアクセスするたびにその値をブラウザが送り出すのが原則である。ところが、WebアプリケーションやWebアプリケーションエンジンの中には、自分が発行したものではないセッションIDの値をブラウザが送ってきても、それを有効なセッションIDとして許してしまう機能(セッションアダプション:session adoption)を備えるものがある。

それらのひとつとして、PHPの5.5.2未満が挙げられる。例えば、下記のURLのように、明示的にPHPSESSIDパラメータを付けてリクエストを送ってみる。

http://foo/bar.php?PHPSESSID=3333

すると、このリクエストに対する応答のヘッダには下記の内容が含まれる。

Set-Cookie: PHPSESSID=3333; …

つまり、ブラウザから与えた値がセッションIDとして採用されてしまう。

攻撃者は上記のセッションIDを仕込んだハイパーリンクをクリックさせることによって、被害者を罠にかけることができる。このセッションIDが使われたままユーザがログイン手続きを行うと、攻撃者もそのユーザのプライベートなページを見て回る機会を得る。

(2) 堅いエンジンにも攻撃は可能

多くの処理系では、ブラウザが勝手にセッションIDパラメータの値を送ってきても、それを正規のIDとして受け付けないことが多い。しかし、それでも「セッションIDのお膳立て」攻撃は生じうる。

攻撃者自身がWebアプリケーションから正規にセッションIDの発行を受けておき、そのIDの値を罠のハイパーリンクやスクリプト注入等の手口で被害者のブラウザ上のCookieに送り込むのである。

Webアプリケーションにスクリプト注入脆弱性が残っている場合、例えば、攻撃者は、次のような文字列がWebページに埋め込まれるように仕組んで被害者のブラウザのCookieに値を設定する。

<script>document.cookie="sessionid=foobar"</script>

セッションIDのお膳立て対策

攻撃者による「セッションIDのお膳立て」に対抗するには、「セッションIDの付け替え」を行うのが有効である。 この方法は、ユーザがログインに成功した時点でまったく新しいセッションIDを発行し、それまでのセッションIDを無効にするというものである。

ユーザ認証とセッションを取り扱うWebアプリケーションには、この「セッションIDの付け替え」の実装を強く推奨する。 また、「スクリプト注入」に対する対策は、「セッションIDのお膳立て」対策としても必要不可欠である。

事例: アプリケーションエンジンの脆弱性

その後ベンダーによって対策が施されているものの、2004年 9月にはMacromedia JRunにセッションIDお膳立ての脆弱性が報告されている。それまでのJRunは、ブラウザから送られてくるセッションIDパラメータ JSESSION の値を無条件で受け入れてしまっていた。(CVE-2004-0646

この脆弱性に対策を施さないままの Webサイトでは、セッションID のお膳立てによるセッションの乗っ取りが生じうる。