15 September
2011

[apache killer] apache 1.3.x に於ける mod_rewrite 設定纏め

CVE-2011-3192: mod_rewrite configuration for apache 1.3.x

■背景
CVE-2011-3192 に対する update 3 版が先日、9/14
頃リリース
 ref.: http://httpd.apache.org/security/CVE-2011-3192.txt
されました。

ざっと目を通しているなかで、

WARNING These directives need to be specified in every configured
vhost, or inherited from server context as described in:
http://httpd.apache.org/docs/current/mod/mod_rewrite.html#vhosts

という注意書きに引っかかり、virtual host 周りの
検証などを疎かにしていたなぁ、と思った(もう少し
検証をキチンとしよう)のが発端でした。

■検証方法
apache の access log を確認します。

下記、基本的には(特に断り書きがない場合)apache
1.3.4x を対象としたものです。

cf. http status code [google]

□tools
apache killer の perl script(二種)を用いました。
target は当然弊社管理下の server hosts です。

# Apache httpd Remote Denial of Service (memory exhaustion)
# due to a flawed implementation of Partial Content requests
# (CVE-2011-3192).
#
# by Javier, based on Kingcope's code at
# http://seclists.org/fulldisclosure/2011/Aug/175

#Apache httpd Remote Denial of Service (memory exhaustion)
#By Kingcope
#Year 2011
#
# Will result in swapping memory to filesystem on the remote side
# plus killing of processes when running out of swap space.
# Remote System becomes unstable.

□正しい request に対する log
http 206 "Partial Content" が log に出力
218.219.155.253 - - [15/Sep/2011:20:03:45 +0900] "HEAD / HTTP/1.1" 206 0 "-" "Apache httpd Partial Content bug exploit"
されます。

□問題のある request に対する log
httpd.conf にて
RewriteRule .* - [F]
と設定している為、403 Forbidden が log に出力
218.219.155.253 - - [15/Sep/2011:20:03:45 +0900] "HEAD / HTTP/1.1" 403 0 "-" "Apache httpd Partial Content bug exploit"
されます。

ref. mod_rewrite [official document]

□判定
設定が効いていない場合は 200 OK が返されてしまい
ますので、正しく(206 若しくは)403 が返っている
かを tail -f で確認しました。

■そもそもの RewriteCond の設定間違い
検証過程で判明したのですが、わたくしの設定
1 RewriteEngine on
2 RewriteCond %{HTTP:range} !(bytes=[^,]+(,[^,]+){0,4}$|^$)
3 RewriteCond %{HTTP:request-range} !(bytes=[^,]+(:?,[^,]+){0,4}$|^$)
4 RewriteRule .* - [F]
## 以上行番号を付与
に誤りがありました。2行目末尾に [OR] フラグ (ref.)
がないので、2 行目の条件に match しても、4行目の
rule が適用されません。


また、official の Mitigation: Option 2 にも [NC
(no case)] フラグが追記されましたので、この設定
も追加しました。

■"directory" directive との関係
以前の項 [apache 1.3.x の apache killer 対策] では、
設定を httpd.conf
### Section 3: Virtual Hosts
の直前に挿入しました。
と書きましたが、この設定は "directory" directive
で括っておりません。果たして mod_rewrite の設定
を何処に置くべきか、virtual host との関連は、を
確認します。

□2.0.x
apache 2.0.x では
RewriteEngine on
以降の設定を "directory" directive で括らなくと
も動作するようです。

但し、弊社実稼働 server では、apache 2.0.x にて
virtual host 環境での動作実績がない為、「本設定
で vhost に効くのか」については未検証です。

official にあるように、別途
RewriteEngine On
RewriteOptions Inherit
を入れる必要があるかも知れません。

□1.3.x
一方で、apache 1.3.4x は、何処の directory に対
して mod_rewrite の設定を適用するかを明示的に示
さないと、動作しないようです。

わたくしは全面的に適用したかったですので、
<Directory />
</Directory>
で括って、top 以下全てに適用されるようにしました。

なお、httpd.conf では、
### Section 2: 'Main' server configuration
以下に、
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
と、そもそもの設定がありますが、今回は此処のなか
ではなく、別途/新たに 切り出して設定を入れました。
既存の設定と混ぜたくなかったからです。

確認したところ、同一の directory に対して複数の
"directory" directive にて設定が為されていても、
意図通り動作するようです。

virtual host については、今回の設定では、top 以
下全てに効くよう設定した為、どの vhost について
も設定は有効であることが確認できました。

■FollowSymLinks について
以上の(再)設定を入れた後、error log に
[Tue Sep 20 11:02:03 2011] [error] [client 218.219.155.253] Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: /var/www/cgi-bin/rescue/rescue.cgi
の error が記録される host がみられました。

log を確認し、適宜
Options FollowSymLinks
の設定を httpd.conf 当該 "directory" directive
中に追加すれば、okay のようです。

■補遺: 差分
結局、以前の項 [apache 1.3.x の apache killer 対
] との差分は、下記
unchor@rescue:/etc/httpd/conf$ diff -c /tmp/httpd.conf httpd.conf
*** /tmp/httpd.conf Wed Aug 31 10:51:12 2011
--- httpd.conf Thu Sep 15 19:50:17 2011
***************
*** 1246,1259 ****
# Reject request when more than 5 ranges in the Range: header.
# CVE-2011-3192
#
RewriteEngine on
! RewriteCond %{HTTP:range} !(bytes=[^,]+(,[^,]+){0,4}$|^$)
! RewriteCond %{HTTP:request-range} !(bytes=[^,]+(:?,[^,]+){0,4}$|^$)
RewriteRule .* - [F]

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3.
# RequestHeader unset Request-Range


### Section 3: Virtual Hosts
--- 1246,1263 ----
# Reject request when more than 5 ranges in the Range: header.
# CVE-2011-3192
#
+ # <IfModule mod_rewrite.c>
+ <Directory />
RewriteEngine on
! RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$) [NC,OR]
! RewriteCond %{HTTP:request-range} !(^bytes=[^,]+(:?,[^,]+){0,4}$|^$) [NC]
RewriteRule .* - [F]

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3.
# RequestHeader unset Request-Range
+ </Directory>
+ # </IfModule>


### Section 3: Virtual Hosts
となりました。


Posted by unchor at 23:11 | Comments (0)
<< apxs の include dir と library name の指定 | Main | firefox 8.0 に於ける user agent の設定 >>
Comments
There are no comments.
Post a comment