第4章 セッション対策
セッション乗っ取り:#4 セッションIDのお膳立て
セッションIDのお膳立て
セッションIDのお膳立ては、Webアプリケーションのセッション乗っ取りの際に攻撃者が用いる手口のひとつである。
Webセキュリティを説明するサイトや文献等では、「セッションフィクセーション(session fixation)」、「セッションIDの強制」、「セッションIDの強要」等と表現されることがあるが、ここでは、「セッションIDのお膳立て」として説明する。

セッション乗っ取りは、正規ユーザが現在用いているセッションIDを別の人物(攻撃者)が行使し、ユーザ本人にのみ可能なはずのWebアプリケーション操作を勝手に行ってしまうものである。その結果、クレジットカード番号の盗み出し、無断の買い物、コミュニティからの退会、他ユーザへの犯罪・迷惑行為等、各種の被害が生じ得る。
セッション乗っ取りのためには、攻撃者は正規ユーザのセッションIDを掌握する必要があるが、そのための手口は大きく3つに分かれる。
- セッションIDの推測
現在使われている見込みのあるセッションIDをいくつも生成し、試行錯誤する - セッションIDの盗み出し
現在使われているセッションIDをネットワーク盗聴やスクリプト注入攻撃を用いて入手する - セッションIDのお膳立て
有効なセッションIDを攻撃者の側が用意し、それを被害者に使わせる
この第3の手口が「セッションIDのお膳立て」である。
セッションIDお膳立てのメカニズム
セッションIDのお膳立ては、次のようにして成立する。
(1) 隙のあるWebアプリケーションエンジン
セッションIDはWebサーバ側が発行してブラウザに預け、Webサーバへアクセスするたびにその値をブラウザが送り出すのが原則である。ところが、WebアプリケーションやWebアプリケーションエンジンの中には、自分が発行したものではないセッションIDの値をブラウザが送ってきても、それを有効なセッションIDとして許してしまう機能(セッションアダプション)を備えるものがある。
その中の代表格はPHPの処理系である。例えば、下記の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 のお膳立て手口によるセッション乗っ取りが生じ得る。