KENJI’S BLOG このページをアンテナに追加 RSSフィード

Freezed...

2010-03-10

携帯電話関連のセキュリティ DNS Rebinding まとめ [IIS/5.0のHRSにより携帯から任意のHTTPリクエストを送信可能]

マイナーかもしれないけど、HTTP Request Smuggling(通称HRS)という攻撃手法があります。詳しくはWizardBible vol.19の金床氏のHRS記事を参照。そして、それに関連して、IIS/5.0の48kbバグ(仕様?)というものがありまして、簡単に言うと、IIS/5.0は、Content-Typeヘッダが無い48kb以上のボディ部を持つHTTPリクエストに対して、無条件にボディ部を48kbに決めつけるというものです(以下、WizardBible vol.19のHRS記事から引用)。

IIS/5.0にはとてもわけのわからないバグがあるようで、48kb以上のボディ部を持ち、かつContent-Typeヘッダーフィールドが無いHTTPリクエストは、無条件にボディ部を48kbちょうどと決めつけてしまうようです。

ちなみにIIS/5.1も5.0同様48kb決めうちを行います(IIS/6.0や7.0に関しては検証していません)。HRSの攻撃手法の観点から、例えば、IIS/5.0サーバへ、POSTで48kb(49152バイト)の"A"の羅列+"GET /test.html HTTP/1.0\r\n\r\n"というデータ列を送ると、HTTPリクエストは1つであるはずなのに、これに対するHTTPレスポンスは2つ返ってきます。仮にContent-Lengthが正しい値49178(49152 + "GET /test.html HTTP/1.0\r\n\r\n"のサイズ)を示していても、IISは、最初の「POSTに対するレスポンス」と「48kb以降の"GET /test.html HTTP/1.0\r\n\r\n"に対するレスポンス」の2つを返します。

この前提条件を元に、再度DNS Rebindingを考えます。例えばIIS/5.0で運用されている携帯(iモード)向けのWebサービスがあった場合、そのWebサービスでは携帯電話(iモード)からのHTTPリクエストが自在に操れることになります。

  1. target.com(1.2.3.4)にて、IIS/5.0で運用されている携帯(iモード)向けのWebサービスが稼動
  2. 攻撃者のドメインattack.com(5.6.7.8)から、iアプリをダウンロード
  3. DNS Rebindingにより、attack.comのIPアドレスを1.2.3.4にセット
  4. iアプリからattack.com(=target.com)に対して、POST(48kb)+"GET /test.cgi HTTP/1.0\r\n\r\n"を送信
  5. サーバ側は、POSTによる48kbのリクエスト後、2つ目のリクエスト"GET /test.cgi HTTP/1.0\r\n\r\n"を受信

48kb以降のデータ列はどのようなHTTPリクエストでも構わなく、かつ、Docomoのゲートウェイの認証に関係なく通過するため(ゲートウェイはPOSTによる入力データだと認識する)、実質、任意のHTTPリクエストを携帯電話から送れます。ちなみにiアプリのPOSTできる最大サイズは80kbとなっているため、約32kb(80kb-48kb)以下までのHTTPリクエストを生成できます。Ajax(JavaScript)については検証していませんが、Content-Typeを付加しないPOSTを送ることができれば、おそらく同じことが可能だと思われます。


実際にテスト環境で試してみたところ、iアプリだと48kbのデータを普通に扱う(送受信したりする)のは結構メモリを圧迫するらしく、少しコードを気をつける必要がありましたが、結果的にはうまくHTTPリクエストを送信できました。この問題はDNS Rebindingにより任意の携帯向けWebサイトへアクセスさせ、かつ、HRSにより任意のHTTPリクエストをIISサーバへ送信する、という双方の既存の脆弱性を利用します。よって、対処法としては、DNS Rebinding阻止のためにバーチャルホストで運用 or 携帯サイトではIISを使用しない、という感じかなと思います。

ockeghemockeghem 2010/03/11 07:38 こんにちは。とても興味深いレポートをありがとうございます。これ、能動的攻撃が可能ですから、もし該当するサイトがあれば非常に危険ですね。また、ケータイのセキュリティを研究している人がここにも一人いるのだと心強く思いました。今後ともよろしくお願いします。

ockeghemockeghem 2010/03/11 15:08 IIS/5とIIS/6で試してみたところ、Content-LengthのないPOSTメソッドではいずれもHTTP/1.1 411 Length Required というエラーになりました。ということで、Windows2003以降であれば、この攻撃はできないようです。手元にはWindows2000のメディアがなく、現在はTechnet Plusサブスクリプションでもダウンロードできないようで追試ができません。うーん、残念。
今後サポートのない2000を使い続けるのも問題ですし、Windows2003以上に移行するのがよいでしょうね。

kenjiaikokenjiaiko 2010/03/12 03:57 いや、Content-LengthのないPOSTではなく、Content-TypeのないPOSTですね。ただ、僕もIIS/6以降で試していないので、改善されているかもしれません。IIS/5.0では結構有名なbug(MS側の見解としては仕様?)なので多分IIS/5だとうまくいくかと思うのですが。
あと遅れましたが、こちらこそよろしくお願いしますですm(_ _)m。ケイタイ関連のockeghemさんのリサーチは毎回拝見させてもらっています(すごい興味深く勉強になります)。正直僕はAjax関連とかあまり詳しくないですが地道に勉強しつつ更新していこうと思います。

ockeghemockeghem 2010/03/14 10:54 コメントありがとうございました。Conent-Typeがない場合で、Content-Lengthはあってもよいのですね。Windows2000にて現象の再現を確認し、かつWindows2003では同一条件で再現しないことを確認しました。
それと、リクエストを送出はできますが、二発めのリクエストに対するレスポンスは受け取れないと考えてよいのでしょうか。これが受け取れるとかなり凶悪ですが、私が試した範囲では受け取れないようです。

kenjiaikokenjiaiko 2010/03/14 11:23 おおー、Win2003では再現しなかったですか。なるほどなるほど。情報ありがとうございますです。あと2回目のレスポンスの件は、私も受け取れなかったですね。なので受け取れないという認識で間違いないかと思います。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。