HTTPoxyとは何ですか?
2016年7月18日、HTTPoxyと呼ばれるCGIアプリケーションの脆弱性が公開されました。 攻撃者はHTTPを渡すことにより、脆弱な展開を悪用する可能性があります Proxy
バッキングサービスに接続するときにアプリケーションが使用するURLを変更するリクエストを含むヘッダー。 これは、資格情報の漏洩、アプリケーションへの応答の変更などに使用できます。
脆弱性は、名前の衝突によって引き起こされます HTTP_PROXY
バックエンドプロキシサービスの場所を指定するために頻繁に使用される環境変数、および Proxy
HTTPクライアントヘッダー。 CGI仕様では、クライアント提供のヘッダーを環境に渡す必要があります。 HTTP_
名前空間のプレフィックス。 このマングリングは、次のような構成変数と衝突します HTTP_PROXY
、これも HTTP_
. CGIアプリケーションまたはライブラリが追加の処理なしでこの変数を使用する場合、プロキシサービスへの接続を試行するときに、クライアントによって提供された値を使用することになります。
この脆弱性はさまざまなCGIのような実装に影響を与えるため、 CVE-2016-5386 、 CVE-2016-5386 、CVEのセキュリティ脆弱性識別子が多数作成されています。 -2016-5387 、 CVE-2016-5388 、 CVE-2016-1000109 、および CVE-2016-1000110 (この時点で書き込み中、これらは予約されていますが、記入されていません)。
HTTPoxyの脆弱性は、2001年以降、いくつかの形式で知られていますが、最近まで広範囲に及ぶ問題として認識されることはありませんでした。 多くの展開に影響を与える可能性がありますが、軽減は非常に単純で簡単です。
脆弱なサーバーとアプリケーション
HTTPoxyは、多くのCGI実装に見られる一般的な脆弱性です。 アプリケーションまたはサーバーはCGI仕様を正しく実装できますが、それでも脆弱です。
展開が脆弱であるためには、次のことを行う必要があります。
- HTTP_PROXY環境変数を使用してプロキシ接続を構成します:アプリケーションコード自体または使用されるライブラリのいずれかで活用します。 これは、環境を使用してプロキシサーバーを構成するためのかなり標準的な方法です。
- HTTPを使用してバックエンドサービスにリクエストを送信:名前の衝突は
HTTP_
プレフィックス、HTTPを使用してアプリケーションによって行われたリクエストのみが影響を受けます。 HTTPSまたはその他のプロトコルを使用する要求は脆弱ではありません。 - CGIまたはCGIのような環境で動作する:クライアントヘッダーがに変換される展開
HTTP_
接頭辞付きの環境変数は脆弱です。 CGIまたはFastCGIなどの関連プロトコルの準拠実装はこれを行います。
ご覧のとおり、展開が脆弱になるには、展開固有の要素とアプリケーション固有の要素の組み合わせが必要です。 展開が影響を受けるかどうかをテストするために、 Luke Rehmann は、一般にアクセス可能なサイトの脆弱性をチェックするための単純なサイトを作成しました。
言語固有の情報
CGIのような展開は、他の言語よりもPHPエコシステムではるかに一般的であるため、特にPHPアプリケーションを監査する必要があります。 さらに、 getenv
一般的なライブラリのメソッドは、構成変数だけでなく、サニタイズされていないユーザー入力を返すことがすぐには明らかではないため、この問題を増幅します。 現在影響を受けている特定のライブラリは、Guzzle(バージョン4.0.0rc2以降)、Artax、およびComposerのStreamContextBuilderクラスです。
CGIを使用してデプロイしたときに脆弱であることが判明した他の言語は、PythonとGoでした。 これらの言語は、他の脆弱性のない方法を使用してより一般的に展開されます。 ただし、CGIが使用されている場合、素朴に読み取るライブラリ HTTP_PROXY
動作を変更しない変数は脆弱です。
脆弱性を打ち負かす方法
幸い、HTTPoxyの修正は比較的簡単です。 この脆弱性は、Webサーバーレイヤーまたはアプリケーションまたはライブラリから対処できます。
- アプリケーションまたはライブラリは無視できます
HTTP_PROXY
CGI環境にある場合は変数。 - アプリケーションまたはライブラリは、異なる環境変数を使用してプロキシ接続を構成できます
- Webサーバーまたはプロキシは設定を解除できます
Proxy
クライアントリクエストで受信したヘッダー
脆弱なライブラリを使用している場合は、問題に対処するためのパッチが利用可能になるまで、サーバー側の脅威を軽減する必要があります。 あなたが図書館またはアプリケーションの作者であり、あなたのプロジェクトが HTTP_PROXY
プロキシバックエンドを構成する変数については、CGIのような環境で実行しているときに衝突しない代替変数の使用を検討してください。 Rubyと他のいくつかのプロジェクトは CGI_HTTP_PROXY
この目的のために。
以来 Proxy
ヘッダーは標準のHTTPヘッダーではないため、ほとんどの場合、無視しても問題ありません。 これは、アプリケーション自体にリクエストを送信するために使用されるWebサーバーまたはロードバランサーで実行できます。 なぜなら Proxy
HTTPヘッダーには標準的な正当な目的はなく、ほとんどの場合、削除できます。
一般的なWebサーバー、ロードバランサー、またはプロキシは、適切なヘッダーの設定を解除できます。
ApacheでHTTPプロキシヘッダーを削除する
Apache HTTP Webサーバーを実行している場合、 mod_headers
モジュールを使用して、すべてのリクエストのヘッダーの設定を解除できます。
UbuntuおよびDebianサーバー
有効にする mod_headers
UbuntuまたはDebianサーバーでは、次のように入力します。
- sudo a2enmod headers
その後、グローバル構成ファイルを開きます。
- sudo nano /etc/apache2/apache2.conf
下部に向かって、以下を追加します。
. . .
RequestHeader unset Proxy early
ファイルを保存して閉じます。
構文エラーがないか構成を確認してください。
- sudo apache2ctl configtest
構文エラーが報告されない場合は、サービスを再起動します。
- sudo service apache2 restart
CentOSおよびFedoraサーバー
The mod_headers
従来のインストールでは、モジュールはデフォルトで有効になっている必要があります。 設定を解除するには Proxy
ヘッダーで、グローバル構成ファイルを開きます。
- sudo nano /etc/httpd/conf/httpd.conf
下部に向かって、以下を追加します。
. . .
RequestHeader unset Proxy early
終了したら、ファイルを保存して閉じます。
次のように入力して、構文エラーを確認します。
- sudo apachectl configtest
構文エラーが報告されない場合は、次のように入力してサービスを再起動します。
- sudo service httpd restart
Nginxを使用したHTTPプロキシヘッダーの削除
Nginxでは、軽減は同様に簡単です。 サーバーまたはアップストリームで実行されているCGIのような環境の環境を簡単にサニタイズできます。
UbuntuおよびDebianサーバー
UbuntuおよびDebianサーバーでは、FastCGIパラメーターは通常、 fastcgi_params
また fastcgi.conf
FastCGIプロキシを設定するときのファイル。 設定を解除できます HTTP_PROXY
これらのファイルの両方のヘッダー:
- echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
- echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params
FastCGIプロキシを構成するときにファイルの1つを調達していない場合は、プロキシの場所自体にこの同じ行を含めるようにしてください。
. . .
location ~ \.php$ {
. . .
fastcgi_param HTTP_PROXY "";
. . .
}
}
従来のHTTPプロキシにNginxを使用している場合は、HTTPをクリアする必要があります Proxy
ヘッダーも。 HTTPプロキシヘッダーは、 /etc/nginx/proxy_params
ファイル。 ルールを追加して、設定を解除できます Proxy
次のように入力して、そのファイルのヘッダーを作成します。
- echo 'proxy_set_header Proxy "";' | sudo tee -a /etc/nginx/proxy_params
この場合も、サーバーブロック構成内からこのファイルを取得しない場合は、プロキシの場所自体にファイルを追加する必要があります。
. . .
location /application/ {
. . .
proxy_pass http://127.0.0.1;
proxy_set_header Proxy "";
. . .
}
}
次のように入力して、構文エラーを確認します。
- sudo nginx -t
エラーが報告されない場合は、サービスを再起動します。
- sudo service nginx restart
CentOSおよびFedoraサーバー
CentOSとFedoraのNginxも同じものを使用します fastcgi_params
と fastcgi.conf
FastCGIプロキシを構成するファイル。 設定を解除します HTTP_PROXY
次のように入力して、これらのファイルの両方にヘッダーを追加します。
- echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
- echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params
FastCGIプロキシを構成するときにこれらのファイルのいずれかを調達していない場合は、プロキシの場所自体にこの同じ行を含めるようにしてください。
. . .
location ~ \.php$ {
. . .
fastcgi_param HTTP_PROXY "";
. . .
}
}
従来のHTTPプロキシにNginxを使用している場合は、HTTPをクリアする必要があります Proxy
ヘッダーも。 設定を解除するルールを追加する必要があります Proxy
実行している任意の場所のヘッダー proxy_pass
. どこかわからない場合 proxy_pass
が使用されている場合は、構成ディレクトリを簡単に検索できます。
- grep -r "proxy_pass" /etc/nginx
Output/etc/nginx/nginx.conf.default: # proxy_pass http://127.0.0.1;
コメントアウトされていない結果(上記の例のように)は、次のように編集する必要があります proxy_set_header Proxy "";
:
. . .
location /application/ {
. . .
proxy_pass http://127.0.0.1;
proxy_set_header Proxy "";
. . .
}
}
次のように入力して、構文エラーを確認します。
- sudo nginx -t
エラーが報告されない場合は、サービスを再起動します。
- sudo service nginx restart
HAProxyを使用したHTTPプロキシヘッダーの削除
HAProxyを使用してトラフィックをアプリケーションサーバーに転送している場合は、 Proxy
トラフィックを転送する前のヘッダー。
開く /etc/haproxy/haproxy.cfg
編集用ファイル:
- sudo nano /etc/haproxy/haproxy.cfg
あなたは設定することができます http-request
のディレクティブ frontend
, backend
、 また listen
構成のセクション。
frontend www
http-request del-header Proxy
. . .
backend web-backend
http-request del-header Proxy
. . .
listen appname 0.0.0.0:80
http-request del-header Proxy
. . .
これらは各セクションで設定する必要はありませんが、含めることで問題はありません。 終了したら、ファイルを保存して閉じます。
次のように入力して構文を確認します。
- sudo haproxy -c -f /etc/haproxy/haproxy.cfg
問題が見つからない場合は、次のように入力してサービスを再起動します。
- sudo service haproxy restart
結論
HTTPoxyの脆弱性はかなり長い間公開されており、Web上にデプロイされた多数のアプリケーションに影響を与える可能性があります。 幸いなことに、任意のWebサーバーに固有のヘッダー変更機能を使用して修正するのは簡単です。