Hitach Incident Response Team

 1月1日までに明らかになった脆弱性情報のうち、気になるものを紹介します。それぞれ、ベンダーが提供する情報などを参考に対処してください。

Webサイトに対するハッシュテーブルの衝突を悪用したサービス不能(2011/12/29)

 2011年12月29日に、マイクロソフトからセキュリティアドバイザリー(2659883)「ASP.NETの脆弱性により、サービス拒否が起こる」が公開されました。ここでは、このアドバイザリーで取り上げられている、脆弱性(CVE-2011-3414、ハッシュテーブルの衝突がサービス拒否を引き起こす可能性のある脆弱性)がどのような問題なのかを概観します。

 脆弱性(CVE-2011-3414)は、Webアプリケーションに対して、CPU資源を浪費させるサービス不能攻撃を許してしまうという問題で、2011年12月28日に28th Chaos Communication Congressにおいて公表されました。この脆弱性は、HTTPリクエストのパラメーターを格納するハッシュテーブル処理に起因するものです。HTTPリクエストにハッシュテーブル上で衝突する(ハッシュ値が一致する)パラメーターが多数含まれている場合(図1)、ハッシュ値が一致するパラメーターの挿入、検索などの処理に高い負荷がかかり、これを悪用される可能性があります。「ハッシュが一致する」とは、キーのインデックスが一致することであり、一つのインデックスに多数のキー(例:['tt']['uU']['v6']・・・)がひも付いている場合には、効率的な処理ができないことを意味します。

 ハッシュテーブルの衝突を利用したサービス不能攻撃の可能性については2003年に国際会議USENIXで発表されており、今回、Webアプリケーションに対象に、この脆弱性によるサービス不能攻撃の可能性が明らかとなったという状況にあります(図2)。

図1●ハッシュテーブルの衝突の例
図1●ハッシュテーブルの衝突の例

図2●脆弱性(CVE-2011-3414)の対応経緯
図2●脆弱性(CVE-2011-3414)の対応経緯

 なお、脆弱性は、ASP.NETだけではなく、Java(すべてのバージョン)、JRuby(バージョン1.6.5以下)、PHP(バージョン5.3.8以下、5.4.0 RC3以下)、Python(すべてのバージョン)、Rubinius(すべてのバージョン)、Ruby(バージョン1.8.7-p356以下)、Apache Geronimo(すべてのバージョン)、Apache Tomcat(バージョン5.5.34以下、6.0.34以下、7.0.22以下)、Oracle Glassfish(バージョン3.1.1以下)、Jetty(すべてのバージョン)、Plone(すべてのバージョン)、Rack(バージョン1.3.5以下、1.2.4以下、1.1.2以下)、V8 JavaScript Engine(すべてのバージョン)にも同様に存在します。

 この脆弱性による影響をPHP(Apache 2.2.21+php-5.3.5-Win32-VC6-x86 on Windows XP)で調べてみると、ハッシュテーブル上で衝突するパラメーターを設定したHTTPアクセスの場合、パラメーター数が増えるに従い、処理時間とCPU使用率が増大します。図3は、ハッシュテーブル上で衝突するパラメーター数を増やしていった場合の処理時間です。パラメーター数が1万に達するまではパラメーターに手を入れていないHTTPアクセスと差はありませんが、パラメーター数が増えていくと処理時間が増大していくことが分かります。またCPU使用率については、パラメーター数5000で影響が現れていることが分かります(写真1)。

図3●HTTPリクエストのパラメーター数と処理時間
図3●HTTPリクエストのパラメーター数と処理時間

写真1●ハッシュテーブル上で衝突するパラメーターでのCPU使用率
写真1●ハッシュテーブル上で衝突するパラメーターでのCPU使用率

 PHP(CVE-2011-4885)では、PHP 5.4.0 RC4に、GET/POST/COOKIEで利用できるパラメーター数上限を指定するmax_input_vars(デフォルト1000)を導入しました。また、Apache Tomcat(CVE-2011-4084)では、暫定対策として、Tomcat 7.0.23とTomcat 6.0.35にGET/POSTで利用できるパラメーター数上限を指定するmaxParameterCount(デフォルト10000)を導入しました。