ApacheのDoS脆弱性(CVE-2011-3192)対策


本ガイドはサポート対象外の説明を含む内容となります。
参考情報としてお読みいただき、お客様のご判断でご利用ください。

本ガイドはApache の脆弱性 CVE-2011-3192に対する確認方法と対応についてのご案内です。
CVE-2011-3192 の脆弱性について – SecurityFocus(英語)
こちらの脆弱性に対しての攻撃があった場合、サーバの負荷があがる等の弊害が確認されています。

共用サーバについては当社エンジニアにて対応させていただきますが、専用サーバに おいてはそれぞれカスタマイズ状況が異なりますので、状況を確認いただきながら お客様にてご対応いただいております。
関連FAQ:上位プランのセキュリティパッチ情報を教えてください。

STEP 1該当の脆弱性の有無の確認方法

本ガイドで案内するのは、
– Apacheのバージョンが httpd-2.2.3-53.el5.centos未満かつ
– 後述のコマンド発行時、206 Partial Contentと表示される
サーバに対しての場合においての作業一例です。
ウェブサーバに、httpd-2.2.3-53.el5.centos以上が導入されていれば、 本ガイドの作業は必要ありません。

1-A. httpdのバージョン確認

ご契約サーバにSSHログインし、以下のコマンドでhttpdプログラムのバージョンを確認ください。

# rpm -q httpd
httpd-2.2.3-7.el5.centos
▲httpd-2.2.3-53.el5.centos未満の場合、1-B.に進みます。▲

httpd-2.2.3-53.el5.centos以上であり、さらにPlesk導入済みの方はSTEP4:httpsd.confの編集とhttpsdの再起動に進んでください。
httpd-2.2.3-53.el5.centos以上であり、Pleskをご利用されていない方は本ガイドの対応は不要です。

1-B. テストコマンドでのStatus確認

ご利用サーバのIPアドレス(もしくはホスト名)に対して、以下のコマンドで接続をお試しください。
まず通常のアクセス方法でアクセスすると200番のステータスコードが返ってくるようなURLに対し、特定のヘッダーレンジを指定し、脆弱性を確認する、という手続きです。
以下は、http://125.6.xx.xxに対しステータスコード200番が応答する確認を行った後
特定ヘッダー情報を指定し、同じURLへアクセスを試みた場合は200番コードが応答しなくなる、という脆弱性の確認例です。

* Plesk搭載の方の実行例:
# curl -I 125.6.xx.xx | grep HTTP
HTTP/1.1 200 OK

* Plesk非搭載の方の実行例:
# curl -I 127.0.0.1/server-status | grep HTTP
HTTP/1.1 200 OK

通常はステータスコード200番を返すようなページをあらかじめ確認してください。
次に以下のコマンドでヘッダーレンジを指定しアクセスを試みます。


▼以下、レイアウト上改行を入れておりますが改行なしで一行で入力ください。▼
* Plesk搭載の方の実行例:
# curl -I -H "Range: bytes=0-1,5-0,5-1,5-2,5-3,5-4,5-5,5-6,5-7,5-8,5-9,
5-10,5-11,5-12,5-13,5-14,5-15,5-16,5-17,5-18,5-19" -s 125.6.xx.xx | grep HTTP
HTTP/1.1 206 Partial Content


* Plesk非搭載の方の実行例:
# curl -I -H "Range: bytes=0-1,5-0,5-1,5-2,5-3,5-4,5-5,5-6,5-7,5-8,5-9,
5-10,5-11,5-12,5-13,5-14,5-15,5-16,5-17,5-18,5-19" -s 127.0.0.1/server-status | grep HTTP
HTTP/1.1 206 Partial Content

200番のステータスコードが返らず206 Partial Content となっています。

1-a.の結果と上記コマンドでHTTP/1.1 206 Partial Contentが表示されることが確認できた場合、対応の必要がありますのでSTEP2の対応にすすみます。

【注意】
上記の脆弱性チェックは、通常200番ステータスコードを返すURLに対して行う必要があります。
例えば、http://125.6.xx.xxのトップページから転送やリダイレクトをかけているような構成や、トップページからBasic認証やアクセス制限をかけている場合は200番ポートを返さないためこのコマンドでは確認を行うことができません。
たとえばIPアドレスの部分をexample.org(お客様ウェブサイトのホスト名)に置き換える等で、200番ステータスコードが確認できるURLに対して、ステータスの違いの有無をチェックしてください。

STEP 2設定ファイルの追加とApacheリスタート

/etc/httpd/conf.dフォルダ直下に新規設定ファイル「CVE-2011-3192.conf」を作成します。

# cd /etc/httpd/conf.d
# vi CVE-2011-3192.conf

▼以下より3行がファイルの中身▼
SetEnvIf Range (,.*?){5,} bad-range=1
RequestHeader unset Range env=bad-range
CustomLog logs/range-CVE-2011-3192.log common env=bad-range

上記の「5」は任意の数字です。
高品質な電子書籍向けに PDF等 ファイルを提供するサイト、
複雑な動画配信サイトなどでは、数十という値が必要な場合があります。
※別ファイルでログを取得しない場合は、CustomLogではじまる行は不要です。

Apache設定ファイルの文法をチェックします。 
# /usr/sbin/httpd -S 
出力結果の最後に 
Syntax OK 

と表示されることを確認します。
その後Apacheを再起動します 
# /etc/init.d/httpd restart

STEP 3設定変更後、コマンドでの再確認

STEP1-a.で「HTTP/1.1 206 Partial Content」の応答が確認された同じコマンドを再度実行します。

▼レイアウト上改行を入れておりますが改行なしで一行で入力ください。▼
# curl -I -H "Range: bytes=0-1,5-0,5-1,5-2,5-3,5-4,5-5,5-6,5-7,5-8,5-9,
5-10,5-11,5-12,5-13,5-14,5-15,5-16,5-17,5-18,5-19" -s 125.6.xx.xx | grep HTTP
HTTP/1.1 200 OK 

これで80番ポート(通常のApacheウェブサイト)に対する対応は終わりです。
Pleskを導入の方はPlesk8.4、Plesk8.6のプログラムのエンジンがApacheベースであるため、STEP4に進んでください。

STEP 4【Plesk導入の場合】httpsd.confの編集とhttpsdの再起動

Plesk8.4、8.6を導入の方の対応例です。
Pleskポートに対して脆弱性がセルフチェックできるようなコマンド等はございませんが、以下の内容が推奨されています。

/usr/local/psa/admin/conf/httpsd.confというファイル内の
及び

2つのセクションの最後に次の行を挿入します。

# Reject request when more than 5 ranges in the Range: header.
# CVE-2011-3192
#
RewriteEngine on
RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
RewriteRule .* - [F]

手順の例は以下となります。

# cd /usr/local/psa/admin/conf/
# cp -pi httpsd.conf httpsd.conf.201109_backup
# vi httpsd.conf

< VirtualHost *:8443> 
...
...省略
...
# Reject request when more than 5 ranges in the Range: header.
# CVE-2011-3192
#
RewriteEngine on
RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
RewriteRule .* - [F]
< /VirtualHost> 

< VirtualHost *:8880> 
...
...省略
...
# Reject request when more than 5 ranges in the Range: header.
# CVE-2011-3192
#
RewriteEngine on
RewriteCond %{HTTP:range} !(^bytes=[^,]+(,[^,]+){0,4}$|^$)
RewriteRule .* - [F]
< /VirtualHost> 
 
チェックコマンドで確認します。Syntax OKと最後に表示されればOKです。
# /usr/local/psa/admin/bin/httpsdctl configtest
Syntax OK

プロセスの再起動を行います。
# /usr/local/psa/admin/bin/httpsdctl restart

以上で対応は終わりです。
ご不明点ございましたらサポートセンターまでお問い合わせください。