| « またNHKニュースでウィルス | PEAR AUTHのSQLインジェクション » |
クロスドメインのHTML読み取り(IEのバグ CSSXSS)とCSRF
追記:このブログを記載する理由となったURLを記載された方が内容を削除されたようです。「間違っている」と言われるのは心外である、と思ったことは確かですがページの内容が削除されるのは私の本意ではありません。書かれていた情報はとても役に立つ情報だと思います。非常に残念なので再度掲載されることを望みます。(本当
-----
セキュリティ対策ではよくあることですが、条件の見落としによりセキュリティ対策を行っていても脆弱性が発生することがあります。「Webアプリセキュリティ対策入門」に書かれているCSRF対策にも「クロスドメインのHTML読み取り(IEのバグ)」の問題が修正されていない為、書籍に記載した対策を行ってもバグを持つIEに対してはCSRFに脆弱になります。
しかし、このバグの影響を持って「Webアプリセキュリティ対策入門」のCSRF対策を「間違った対策」と書かれても困ります。妥当な表現はバグがあるブラウザに対して「不十分な対策」ではないでしょうか。
このブログを書くきっかけは以下のURLです。
http://www.jumperz.net/texts/csrf.htm
問題点を整理してみます。(IEのCSSXSSバグ問題として知られる問題)
IEはスタイルシートとしてCSS以外のファイル、例えばHTMLファイル、を外部サイトから読み込めてしまうバグがある。
↓
つまり、HTML等に埋め込まれた情報は第三者のサイトから盗む事が可能となる。
↓
つまり、HTML等に秘密情報(トークン等)が記載されていると意図しないフォーム送信(CSRF)を行える。
同じくIEのバグが原因のXST(Cross Site Tracing)に似ている問題と言えると思います。
汎用性(複数のページを開いている場合)の考慮はされていませんが
http://www.jumperz.net/texts/csrf.htm
に利用可能な対策が紹介されています。重要なのは以下の2つです。
- HTMLにトークン(フォーム送信を一意に特定できる値)を書かない
- トークンをセッションIDと紐付ける
この2つを実行することでIEのバグを回避し、CSRFを防止することがWebサイト側で可能になります。
ところで、この問題の本質はセキュリティの基本中の基本であるCIAをブラウザが守れない事に原因があります。(Confidentiality, Integrity, Availavility - の内のConfidentiality(機密性)が守られていない。)マイクロソフトも直すつもりはあるようで
http://d.hatena.ne.jp/hoshikuzu/20051204#P2005204MATANGILLON
に、直すつもりがある旨が記載されています。実際現在のIEはCSSファイルのように見えなければHTMLの中身が読み取れない状態らしく半分直した(?)ような状態になっているようです。(前にSJISは使わない方が良い、とブログで書きましたがこの件でもSJISをページのエンコーディングに使うのは危険なようです)
jumperz.netの対策はバグを持つIEユーザ向けCSRFの対策としては使用できますが、ページに表示されている情報を盗み見れて困るのはCSRF(CSRFの場合、hiddenタグのトークン情報)だけではありません。様々な情報には他人に見られるだけでも困る物も多くあります。例えば、メールや銀行/証券/保険会社の口座情報を広く公開しても気にしない、と言う人は少ないと思います。
セッションIDをページに記載する手法は、キャッシュ制御をしっかりしないとプロキシ等のキャッシュ(どんなヘッダを送ってもキャッシュする、しないはプロキシ次第ですが)にセッションIDが記録されるので簡易な対策として紹介しています。この方法はCSRF対策を行っていないアプリが、普通のブラウザと環境においてCSRF対策を行う場合、問題も少なく、最も対策が簡単だからです。
本来外部サイトのHTMLページはコンフィデンシャルな情報であり、それが守れない状態であるIEが根本的な問題です。重要な情報をページに表示できないのであれば、重要な情報を表示するアプリはインターネットに公開する事はできません。
CSRFだけ考えても、数え切れないほどの開発者が開発しているWebサイトより、MSが開発しているIEのバグを直す方が速いのは明らかと思います。この手のバグに対する対処は仮りに書籍に書くとしても注意事項として小さく書く程度が限界かと思います。出版した頃にはもう解決済みの問題となっている可能性も高いですから。このあたりは紙メディアの限界ですね。
マイクロソフトはPassportアカウントのメールアドレスがvbscriptでどのサイトからでも参照できるバグを長期間放置していた実績があり、今回のバグが長い間放置される可能性も少なくありません。もしかしてIE7では直っている、とアドバイザリを出すつもりなのかも知れません?!火が付けばパッチ出す!?と言うことで、広く知れた事なので騒ぐが勝ちかも知れません。
とは言っても、MSは昨年に分かっていた問題に対して未だに完全なパッチを提供していない事は事実なようです。このような状況ではWebサイト側でも対策しないとMSがいつ対応してくれるか分かりません。情報を盗み見られるも困りますが情報を改竄される方が大きな被害である事に議論の余地は無いと思います。jumperz.netにはクッキーとJavaScriptを使った対策が紹介されていますが、これにはもう少しスマート(汎用的)なやり方もあります。
JavaScriptの使用を前提とするなら「Webアプリセキュリティ対策入門」書かれているフォームID(フォームのトークン - hiddenタグに記載)とセッションID(クッキーに保存)でMD5でメッセージダイジェストを取り、フォームにセットして送信します。サーバ側ではCSRFが行われていないかメッセージダイジェストを比較するロジックを追加するだけでOKです。この手法の場合、複数のページを同時に開いても問題無く処理でき、同じフォームの複数回送信も防げます。
作業量はさておき、この変更自体は簡単ですよね? フォームの方はhiddenタグの追加と簡単なJavaScriptを追加するだけ、サーバ側はMD5の値を作って追加されhiddenタグと値を比べるだけです。hiddenタグの値が無い場合は、CAPTCHAまたはパスワード入力方式にfallbackしても良いかも知れません。本を読んだ方でこの説明で対処方法がよく解から場合はコメントをお願いします。
# MD5関数はJavaScriptにはありませんが、探せば沢山実装が見
# 付かります。
#
# 個人的には、自前のフォームクラスを使っているアプリの場合、
# 上記の修正を加えるにはを少しフォームクラスを修正するだけ
# で対応できました。
#
# ところで.NET ASPで作ったWebサイトはViewState等の為(?)
# このIEのバグによるCSRFの影響は受けないのでしょうか?
# MSの腰が重い理由はこのあたりあるのかな?と疑いを持って
# いる次第です。識者の方、コメント頂ければ幸いです。
Web開発者としては過去のブラウザバグまで考慮して開発するのは困った物です。ユーザとしてもJavaScriptとクッキーを使ったフォーム送信がデフォルトになるとFirefoxのNoScript拡張を使っていると面倒が一つ増えます、IEでもActiveScriptを無効に設定している人も同じ面倒が増えます。仮りにIEのバグが直ったとしてもまた同じ問題が他のブラウザや新しいIEでも発生する事も考えられます。直したハズの問題がまた表れるのもよくある事です。
多分少しするとIEのバグも修正されると思います。JavaScriptとクッキーを使ったCSRF対策を次の書籍等の著作物に入れるべきなのか、省略すべきなのか、悩ましい所です。
蛇足:
Session IDのクッキーに非標準のHttpOnly属性を使いたい方は、Sessionを初期化する場合に別のCSRFチェック用のHttpOnly属性無しクッキーを初期化して使用します。
蛇足2:
時々「IEを使うのは止めときましょう」と、このブログにも書いていますがこの問題もIEを使わない理由の一つですね。2004年はIEが安全に使えた日は7%日しかなかったという調査もあります。2005年は多少まし(?)かも知れませんが、2006年は2004年に似たような数値になるのかも知れませんね。
http://blog.ohgaki.net/index.php/yohgaki/2005/12/30/ie_firefox_opera_a_ca_a_afia
蛇足3:
PHPの透過的セッション管理(trand_sid)は利用しない、といつも言っていますがtrans_sidを行っているサイトの場合、フォーム送信ページをリクエストする事によりセッションIDを簡単に盗まれます... セッションIDをフォームに記載したCSRF対策も同様にセッションIDを盗まれます。念のため。
15 comments
多分、フレームワークの開発者は
「おい、おい。それアプリで見る(適切に前処理する)のが当り前だろう」
と思っていたに違いありません。
ところで、この問題の原因のIEのバグは直っていると思っていたら違ったのですね。情報収集が足りませんでした... サイトによってはCSRFも問題ですが、情報が見れてしまうだけでも大問題なサイトも多数と思います。そういったサイトは「IEは使わないでください」と警告するしか方法がありません。困った、困った...
# CSSファイルのように見えなければOKらしいので、HTML
# がファイルCSSのように見えるサイトは要注意です。
# 詳しくはブログ中のリンク先を参照してください。
修正:あまり適切でないコメント部分を削除しました。
# 私はそんなに素質のあるエンジニアと思っていないので
# 気になりません。と言うかこういう事を言われて「訴え
# てやる」と思うようであればセキュリティ対策本は書き
# ませんね。セキュリティの話は所詮「揚げ足の取り合い」
# ですから。
とにかく、ページの内容を削除する必要はないと思います。リスクが気になるようであれば書き方を多少修正する程度でリスクは無くなると思います。本当にこれくらいの事で訴訟になったりしたら有用な情報を書く方が減ってしまって困ります。ただし、コンピュータのリスク管理と同じで自分の文章や行動のリスク管理も行わないと万が一、という事もあり得えないとは言えません。それを少しだけ指摘したかったのですがやりすぎたようです。
CSRFにだけ焦点を絞ってしまったのであんな感じになったのだと思いますが、情報自体が掲載されないのは残念です。
内容をみていないのでわかりませんが、技術的文章への批判にたいして刑事責任で脅しをかけるというのは尋常ではないようにおもいます。
よほどひどいことを書かれたのでしょうか?
技術的な議論が萎縮しないよう、どのような経緯であったのかを明らかにしていただけないものでしょうか?
# フォローのつもりの安易に名誉毀損で訴えないように、というコメントもまずかったかも知れませんね
具体的には、セキュリティ対策では人を含むデバイスを正当な理由で信頼する事が必用になります。問題になっているケースで言うと、ブラウザはサイトAからサイトBのページが参照できてはならない仕様でなければなりません。セキュリティ対策としてサイトに表示されたページは機密情報であるとする前提条件がなければなりません。この前提条件は正当な物であると考えられます。正当でないとするとWebアプリケーションには機密性を必用する情報を表示してはならない事になります。
# ページ情報が機密として扱われる為には適切なHTTPヘッダに
# よるキャッシュ制御またはTLS/SSLが必用ですが説明を省略し
# ました。
ページを記載された方は「他のサイトのページは機密情報である」とするWebブラウザの前提条件が守られなかった結果として問題が発生しているにも関わらず「セッションIDをフォームに埋め込むCSRF対策は技術者として素質を疑う」とか「バグを前提としていないCSRF対策を間違った対策」とする旨の記述をされていました。この記述の仕方が危ないなと思った部分です。セキュリティ関係で仕事をしている方には不当な理由で「素質を疑う」とか書かれると仕事に差し障りが.... 名誉回復に.... となるようなことも(本当にあるとは思っていませんが)想定できると思った次第です。
ちょうどインターネット上で年間2万件以上の名誉毀損を含む人権などの侵害があると認知されていると言う情報を聞いた後だったので「2万件とは多く、自分も気を付けないとならない」と考えていました。それで最初のコメントになった、という事です。
お騒がせして申し訳ありません。
コメントの書き方を気を付けないとやはり「脅し」と取られる方も多いようですね。ウンチクのつもりだったのですけど(汗
XST(XSS+TRACEメソッド)によって、HTTPリクエスト・ヘッダが取れるかどうかは、IEのバグではないでしょう。
私の知る限りでは、XSTの語源は「Cross Site Tracing」という名称のホワイトペーパーにあります。(正式名称は調べてください。直ぐ見つかります)このホワイトペーパーにも記述されているように古いIEのXmlHttpRequestは「外部のサイト」にもリクエストが送信できました。この外部のサイトにリクエストが送信できたバグがCSSXSSに似ていると思います。
XSTについて「Webアプリセキュリティ対策入門」にも同じような説明を入れています。安易な追加機能(XmlHttpRequest)、Webサーバに通常不必要な機能(TRACEメソッド)をデフォルトで有効化して失敗した例として、それから比較的最近プロキシを使った場合のリスク(プロキシがTRACEメソッドに応答するかもしれない)も指摘されており同じ脆弱性が形を変えて再び問題となる例として、紹介しています。
XmlHttpRequestが外部サイトへリクエストを送信できなくなっている現状ではXSS脆弱性がないとXmlHttpRequest使った攻撃は出来ません。XST=XSs+Traceとする定義でも構わないとは思いますが紛らわしいのでお勧めできる定義ではないですね。既に一般化していますか?
この「削除(修正)したつもり」という部分もCSSXSSの問題に似ていると思います。
MSはパッチを作る場合に完全に修正するより、既存コードへの影響を最小限にする方針でパッチ作成をしているように思えます。インストールベースを考えると妥当と言える方針とは思いますが、修正したつもり、でも完全でない、というパターンは非常に多いですね。
思想、視点の違いだとは思いますが、私自身はWebアプリ開発者がWebブラウザのバグ(仕様ではなくてバグ)に付き合うのは優先度として低いのではないかと考えてます。
というのは、過去、Webブラウザのバグとして他のWebサイト上のScriptへCookieが漏洩するというバグ(これはIEからOperaからMozzilaまで幅広く出回りましたが)に対処して、Cookie保存式セッション管理を止めたという話はほとんど聞かないからです。
(それ以前に考慮すべきセキュリティが山のようにうずたかく積まれていますし、結局"「バグのない」Webブラウザのみ対応"としてしまえばいいですし)[なのでWebAppliの開発者の方々の多くはブラウザのセキュリティは責任範囲外だとおもっているのではないでしょうか]
一方でIEのバグというXSTというのがWebブラウザの仕様であるということであれば、XSS+Traceというテーマ以上に(バグは最新版で対処されますが仕様であれば永遠にそのままであるという理由で)尋常ならざるセキュリティ問題(仕様そのものがセキュリティ問題)となるでしょう。
と思いました。
(ブログのコメントはいろいろな意味で書きにくいですね)
しかし告訴状を受理する義務はありません。
なので民間人が告訴状をだしても受理されることは滅多にありません。
あしからず。
セキュリティ監査の仕事で何度も内部情報を取得してます。"Cross-site" ではないですが。
しかし、リバースプロキシな環境はWebという非常に大きな集合の中でも稀な部類のような気がします。また監査報告書の中でも(SQLインジェクションなどとの比較して)大きな問題としては考えていませんよ。
traceroute可能で、大騒ぎしませんよね。
確かに告訴状を提出して受理されれば捜査義務が発生します。しかし告訴状を受理する義務はありません。
なるほど。そうするとやはり民事が一番手っ取り速いと言う事なのですね。捜査するのも税金ですから無駄に使われても困ります。妥当な仕組みと思います。
そこでふと気になったのですが、捜査する、しないを警察(検察?)が判断するとなると色々な問題が考えられると思います。公正な判断となるように考えられてるとは思いますが、どのような基準なのかは興味があります。