cNotes 検索 一覧 カテゴリ

Apache HTTPD Security ADVISORY (UPDATE 3 - FINAL)

Published: 2011/09/03

8月31日に、Apache 1.3系は脆弱ではないとの発表がありました。

ただし、このアドバイザリによれば、1.3系は脆弱ではないけれども、Rangeヘッダにコンマ区切りで非常に多くの範囲指定が設定された場合には、相当の負荷になると指摘しています。

さて、Apache 2.x 系では、setenvif_module (SetEnvIf) あるいは、rewrite_module (RewriteCond) を使った「Range ヘッダを許容するが、制限を加える」回避策が提示されています。この回避策において、制限を越えたアクセスのログ (制限超過ログ) を取得したい場合について補足したいと思います。

ここでは、制限超過ログとして、logs/range_log ファイルに、IPアドレス(%h)、時刻(%t)、ステータス(%s)、Range ヘッダを出力する場合を例示します。

Apache 2.2 系

    ----- httpd.conf -----
    #HTTPd サーバ設定ファイル httpd.conf
    
    # setenvif_module (SetEnvIf) を使用して、Range ヘッダの項目数が
    # 5 件以下かどうかを判定。
    # 5 件よりも大きい場合には、headers_module (RequestHeader) を使って、
    # Range ヘッダを無視する。
    SetEnvIf Range (?:,.*?){5,5} bad-range=1
    RequestHeader unset Range env=bad-range
    
    # Request-Range ヘッダは、古いブラウザ (MSIE3, Netscape 2 or 3) で
    # 使われていた。Request-Range ヘッダは無視する。
    RequestHeader unset Request-Range
    
    # 制限を越えたアクセスのログ(制限超過ログ)を取得する。
    CustomLog logs/range.log "%h %t %s \"%{Range}i\"" env=bad-range
    ----- httpd.conf -----
    
    ----- logs/range.log -----
    # CustomLog で env=bad-range パラメタを用いた場合のログ出力
    
    192.168.1.3 [03/Sep/2011:17:00:07 +0900] 200 "-" <<制限超過
    192.168.1.3 [03/Sep/2011:17:16:28 +0900] 404 "-" <<制限超過
    
    # logs/range.log には、制限超過ログのみが記録される。
    # ただし、Range ヘッダが無視されてしまうため、Range ヘッダをログとして
    # 記録できない。
    ----- logs/range.log -----

Apache 2.0 系

    ----- httpd.conf -----
    #HTTPd サーバ設定ファイル httpd.conf
    
    # rewrite_module (RewriteCond) を使用して、Range ヘッダの項目数が
    # 5 件以下かどうかを判定。
    # 5 件よりも大きい場合には、rewrite_module (RewriteRule) を使って、
    # エラー (403 Forbidden) を返す。
    RewriteEngine on
    RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$) [NC]
    RewriteRule .* - [F]
    
    # Request-Range ヘッダは、古いブラウザ (MSIE3, Netscape 2 or 3) で
    # 使われていた。Request-Range ヘッダは無視する。
    RequestHeader unset Request-Range
    
    # Apache 2.2 系と同様に、SetEnvIf と RequestHeader を用いた設定も、
    # 可能であるが、RequestHeader が env=bad-range のようなパラメタを
    # サポートしていないため、制限超過ログの取得ができない。
    CustomLog "logs/range_log" "%h %t %s \"%{Range}i\""
    ----- httpd.conf -----
    
    ----- logs/range.log -----
    # CustomLog でのログ出力
    
    192.168.1.4 [03/Sep/2011:16:33:37 +0900] 403  <<制限超過
      "bytes=0-,1-2,3-4,5-6,7-8,6-9"
    192.168.1.4 [03/Sep/2011:16:33:52 +0900] 206  <<正常
      "bytes=0-,1-2,3-4,5-6,7-8"
    
    # Range ヘッダをログとして記録できる。
    # ただし、logs/range.log には、制限超過ログだけではなく、すべての
    # アクセスログが記録されるため、ログの肥大化については留意する必要あり。
    ----- logs/range.log -----

冗長だけど、logs/range.log に、Range ヘッダを出力しつつ、制限超過ログだけ出力したい場合には、、、

Apache 2.2/2.0 系

    ----- httpd.conf -----
    SetEnvIf Range (?:,.*?){5,5} bad-range=1
    CustomLog logs/range.log "%h %t %s \"%{Range}i\"" env=bad-range
    RewriteEngine on
    RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$) [NC]
    RewriteRule .* - [F]
    RequestHeader unset Request-Range
    ----- httpd.conf -----
    
    ----- logs/range.log -----
    192.168.1.5 [03/Sep/2011:16:33:37 +0900] 403  <<制限超過
      "bytes=0-,1-2,3-4,5-6,7-8,6-9"
    192.168.1.5 [03/Sep/2011:16:33:37 +0900] 403  <<制限超過
      "bytes=0-,0-,0-,0-,0-,0-,0-,0-,0-"
    ----- logs/range.log -----

@Sam[カテゴリ:DDoS観察日記]