Apache Range Header DOS 検証補助ツール


Apache HTTPD 1.3/2.xにおいて、RangeヘッダーのDOS脆弱性(CVE-2011-3192)が先日発見されました。

リモートから、Apacheに冗長なRangeヘッダーのリクエストを送信することによって、サーバーのメモリやCPU資源を大きく消費させることができるというものです。なお、最新のアドバイザリでは、1.3に関しては脆弱ではないものの、RangeヘッダーDOSを受けた場合には、それなりに高負荷になるとの指摘があります。

その対策として、Apache開発チームが提示した方法の一つに mod_setenvif や mod_rewrite のモジュールを使って、冗長なRangeヘッダーのリクエストがあった場合には、Rangeヘッダーを無視したり、あるいは、そのリクエストを拒否するというものがあります。

その対策設定をした場合の事後チェックが簡単にできるPerlプログラムを作成しました。
このプログラムを使うことで、mod_setenvif や mod_rewriteを用いた制限が有効であるかを調べることができます。

http://code.google.com/p/apache-range-header-test/wiki/JapaneseManual

以下がその実行例です。例では、Range-Headerで10個の範囲指定をしたリクエストをホストに送信します。「Warning」が返ってきた場合には、制限が効いておらず、Range-Header の要求を Apacheが正常に受け入れられたことを示します。

$ ./httprangetest.pl foo.example.local
[Warning] foo.example.local: Host can accept more than 5 ranges.

次の結果では、Range-Headerの制限が効いており、Range-Headerが無視されています。

$ ./httprangetest.pl bar.example.local
[Info] bar.example.local: Host ignored Range-Header.

次のように第一引数を数値にして、Range-Headerでの範囲指定を任意の数値にすることができます。例では、2個の範囲指定であるため、制限には引っかからず、Apache がリクエストを受け入れています。このプログラムでは、6個以上の範囲指定をApacheが受け入れた場合には、Warning を出します。アドバイザリでは6個以上の範囲指定を制限しており、それに合わせた形です。

$ ./httprangetest.pl 2 bar.example.local
[Info] bar.example.local: Host can accept 2 ranges.

mod_setenvif や mod_rewrite のモジュールを使って、制限を実施した。あるいは、これから実施しようとされている人には、このプログラムを使うと検証が楽になるかもしれません。

なお、RangeヘッダーDOSの脆弱性が閉じられているかどうかを検証するものではないので、その点はご注意ください。

(CVE-2011-3192)

  1. No comments yet.
(will not be published)

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)