NGINXによるPHP-FPMの脆弱性(CVE-2019-11043)への対処

NGINX | 2019年10月29日

最近報告された脆弱性「CVE-2019-11043」は、PHPページの実行にPHP‑FPMを使用する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が正規表現を使用してリクエストURIを2つの部分に分割する、一般的なNGINX構成で発生する可能性があります。この正規表現は、fastcgi_split_path_infoディレクティブで使用されます。この脆弱性を引き起こす方法の1つは、改行文字(%0a)またはキャリッジリターン文字(%0d)をリクエストURIに埋め込むことです。これらの文字は正規表現で正しく処理されません。

脆弱性の緩和

前述のとおり、この脆弱性に確実に対処する唯一の方法は、使用しているPHPのバージョンを、パッチ適用済みの以下のリリース(またはそれ以降)にアップグレードすることです:PHP 7.1.33、PHP 7.2.24、またはPHP 7.3.11。

PHPバイナリをすぐにアップグレードできない場合は、次のような部分的な緩和策を講じることができます。

  1. 複数の情報源では、NGINXの設定にtry_filesディレクティブを追加し、$uri変数がファイル(PHPスクリプト)として解決されることを確認したうえで、解決されない場合はコード404 (Not Found)でリクエストを拒否する方法が提案されています。
location ~ [^/]\.php(/|$) {    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    fastcgi_param           PATH_INFO $fastcgi_path_info;
    try_files               $uri =404;
    #...
}
  1. この緩和策は、NGINXとPHP‑FPMが同じホスト上で同じドキュメントルートを共有している場合にのみ有効です。PHPの構成は、アップストリームアプリケーションの要件によって異なります。このような変更を行う際は、アプリケーションに影響がないことをテストで確認してください。
  2. F5 BIG-IP ASM(Application Security Manager)を使用してアプリケーションを保護します。既存の「Command Execution」および「Server Side Code Injection」シグネチャセットには、このPHP‑FPMの脆弱性を検出して悪用しようとする試みの大半をブロックする攻撃シグネチャが含まれています。編集者注 – このブログの公開後、F5 Security Teamは、この脆弱性に特化した追加のシグネチャをリリースしました。詳細については、F5 DevCentralをご覧ください。
  3. 不審な文字「%0a」または「%0d」を含むリクエストをブロックするModSecurityルールを追加します:
SecRule REQUEST_URI "@rx %0(a|A|d|D)" "id:1,phase:1,t:lowercase,deny"
  1. この解決策については、脆弱性に関するWallarmの原報告に記載されています。ただし、誤検知が発生する可能性があり、攻撃者がこの脆弱性を悪用する別の方法を見つける可能性もあります。

別のPHPプロセスマネージャーの使用

PHP‑FPMに依存する代わりに、NGINX Unitを使用してPHPアプリケーションを実行できます。NGINX Unitは、高性能なオープンソースのアプリケーションサーバー兼プロセスマネージャーであり、PHPに加えて多数の言語とフレームワークをサポートしています。負荷に応じてPHPアプリケーションを自動的にスケーリングできるほか、異なるPHPランタイムを使用するアプリケーションを同時に実行できます。バイナリ、ソース、Dockerイメージを無償で提供しています。

人気が高くトラフィック量の多いPHPベースのアプリケーションであるWordPress向けにNGINX Unitを構成し、運用する手順については、NGINX Unitドキュメントを参照してください。このデプロイでは、NGINX Unit 1.11.0以降の静的ファイル配信のサポートを活用しています。


共有

著者について

Owen Garrett
Owen Garrettプロダクトマネジメント担当シニアディレクター

Owen Garrettのその他のブログ記事

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります