HTTPoxy - CGI での HTTP_PROXY 変数名の競合

Public Date: July 18, 2016, 11:47
更新 July 20, 2016, 09:13 - Chinese, Simplified 英語 French Korean
Resolved 状態
Important Impact

PHP、Go、Python、およびその他のスクリプト言語を使用する Red Hat 製品で、CGI スクリプトの使用方法に脆弱性が発見されました。


複数の Web サーバー、Web フレームワーク、およびプログラミング言語 (CGI 環境で最も一般的な) によって、受信リクエストからのデータ (例: ユーザー提供のデータが含まれる「Proxy」と呼ばれるリクエストヘッダー) を基にして HTTP_PROXY 環境変数が設定されます。環境変数 HTTP_PROXY は、HTTP や場合によっては HTTPS リクエストに使用するリモートプロキシーサーバーを指定するために多くの Web クライアントソフトウェアパッケージで使用されます。そのため、Web アプリケーションが実行されるときに、アプリケーションが後続の送信リクエストに使用するプロキシーサーバーを攻撃者が指定し、中間者攻撃 (Man-in-the-Middle attack) を実行できる可能性があります。この脆弱性には HTTPoxy という名前が付けられました。

背景情報

CGI および環境変数

HTTP サーバーは複数の環境変数を使用して CGI スクリプトに情報を渡します。これらの環境変数の一部は、コンテンツタイプ、TCP ポート、ホスト名、リクエストメソッド (GET、POST など) などの HTTP リクエストの特定内容を通信するために使用されます。RFC によって名付けられた「Protocol-Specific Meta-Variables」(プロトコル固有のメタ変数) という別の環境変数は、HTTP ヘッダーの値を CGI スクリプトに渡すために使用されます。HTTP ヘッダーから環境変数へのマッピングは標準的な手順に従い、HTTP ヘッダー名が大文字変換され、「-」が「_」に変換され、「HTTP_」という接頭辞が付けられます。

たとえば、HTTP_COOKIE 環境変数を使用して Cookie ヘッダーが渡され、HTTP_PROXY 環境変数を使用して Proxy ヘッダーが渡されます。Proxy ヘッダーは正式な標準ヘッダーではなく、暫定的なヘッダーレジストリーにはないことに注意してください。Proxy ヘッダーは標準に対応したアプリケーションやクライアントでは使用しないでください。

HTTP_PROXY「システム」環境変数

HTTP_PROXY と呼ばれる一般的なシステム環境変数があり、送信 HTTP プロキシーの HTTP (場合によっては HTTPS) プロキシー設定をアプリケーションに通信するために使用することができます。この変数の目的やコンテキストは HTTP サーバースクリプト変数とは全く異なります。アプリケーション、言語ライブラリー、またはスクリプトモジュールはこの環境変数を使用して、後続の送信 HTTP トラフィックのプロキシーを設定します。

CGI の標準

CGI (Common Gateway Interface) は、動的な Web ページを生成するために Apache や nginx などの HTTP Web サーバーが実行可能スクリプトやバイナリーとインターフェースで接続できるようにするための標準です。この標準は RFC 3875 に記載されています。CGI スクリプトは、PPHP、Python、Perl、Ruby、golang などのさまざまなスクリプト言語で記述できますが、コンパイルされたバイナリファイルにすることもできます。

HTTP サーバーと CGI スクリプトは次のように対話します。

1. HTTP サーバーは HTTP リクエストを受信および解析し、必要な環境変数を設定します。
2. HTTP サーバーは CGI スクリプトを呼び出し、スクリプトの標準出力でリクエストデータを渡します。
3. CGI スクリプトは環境変数と入力を処理し、スクリプトの標準出力を使用して応答を HTTP サーバーに返信します。
4. HTTP サーバーは CGI スクリプトによって生成された応答をクライアントに返信します。

問題: HTTP_PROXY 名の競合

CGI スクリプトは、HTTP リクエストの Proxy ヘッダーの値が含まれる CGI の「Protocol-Specific Meta-Variable」と、HTTP プロキシー設定が含まれる「システム」環境変数 HTTP_PROXY を区別できません。CGI スクリプト、モジュール、またはライブラリーは HTTP_PROXY 環境変数を読み取り、「システム」HTTP プロキシー設定が含まれると仮定します。現在の HTTP リクエストの処理中に作成された CGI スクリプト (および CGI スクリプトが呼び出す可能性のあるその他のスクリプトおよびプログラム) による新しい HTTP リクエストの処理方法が、誤って解釈された値によって変更されます。

対処方法

PHP、Go、または Python で CGI スクリプトを使用している場合は、システムに軽減策を適用することが強く推奨されます。影響を受けるパッケージ、イメージのバージョン、および推奨される軽減策は 解決法 タブ下に記載されています。

謝辞

Red Hat は、この問題を報告し、対処していただいた VendHQ の Dominic Scheirlinck 氏に感謝いたします。

Red Hat Product Security チームは、この更新のセキュリティー影響度を 重要な影響 として評価しています。

ご使用の環境でこの脆弱性を診断するには、解決法タブを参照してください。

影響を受ける製品

  • Red Hat Enterprise Linux 7.x
  • Red Hat Enterprise Application Platform 6.x

  • Red Hat Enterprise Web Server 2.x

  • Red Hat JBoss Web Server 3.x

  • Red Hat Satellite

攻撃の詳細と影響

攻撃

攻撃は比較的単純です。攻撃者は特別に作成した HTTP リクエストを脆弱性を持つ CGI スクリプトに送信します。リクエストには、ホスト名または IP アドレスが含まれ、攻撃者が制御するプロキシーのポートを値として持つ「Proxy」ヘッダーが含まれます。HTTP サーバーはリクエストを受信し、CGI スクリプトを呼び出して続行する前に通常処理の一部として「Proxy」ヘッダーとその値を HTTP_PROXY メタデータ変数に変換します。その後、CGI スクリプトは HTTP_PROXY 変数を読み取りますが、送信 HTTP プロキシー設定の通信に使用される「システム」変数と混同し、指定のプロキシーを使用するよう設定します。CGI スクリプトが HTTP リクエストを実行すると、それらのリクエストは攻撃者が制御するプロキシーを介して送信され、攻撃者による中間者攻撃が HTTP トラフィック全体で可能になります。

影響と重大度

CGI スクリプトがこの脆弱性の影響を受けるのは、HTTP_PROXY 変数を誤って解釈した上でさらに HTTP (場合によっては HTTPS) リクエストを送信する場合のみです。これらを両方行うスクリプトの数は、通常の CGI スクリプトのごく一部です。

CGI スクリプトの挙動によるため、グローバルな影響と深刻さを想定するのは難しくなります。特に深刻なのは、CGI スクリプトが機密性の高いタスクを実行する場合です (RESTful API を使用した認証など)。この場合、攻撃者は攻撃者が制御するプロキシーを介して、CGI スクリプトと (RESTful な) HTTP サーバー間の HTTP トラフィックをすべてリダイレクトすることができます。これにより、CGI スクリプトと HTTP サーバー間で送信されたリクエストおよび応答の両方に含まれた機密情報が公開されるおそれがあります。

さらに、攻撃者はリクエストと応答の内容を操ることができます。CGI スクリプトが外部インターネットからアクセスできない内部サーバーへリクエストを送信する場合、攻撃者のプロキシーは内部サーバーとは通信できず、攻撃者は内部サーバーの応答を妨害できませんが、CGI スクリプトのリクエストを妨害し、偽の応答を返信することは可能です。

診断

この問題を診断するには、以下を一時的に CGI スクリプトとしてサーバーにインストールし、実行可能にします。


test.cgi:

#!/bin/sh
echo "Content-Type:text/plain"
​echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"
											

その後、「Proxy:」リクエストヘッダーで CGI スクリプトを呼び出します。

curl -H ‘Proxy: AFFECTED’ http://my-server-name/cgi-bin/test.cgi
												

以下が出力された場合、サーバーは影響を受けません。

HTTP_PROXY="
													

以下または他の出力が表示された場合は、サーバーが影響を受ける可能性があるため、以下の軽減策の 1 つを適用する必要があります。

HTTP_PROXY='AFFECTED'
														

軽減策

軽減策の詳細は、影響を受けるサーバーに関連するナレッジベース記事を参照してください。

HTTPoxy - JBoss や tomcat は影響を受けますか?

HTTPoxy - Apache mod_cgi は影響を受けますか?

HTTPoxy - nginx は影響を受けますか?

HTTPoxy - Apache mod_fcgid は影響を受けますか?

HTTPoxy - PHP アプリケーションは影響を受けますか?

HTTPoxy - Go アプリケーションは影響を受けますか?

影響を受ける製品の更新

影響を受けたすべての製品の修正は、2016 年 7 月 18 日にリリースされました。

製品 パッケージ アドバイザリー/更新
Red Hat Enterprise Linux 5.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 6.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 7.x httpd RHSA-2016:1422
Red Hat Enterprise Application Platform 6.x httpd パッチ保留中
Red Hat Enterprise Web Server 2.x httpd パッチ保留中
Red Hat JBoss Web Server 3.x httpd パッチ保留中
Red Hat Software Collections httpd24 RHSA-2016:1420

Comments