2016 年 7 月 18 日、「HTTPoxy」という脆弱性が発表されました。これは、一部の FastCGI 構成など、CGI または CGI のような環境で実行される一部のサーバー側 Web アプリケーションに影響を及ぼします。 これまでに影響を受けることがわかっている言語には、PHP、Python、Go などがあります。
特定の言語と CGI 実装をカバーする多数の CVE が割り当てられています。
脆弱性を説明する新しい Web サイト、 CERT の脆弱性に関するメモ、および脆弱性の発見に関する説明があります。 Vend のオープンソース Web 開発者であるDominic Scheirlinckの個人 Web サイトに、追加情報が掲載されています。
この投稿では、脆弱性について説明し、NGINX または NGINX Plus を使用してサーバー上で脆弱性を悪用する試みを阻止する方法について説明します。
この脆弱性は名前空間の衝突によって発生します。 CGI または FastCGI のようなインターフェースは、HTTP 要求パラメータに基づいて環境変数を設定し、これによりアプリケーションの構成に使用される内部変数を上書きできます。
現在、この脆弱性の唯一の既知の悪用は、特定の HTTP クライアント ライブラリを使用して他のサービスに HTTP 要求を行う、CGI および CGI のような環境で実行されている Web アプリケーションに対するものです。 この場合、攻撃者はアプリケーションによって生成された内部リクエストを任意のサーバーにリダイレクトし、リクエストに含まれる秘密データを取得する可能性があります (以下を参照)。
NGINX または NGINX Plus を使用すると、この脆弱性を悪用する試みを識別して阻止できます。 そうすることで、攻撃を効果的に防ぐことができ、影響を受けるコードを監査して更新する時間ができます。
この脆弱性がどのように機能するか、そしてサイトをこの脆弱性から保護する方法を理解するには、CGI および CGI のようなインターフェースが環境変数を設定する方法と、一部のアプリケーション ライブラリが環境変数によってどのように構成されるかを理解する必要があります。
多くの Web アプリケーション プラットフォームでは、CGI または CGI のようなインターフェイスを使用して、アプリケーションを Web サーバーに接続します。 これらのインターフェースは、HTTP リクエストのヘッダーをHTTP_
で始まる環境変数に変換します。 アプリケーションは、環境を検査することで、リクエスト ヘッダー ( User-Agent
など) の値を検索できます。
クライアントは、適切なヘッダーを含むリクエストを送信することで、アプリケーションの環境に任意の環境変数 ( HTTP_
で始まる) を作成できます。 たとえば、リクエスト ヘッダーFoo:
bar は
環境変数HTTP_FOO=bar
になります。
一部のプラットフォームでは、PHP の$_SERVER
グローバル変数などの環境変数を隠す抽象化レイヤーが提供されています。 ただし、これらの抽象化は、環境変数を設定する標準的な CGI および FastCGI の手法に基づいて構築されています。
たとえば、FastCGI モードで実行している場合、PHP アプリケーションは次のようにしてリクエストのUser-Agent
ヘッダーを判別できます。
// どちらの方法も同じ結果を返します$useragent = getenv( 'HTTP_USER_AGENT' );
$useragent = $_SERVER['HTTP_USER_AGENT'];
複雑な Web アプリケーションは、外部ライブラリから機能を取得します。 たとえば、アプリケーションが他のサービスに HTTP リクエストを (マイクロサービスのような方法で) 送信する必要がある場合、一般的なサードパーティ ライブラリのいずれかを使用して送信することがあります。 これらのライブラリは、多くの場合、HTTP リクエストを中継するために使用される中間サーバーであるHTTP プロキシと呼ばれる機能をサポートしています。
このようなライブラリを構成する簡単な方法の 1 つは、環境変数を通じて構成を定義することです。 広く使用されているPHP Guzzleライブラリは、プロキシ サーバーのアドレスに設定されるHTTP_PROXY
という環境変数によって部分的に構成されます。 HTTP_PROXY
がこのように設定されている場合、ライブラリは生成するすべての HTTP 要求をプロキシ サーバーのアドレスに中継します。 Go のnet/http
パッケージと Python の Requests モジュールも同様にHTTP_PROXY
環境変数を信頼し、解釈します。
項目 2 で説明したライブラリは、CGI または CGI のようなインターフェイスを考慮して設計されておらず、信頼するHTTP_PROXY
環境変数は、項目 1 で説明したように、CGI および FastCGI インターフェイスで使用されるHTTP_
名前空間と重複しています。
HTTP_PROXY
環境変数の値を独自に選択したアドレスに設定することにより、攻撃者はアプリケーションによって生成された内部 HTTP 要求をリダイレクトしてキャプチャできます。 これらのリクエストには、認証キーや個人データなどの機密情報が含まれている可能性があり、悪用される可能性のある追加の API やエンドポイントに関する情報が公開される可能性があります。
攻撃者は、プロキシ
ヘッダーを含むリクエストを送信することでこれを実行でき、CGI または FastCGI インターフェイスは、アプリケーションの呼び出し用にHTTP_PROXY
という名前の環境変数を自動的に作成します。 偽のProxy
ヘッダーを含むリクエストのみが直接影響を受けることに注意してください。
HTTPoxy の脆弱性は NGINX に直接影響しませんが、NGINX と NGINX Plus を使用して、この脆弱性に基づく攻撃を阻止することができます。
NGINX を使用して、 HTTP_PROXY
FastCGI パラメータを空の文字列に設定することにより、アプリケーションへの入力を「サニタイズ」できます。 これにより、FastCGI リクエストからパラメータが完全に削除されます。
fastcgi_param HTTP_PROXY "";
HTTP リクエストをアップストリーム アプリケーションにプロキシする場合、アップストリーム アプリケーションが脆弱なプラットフォーム上で実行されている場合に備えて、プロキシ
ヘッダーを空の文字列に設定するのが賢明です。
proxy_set_header プロキシ "";
プロキシは
標準の HTTP ヘッダーではないため、このヘッダーを含むリクエストはすべて疑わしいものと見なされる可能性があります。 NGINX または NGINX Plus を使用して、これらの疑わしいリクエストをbadactor.logという名前の専用アクセス ログに記録できます。
# http{} コンテキストで 'proxylog' 形式を定義します:log_format proxylog '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_proxy"';
# 'proxylog' 形式を使用して、プロキシ ヘッダーを含むリクエストをログに記録します
access_log /var/log/nginx/badactor.log proxylog if=$http_proxy;
注記: このaccess_log
ディレクティブを配置する構成コンテキストでは、NGINX 構成の上位レベルで定義されているアクセス ログが上書きされます。
NGINX と NGINX Plus は、HTTPoxy 攻撃を監視して阻止する効果的な方法を提供します。 上記の手法を使用して、脆弱性を排除するためにコードを監査、更新、テストしながらアプリケーションを保護します。
ご質問がある場合は、この投稿にコメントしてください。また、NGINX Plus の加入者の場合は、お気軽にサポート チームにお問い合わせください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"