萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

CSSXSSについて理解していなかった模様

これならわかる不正アクセス対策 入門の入門』でCSRF対策について取り上げたのだけれど、その内容が間違っているという指摘を『開発者のための正しいCSRF対策』という文章で受けた。僕が紹介したCSRF対策は、セッションIDをHIDDENで埋め込んでそのセッションIDを「ひとりひとりの別のパラメータ」として使うことで、「あるURLに対して、同じ内容のパラメータでリクエストを送信すると、そのリクエストを誰が行っても、リクエストが処理されてしまう」ことを利用したCSRFという攻撃を無効化してしまおうというものだった。「セッションIDの推測が困難であるという前提に問題さえなければ、これで、CSRF攻撃はできなくなる」と書いたけれど、CSSXSS脆弱性を使うとこの前提に問題が発生してしまうようだ。CSSXSSについてはCSS脆弱性ぐらいにしか思っていなくてきちんと理解していなかったのだけど(恥)、Webページ中の任意の情報を悪意を持った人間が取得することができる脆弱性で、つまるところHIDDENにセッションIDなんか入れちゃうと、CSRF対策してるつもりがセッションIDを抜かれて、セッションハイジャックされちゃうよということだ。

じゃあどうしたら良いんだろう。

開発者のための正しいCSRF対策』ではワンタイムトークンを正しく使うという解決策が書かれているのだけれど、正直これはちょっと面倒である。ので、僕としては、生のセッションIDをHIDDENという見られるかもしれない領域に入れたのが問題ということで、「セッションID+ヒミツな文字列」にMD5かまして抜かれても困らない、かつセッションIDと密接に結びついた文字列を生成して、それをトークンとして使うという方法を提案したい。MLがあるようなのでお礼もかねてこういう対応策だとどうなのか投げてみよう。

あとあれだ、編集者に連絡して、正誤表的なものを作れるか聞いてみなきゃ。