MS15-034って何?
この4月に見られたシステムインフラ系の脆弱性で一番印象に残っているのは、2015年4月16日に公開されたMS15-034でした。
この脆弱性は、Windows Server 2008 R2以降のサーバ系Windows OSおよび、Windows 7以降のクライアント系Windows OSに影響します。有名なところではインターネット インフォメーション サービス(IIS)が利用していることから、IISが起動しているかどうか注意していれば良いと誤解されていたところがあります。しかし、タイトルに留意してください。
ここでわざわざ「HTTP.sysの脆弱性」としているのは、IISにかぎらずHTTP.sysを使うサービス/プログラムはことごとく影響を受ける可能性があるためです。そこで、この脆弱性対応を行うためには、「 IISを起動しているか否か」という観点ではなく、HTTP.sysを使っている可能性があるサービスが起動していないかどうか? と言う観点でシステムを確認する必要があります。
PoCから見るMS15-034
MS15-034は、実に単純なPoCでトリガ可能です。単にシステムを異常終了させるだけならば、有効なコンテンツに対するGETリクエストを、不正なRangeヘッダを指定して送信するだけで済みます。
例えば、wgetコマンドを以下のコマンドラインで、脆弱性のあるWindows(IIS起動済み)に対して打ち込むだけで、脆弱性をトリガすることが可能です。
$ wget -- header "Range: bytes=18-18446744073709551615" [ URL ]
筆者はWindows Server 2008 R2 Service Pack 1および、Windows Server 2008 R2(無印)で上記のPoCが有効なことを確認してます。なお、Windows Server 2008 R2(無印)はすでにサポート終了しているため、修正ファイルを適用するためには最低でもService Pack 1が適用されている必要があります。
Pastebinに掲載されているPoCをはじめとして、多くのPoCが見つかります。また、Metasploit Framework 4にもすでにMS15-034を突いたDoSモジュールが収録されています。
図1 Metasploitモジュールの様子
MS15-034の影響を受けるIIS「以外」のもの
MS15-034は、あくまで「HTTP.sys」の脆弱性に関する情報です。HTTP.sysはどういうときに使われるのか? と言う話になると考えてください。
HTTP.sysは、HTTP Server APIというインターフェースを使ってサービスなりプログラムを作成すると、その延長で利用されます。
IISは使っていないが、HTTPを使って電文をやりとりしているようなプログラムが稼働している場合には、そのプログラムを通じて脆弱性の影響を受ける可能性があると考えてください。
Windowsで動作し、Webブラウザ経由で操作を行うようなサーバプログラムなどは、この典型です。なお、Node.jsやApache2など、直接Winsock APIを使うなどして、HTTP Server APIを使わずに構築されているサーバソフトウェアは、MS15-034の影響を受けないことを確認しています。
対応するための簡単なアプローチと副作用
MS15-034に対応するにあたり、「 修正ファイルの適用が間に合わない」と言う場合には、今回の脆弱性をトリガするヘッダを途中で除去するという手が使えます。
PoCを見るとわかりますが、Rangeヘッダに不正な範囲を指定した場合にDoSが起きたりコンテンツキャッシュのメモリが一部漏れ出したりという事象が発生するので、修正ファイルを何らかの理由で(すぐに)適用できない場合には、Rangeヘッダを無効にする、もしくはRangeヘッダをともなうリクエストは通さないアプローチが有効と言えます。
筆者が調べた限りは、SquidやDelegateといったProxyサーバソフトウェアの機能に、こう言う処理を実現可能な記述を確認しています。
しかし、リクエスト中に指定されているヘッダを無効にした場合、当然そのヘッダで指定された動作は期待できません。今回の場合、Rangeヘッダが無効になっていると言うことで、「 コンテンツの部分転送」が無効にされます。これが何を意味するかと言うと、一部だけ参照すればOKなはずのリクエストも、全部のコンテンツを参照するようになってしまうということです。
Rangeヘッダを使える場合には、例えば、大きなデータ転送を中断した場合などでも、転送再開時にRangeヘッダを使えれば、中断したポイントからデータを送ってもらうことも可能ですが、使えない場合には、最初から送り直しと言うことになります。
おまけ:PoCからプログラミングを勉強する
今回の場合、どんなことをすると脆弱性をトリガするかがわかっているので、公開されているPoCを見ると、PoCを記述したプログラミング言語についても(少しですが)理解が進みます。
例えば、前述のPastebinに掲載されているPoCはPythonで書かれていますが、
ネットワーク経由でデータを送受信できる準備をする
データを送信する
データを受信する
と言うことを実に簡潔に記述しています。
Pastebinに掲載されているPoCはPythonで書かれていますが、MetasploitのモジュールはRubyで書かれています。もし脆弱性やPoCに興味があり、PythonやRubyなどを用いたプログラミングにも興味があれば、PoCを読んで脆弱性に関する造詣を深め、プログラミングも勉強する、と言うのが良いでしょう。