最近報告された脆弱性( CVE-2019-11043 )は、PHP-FPM を使用して PHP ページを実行する Web サイトに影響を与える可能性があります。 NGINX にはインプロセス PHP ランタイムがないため、NGINX を利用した Web サイトで PHP-FPM の使用が特に一般的です。 代わりに、NGINX は、PHP-FPM などのアプリケーション サーバーおよびプロセス マネージャーのリバース プロキシとして機能します。
この脆弱性は NGINX ではなく PHP-FPM 自体に存在するため、唯一保証された解決策は、PHP バージョンのパッチ適用リリース (またはそれ以降) にアップグレードすることです。 PHP 7.1.33 、 PHP 7.2.24 、またはPHP 7.3.11 。
NGINX は FastCGI プロトコルを使用して PHP-FPM と通信します。 各 FastCGI メッセージには環境変数のセットが含まれています。 これらのうちの 1 つ、 PATH_INFO は
、他のリクエスト パラメータから派生します。 値が予期せず空の場合、最終的にPHP-FPM バイナリのメモリ破損を引き起こす可能性があります。 この状況を悪用して、PHP-FPM バイナリにローカル サーバー上で任意のコマンドを実行させることが可能です。
この脆弱性は、NGINX がfastcgi_split_path_info
ディレクティブで正規表現を使用してリクエスト URI を 2 つの部分に分割する一般的な NGINX 構成によって引き起こされる可能性があります。 脆弱性を引き起こす 1 つの方法は、リクエスト URI に改行 ( %0a
) または復帰 ( %0d
) 文字を埋め込むことです。この場合、正規表現によって正しく処理されません。
前述のように、この脆弱性に対処する唯一の確実な方法は、PHP バージョンのパッチ適用リリース (またはそれ以降) にアップグレードすることです。 PHP 7.1.33 、 PHP 7.2.24 、またはPHP 7.3.11 。
PHP バイナリをすぐにアップグレードできない場合は、いくつかの部分的な緩和策を実行できます。
さまざまな情報源から、 $uri
変数がファイル(PHPスクリプト)に解決されることを確認するために、NGINX設定にtry_files
ディレクティブを追加し、コードでリクエストを拒否することが提案されています。 404
(
見つかりません)
そうでない場合:
場所 ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
try_files $uri =404;
#...
}
この軽減策は、NGINX と PHP-FPM が同じホスト上で同じ docroot を共有している場合にのみ機能することに注意してください。
PHP 構成は、アップストリーム アプリケーションのニーズに応じて異なります。 このような変更をテストして、アプリケーションに影響がないことを確認してください。
F5 BIG-IP ASM (アプリケーション セキュリティ マネージャ) を使用してアプリケーションを保護します。 既存の「コマンド実行」および「サーバー側コードインジェクション」シグネチャ セットには、この PHP-FPM の脆弱性を発見して悪用しようとするほとんどの試みをブロックする攻撃シグネチャが含まれています。
編集者 – このブログが公開されて以来、F5 セキュリティ チームはこの脆弱性に特化した追加のシグネチャをリリースしました。 詳細については、 F5 DevCentralを参照してください。
疑わしい%0a
または%0d
文字を含むリクエストをブロックする ModSecurity ルールを追加します。
SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:lowercase,deny"
この解決策は、脆弱性に関する Wallarm の元のレポートに記載されていますが、誤検知が発生する可能性があり、攻撃者が脆弱性を悪用する他の方法を見つける可能性があります。
PHP-FPM に依存するのではなく、 NGINX Unit を使用して PHP アプリケーションを実行できます。 NGINX Unit は、PHP に加えて多数の言語とフレームワークをサポートする、高性能なオープンソース アプリケーション サーバーおよびプロセス マネージャーです。 負荷に応じて PHP アプリケーションを自動スケーリングし、異なる PHP ランタイムを使用するアプリケーションを同時に実行できます。 バイナリ、ソース、Docker イメージを無料で提供します。
トラフィック量が多く人気のある PHP ベースのアプリケーションである WordPress 用の NGINX Unit の構成と操作の手順については、NGINX Unit のドキュメントを参照してください。 このデプロイメントでは、 NGINX Unit 1.11.0以降の静的ファイルの提供のサポートを活用します。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"