7月18日に、HTTPoxyと呼ばれる一連の脆弱性に関する情報が公開されました。 攻撃者はこれを使用して、HTTP_PROXY環境変数を置き換えることができます。これにより、HTTP要求をWebアプリケーションへのリソースをリダイレクトすることができます。
この脆弱性は、Vend開発者Dominic Scheirlinckの参加によって特定されました。彼は、Mediumブログで、サポートチームが受け取ったチケットの分析中に同僚によって発見された方法について話しました。
仕組み
ShyrlinkがHTTPoxyの仕組みを詳細に説明しています。 この一連の脆弱性を使用した典型的な攻撃は次のようになります。
- 攻撃者は、プロキシヘッダーを含む特別に細工されたHTTPリクエストを作成します。
- CGIは要求を受信し、ヘッダー値をHTTP_PROXY環境変数に保存します。
- CGIアプリケーションは、HTTP_PROXY環境変数をプロキシ設定として使用して、独自のWebクライアントを起動します。
- クライアントはリクエストを送信し、宛先アドレスの代わりに攻撃者のサーバーを介してプロキシされます。
たとえば、これはいくつかの一般的な言語のオペレーティングコードのように見える場合があります。
PHP:
$client = new GuzzleHttp\Client(); $client->get('http://api.internal/?secret=foo')
Python:
from wsgiref.handlers import CGIHandler def application(environ, start_response): requests.get("http://api.internal/?secret=foo") CGIHandler().run(application)
行く:
cgi.Serve( http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { res, _ := http.Get("http://api.internal/?secret=foo") // [...]
より詳細なPoCは、GitHubの特別なHTTPoxyリポジトリにあります 。
興味深い点は、HTTPoxy攻撃で使用されるバグ自体が15年前に発見されたことです。 HTTPoxy サイトは、脆弱性履歴の詳細な説明を提供します。
彼によると、2001年3月に、libwww-perlのHTTP_PROXYヘッダーの誤った処理のエラーが発見され、修正されました。 その年の4月に、curlで問題が発見されました(また、Windowsではなく修正されました)。 2012年に、RubyプロジェクトチームはNet :: HTTPのHTTP_PROXYを開発しました-システムに脆弱性はありませんでした。
2013年11月、NGINXメーリングリストで言及されました-ユーザーJonathan Matthewsがエラーについて説明しましたが、自分が正しいかどうかは完全にはわかりませんでした。 2015年2月、この脆弱性はApache httpd-devメーリングリストでも言及されました。 そして、2016年7月にVendの従業員であるScott Gearyが実際のシステムにバグを発見しました。
どのシステムが脆弱ですか?
Vendセキュリティチームが発見したように、この脆弱性は多くの最新の言語とライブラリに含まれています。
- CVE-2016-5386 Go
- CVE-2016-5387 Apache HTTPD
- CVE-2016-5388 Tomcat
- CVE-2016-1000104 mod_fcgi
- CVE-2016-1000107 Erlang HTTPサーバー
- CVE-2016-1000108ヨーズ
- CVE-2016-1000109 HHVM FastCGI
- CVE-2016-1000110 Python CGIHandler
- CVE-2016-1000111 Pythonツイスト
ソフトウェアの脆弱性を検出する方法
RedHatの専門家は、特定のシステムがHTTPoxyに対して脆弱かどうかを判断する小さなスクリプトを開発しました。
これを行うには、サーバー管理者が次のCGIスクリプトをインストールして実行可能にする必要があります。
test.cgi: #!/bin/sh echo "Content-Type:text/plain" echo "" echo "HTTP_PROXY='$HTTP_PROXY'"
その後、プロキシヘッダーを使用してCGIスクリプトを呼び出します。
curl -H 'Proxy: AFFECTED' http://my-server-name/cgi-bin/test.cgi
コマンドの出力が次の場合-サーバーは脆弱ではありません。
HTTP_PROXY="
出力が正しく表示されない場合、たとえば、次の碑文が表示されている場合、システムは脆弱です。
HTTP_PROXY='AFFECTED'
自分を守る方法
この状況でのWebアプリケーションのエンドユーザーはセキュリティレベルを向上できませんが、このソフトウェアの開発者はそれを保護するあらゆる機会を持っています。
これを行うには、プロキシ要求ヘッダーをブロックする必要があります-これは非常に迅速に実行できます。 このようなヘッダーは非標準であり、通常は使用されないため、これによりアプリケーションの機能が損なわれることはありません。
たとえば、これは.htaccessファイルを使用してApacheでプロキシヘッダーを無効にする方法です。
<IfModule mod_headers.c> RequestHeader unset Proxy </IfModule>
多くのIT企業とソフトウェア開発者は、 Akamai 、 CloudFlare 、 RedHatなどのユーザーがHTTPoxyの脆弱性からユーザーを保護するための対策を講じたことを既に発表しています。
Positive Technologiesの専門家は、HTTP要求での「プロキシ」ヘッダーの使用を検出し、起こりうる結果を防ぐことができるSuricata IDSの署名を開発しました。 署名と操作の例は、公式のtwitter.com/AttackDetection/status/756142402268639232リポジトリにあります。