検証
Exploit Code は Apache Killer (killapache.pl) よりも apachepartial.pl のほうが Perl モジュール Parallel::ForkManager の追加が要らないので楽ちん。
Usage: ./apachepartial.pl <host> [path] [parallel reqs] [loops] [port]
perl apachepartial.pl pooh.gr.jp /robots.txt 60 0 80
pooh.gr.jp は結構頑丈だったので 60 並列でやっと CPU idle 30% まで減らせた。
path で指定するコンテンツを 1300 バイト以上にすると効果的になる。robots.txt はちっさいので攻撃効果が低くなったみたい。
対策
対策を実行したら、まずサービスに影響がないかを確認する。その後もう一度 Exploit Code を実行して CPU が消費されないことを確認する。
{ echo -e '# Drop the Range header when more than 5 ranges.' echo -e '# CVE-2011-3192' echo -e 'SetEnvIf Range (?:,.*?){5,5} bad-range=1' echo -e 'RequestHeader unset Range env=bad-range' echo -e '' echo -e '# We always drop Request-Range; as this is a legacy' echo -e '# dating back to MSIE3 and Netscape 2 and 3.' echo -e 'RequestHeader unset Request-Range' echo -e '' echo -e '# optional logging.' echo -e 'CustomLog logs/range-CVE-2011-3192.log common env=bad-range' echo -e 'CustomLog logs/range-CVE-2011-3192.log common env=bad-req-range' } >/etc/httpd/conf.d/range-CVE-2011-3192.conf /sbin/service httpd configtest && /sbin/service httpd graceful
切り戻し
パッチが出たら … というかパッチの当たったパッケージが提供されたら (… CentOS 大丈夫かな?) このワークアラウンドは要らなくなるので削除する。ログには攻撃元 IP アドレスが記録されているので確認してから削除する。
rm -f /etc/httpd/conf.d/range-CVE-2011-3192.conf /sbin/service httpd configtest && /sbin/service httpd graceful rm -i /var/log/httpd/range-CVE-2011-3192.log*