セッション管理をinput[type="hidden"]等で行うことについて

input[type="hidden"]

セッション管理の方法として、input[type="hidden"]には、生のセッションIDをに突っ込めば良いのか、あるいはセッションIDと何かの秘密キーとを結合させた上で良いハッシュをかませた値を突っ込むのがベターなのか、あるいはワンタイムトークンが良いかもだとか、cookieも併用するのかもとか、いろいろあるのかもしれませんが、私にはよくわかりません。勉強したいのであちこちのぞいていますけれど。でも気になることもあるので以下、ちょっと日記に書いてみます。質問風味であって回答風味ではありません。

いわゆるCSSXSS

一応見出しなのでキャッチー【謎】にCSSXSSという名前を使いました。でも性質から考えるとちっともXSSじゃないのでCSSXSSという名前はもうやめにしませんかとこっそり思っています。既に、はやってしまったものは仕方がありませんが。Matan Gillon のイケズ。

SecurityFocusではMicrosoft Internet Explorer CSS Import Cross-Domain Restriction Bypass Vulnerabilityという見出しでこのバグを紹介しています。classはAccess Validation Errorです。う〜ん。CSSXSSよりもずっとマシな言い方なんですけれど。でも、CSS が Cross-Domain で Import 出来るの当たり前なので、それに対して Restriction Bypass っていうのは変です。そもそもそんな Restriction なんて、どのブラウザにもないのでは?存在しない Restriction の Bypass って何?という気分がして来ます。

Secunia では、Microsoft Internet Explorer CSS Import Disclosure of Sensitive Informationという見出しでこのバグを紹介しています。これ、GOOD!。この欠陥の本質は、CSS の替わりに Sensitive Information を import で盗られちゃいますよ?どうします?というものなんですよね。

悪人が用意した罠ページにIEユーザが訪問すると、複数の方法(4個以上ありそう)でユーザが大事にしている Sensitive Information が含まれたページを、CSSのimportで盗られちゃうというのがことの本質なんですよね。Basic認証に守られていたページとか、本人がログインしなきゃ見れない管理ページとかがターゲット。

CSS の import そのものは Cross-Domain で出来て当たり前。CSS じゃないものまで import しなさんなよ、ダンナ?というのがこの欠陥。どうです?どこかにスクリプティングが出てきましたか?HTMLの挿入やスクリプトの挿入を行うなどのイメージが強いXSSでしょうか?全然違うでしょ?ですから、CSSXSSという名前はおかしいのです。

さて、IECSSだと思い込んで、大事な秘密情報ページを盗んでくれちゃうわけなのですが、ここまでは、実は、javascript オフでも、別途定めるスタイルシートオフ【謎】でも、実行されちゃいます。IEのこの欠陥の本質にはスクリプティングは全然関係ないわけです。ブラウザサイドには悪人が欲しがる情報が一応取り込まれるわけです。しかも取り込まれて蓄積されているページのドメイン(サイト)は悪人が用意したサイトのものです。罠ページを訪問している最中の出来事ですからしょうがないですね。

さて、以上でIEの欠陥を突いた攻撃は既にお終いです。盗み行為は完了。なので後処理なのですが。悪人が欲しがる情報はブラウザの DOM に蓄えられています。ここで悪人は JavaScript を使って DOM から私たちの貴重な情報を取り出し、どこかのサーバにその情報を投げることでしょう。もしくは、JavaScript を使わなくとも DOM さえ制御出来れば良いのですから、他のテクニックを使うかも知れません。例えば Javaアプレットで DOM を制御しても良いのかも知れません。この後処理の段階では悪人は特にIEの欠陥なり脆弱性なりを使う必要はありません。

以上で見てきたように、いわゆる CSSXSSXSS ではありません。大事なことは、IEには欠陥があって、CSSの替わりにあたなだけの秘密情報のページをimportしてしまうことなんです。

以上には説明の省略があります。秘密情報のページとは言いましたが、HTMLそのものであったり、JSファイルかもしれませんし、XMLファイルかもしれません。とにかくプレインなものはなんでも盗られます。この意味で、Secunia曰くの、Microsoft Internet Explorer CSS Import Disclosure of Sensitive Information という呼称は実に適しています。

input[type="hidden"]と、いわゆるCSSXSS

CSSXSSで、ログイン中のあなただけが閲覧可能な情報をimportされてしまったらどうなることでしょう。例えば、input[type="hidden"]の内容物も盗まれえます。セッション管理の上で重要なものですから、一刻も早くIEの欠陥、CSSXSSは修正されなければいけないことでしょう。安心してよいサイトは、input[type="hidden"]にナマのセッションIDを入れていないサイトであるというおかしな事態になっているような気がします。なお、CSSXSSではCookieは盗まれないというのが基本性質です。Cookieだけでセッション管理していれば大丈夫なのかというと、それはまた別のお話しです。

話題は一転、CSS3 と input[type="hidden"]

実は以上で書いてきたのは前フリだったりします。ここからが本日巡回しながら読んでいてビックリし日記にしたためておこうかとしたもの。

Firefoxの中の人の中野さんの「もずはっく日記」ボタンの並び - WebStudioを読み返していたら、以下のような文が。

そもそもセッション管理をinput[type="hidden"]等で行うべきではない。改竄が容易というのもあるし、もしCSS3のcontentappearanceが実装されると、簡単にブラウザ上にこの要素をinput[type="text"]のように表示してデータを変更して送信し直せる可能性が高いからだ。Cookieなら改竄できないかというとそういう訳ではないが、CSS3のこれらのプロパティはWebアプリケーションにとっては、驚異的である。また、単純に、リンクをページ間の移動手段として使えなくなるinput要素によるセッション管理は作り手にとって不便といわざるをえない。

ぎょぎょぎょ、です。どうなる近い将来のセッション管理?

追記:中野さんの「もずはっく日記」は通常、IEではダウンロードになってしまいます。これは仕様を満たしていないIEがおかしいのです。application/xhtml+xml に対応していないんですね、IEは。なお、ウワサによればIE7でもこのままであるそうですが。