開発者ドキュメント

HTTPoxyの脆弱性からサーバーを保護する方法

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仕様を正しく実装できますが、それでも脆弱です。

展開が脆弱であるためには、次のことを行う必要があります。

ご覧のとおり、展開が脆弱になるには、展開固有の要素とアプリケーション固有の要素の組み合わせが必要です。 展開が影響を受けるかどうかをテストするために、 Luke Rehmann は、一般にアクセス可能なサイトの脆弱性をチェックするための単純なサイトを作成しました

言語固有の情報

CGIのような展開は、他の言語よりもPHPエコシステムではるかに一般的であるため、特にPHPアプリケーションを監査する必要があります。 さらに、 getenv 一般的なライブラリのメソッドは、構成変数だけでなく、サニタイズされていないユーザー入力を返すことがすぐには明らかではないため、この問題を増幅します。 現在影響を受けている特定のライブラリは、Guzzle(バージョン4.0.0rc2以降)、Artax、およびComposerのStreamContextBuilderクラスです。

CGIを使用してデプロイしたときに脆弱であることが判明した他の言語は、PythonとGoでした。 これらの言語は、他の脆弱性のない方法を使用してより一般的に展開されます。 ただし、CGIが使用されている場合、素朴に読み取るライブラリ HTTP_PROXY 動作を変更しない変数は脆弱です。

脆弱性を打ち負かす方法

幸い、HTTPoxyの修正は比較的簡単です。 この脆弱性は、Webサーバーレイヤーまたはアプリケーションまたはライブラリから対処できます。

脆弱なライブラリを使用している場合は、問題に対処するためのパッチが利用可能になるまで、サーバー側の脅威を軽減する必要があります。 あなたが図書館またはアプリケーションの作者であり、あなたのプロジェクトが 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サーバーでは、次のように入力します。

  1. sudo a2enmod headers

その後、グローバル構成ファイルを開きます。

  1. sudo nano /etc/apache2/apache2.conf

下部に向かって、以下を追加します。

/etc/apache2/apache2.conf
. . .
RequestHeader unset Proxy early

ファイルを保存して閉じます。

構文エラーがないか構成を確認してください。

  1. sudo apache2ctl configtest

構文エラーが報告されない場合は、サービスを再起動します。

  1. sudo service apache2 restart

CentOSおよびFedoraサーバー

The mod_headers 従来のインストールでは、モジュールはデフォルトで有効になっている必要があります。 設定を解除するには Proxy ヘッダーで、グローバル構成ファイルを開きます。

  1. sudo nano /etc/httpd/conf/httpd.conf

下部に向かって、以下を追加します。

/etc/httpd/conf/httpd.conf
. . .
RequestHeader unset Proxy early

終了したら、ファイルを保存して閉じます。

次のように入力して、構文エラーを確認します。

  1. sudo apachectl configtest

構文エラーが報告されない場合は、次のように入力してサービスを再起動します。

  1. sudo service httpd restart

Nginxを使用したHTTPプロキシヘッダーの削除

Nginxでは、軽減は同様に簡単です。 サーバーまたはアップストリームで実行されているCGIのような環境の環境を簡単にサニタイズできます。

UbuntuおよびDebianサーバー

UbuntuおよびDebianサーバーでは、FastCGIパラメーターは通常、 fastcgi_params また fastcgi.conf FastCGIプロキシを設定するときのファイル。 設定を解除できます HTTP_PROXY これらのファイルの両方のヘッダー:

  1. echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
  2. echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params

FastCGIプロキシを構成するときにファイルの1つを調達していない場合は、プロキシの場所自体にこの同じ行を含めるようにしてください。

/etc/nginx/sites-enabled/some_site.conf
. . .
    location ~ \.php$ {
        . . .
        fastcgi_param HTTP_PROXY "";
        . . .
    }
}

従来のHTTPプロキシにNginxを使用している場合は、HTTPをクリアする必要があります Proxy ヘッダーも。 HTTPプロキシヘッダーは、 /etc/nginx/proxy_params ファイル。 ルールを追加して、設定を解除できます Proxy 次のように入力して、そのファイルのヘッダーを作成します。

  1. echo 'proxy_set_header Proxy "";' | sudo tee -a /etc/nginx/proxy_params

この場合も、サーバーブロック構成内からこのファイルを取得しない場合は、プロキシの場所自体にファイルを追加する必要があります。

/etc/nginx/sites-enabled/some_site.conf
. . .
    location /application/ {
        . . .
        proxy_pass http://127.0.0.1;
        proxy_set_header Proxy "";
        . . .
    }
}

次のように入力して、構文エラーを確認します。

  1. sudo nginx -t

エラーが報告されない場合は、サービスを再起動します。

  1. sudo service nginx restart

CentOSおよびFedoraサーバー

CentOSとFedoraのNginxも同じものを使用します fastcgi_paramsfastcgi.conf FastCGIプロキシを構成するファイル。 設定を解除します HTTP_PROXY 次のように入力して、これらのファイルの両方にヘッダーを追加します。

  1. echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi.conf
  2. echo 'fastcgi_param HTTP_PROXY "";' | sudo tee -a /etc/nginx/fastcgi_params

FastCGIプロキシを構成するときにこれらのファイルのいずれかを調達していない場合は、プロキシの場所自体にこの同じ行を含めるようにしてください。

/etc/nginx/nginx.conf
. . .
    location ~ \.php$ {
        . . .
        fastcgi_param HTTP_PROXY "";
        . . .
    }
}

従来のHTTPプロキシにNginxを使用している場合は、HTTPをクリアする必要があります Proxy ヘッダーも。 設定を解除するルールを追加する必要があります Proxy 実行している任意の場所のヘッダー proxy_pass. どこかわからない場合 proxy_pass が使用されている場合は、構成ディレクトリを簡単に検索できます。

  1. grep -r "proxy_pass" /etc/nginx
Output
/etc/nginx/nginx.conf.default: # proxy_pass http://127.0.0.1;

コメントアウトされていない結果(上記の例のように)は、次のように編集する必要があります proxy_set_header Proxy "";:

/etc/nginx/nginx.conf
. . .
    location /application/ {
        . . .
        proxy_pass http://127.0.0.1;
        proxy_set_header Proxy "";
        . . .
    }
}

次のように入力して、構文エラーを確認します。

  1. sudo nginx -t

エラーが報告されない場合は、サービスを再起動します。

  1. sudo service nginx restart

HAProxyを使用したHTTPプロキシヘッダーの削除

HAProxyを使用してトラフィックをアプリケーションサーバーに転送している場合は、 Proxy トラフィックを転送する前のヘッダー。

開く /etc/haproxy/haproxy.cfg 編集用ファイル:

  1. sudo nano /etc/haproxy/haproxy.cfg

あなたは設定することができます http-request のディレクティブ frontend, backend、 また listen 構成のセクション。

/etc/haproxy/haproxy.cfg
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
    . . .

これらは各セクションで設定する必要はありませんが、含めることで問題はありません。 終了したら、ファイルを保存して閉じます。

次のように入力して構文を確認します。

  1. sudo haproxy -c -f /etc/haproxy/haproxy.cfg

問題が見つからない場合は、次のように入力してサービスを再起動します。

  1. sudo service haproxy restart

結論

HTTPoxyの脆弱性はかなり長い間公開されており、Web上にデプロイされた多数のアプリケーションに影響を与える可能性があります。 幸いなことに、任意のWebサーバーに固有のヘッダー変更機能を使用して修正するのは簡単です。

モバイルバージョンを終了