ホームページ  >  記事  >  運用・保守  >  PHP リモート コード実行の脆弱性の概要

PHP リモート コード実行の脆弱性の概要

王林
王林転載
2020-04-09 15:35:593193ブラウズ

PHP リモート コード実行の脆弱性の概要

前書き:

2019 年 9 月 26 日に、PHP は脆弱性情報を正式にリリースしました。この脆弱性情報では、リモートでコードが実行される脆弱性が正式に公開されました。これは、PHP-FPM の fpm_main.c ファイル内の env_path_info のアンダーフローが原因で発生します。

この脆弱性は、PHP-FPM Nginx が特定の構成と組み合わせて使用​​されている場合に存在します。この脆弱性のPoCは2019年10月22日に発表されており、PHPとNginxの組み合わせは広く利用されており、攻撃者はこの脆弱性を悪用して遠隔から任意のコードを実行できるため、より有害であるとしている。

PHP-FPM コンポーネントの紹介

PHP-FPM (FastCGI Process Manager) は、いくつかの追加機能を備えた別の PHP FastCGI 実装であり、さまざまな規模のサイトで使用できます。特に忙しいサイト。

PHP 5.3.3 より前の PHP の場合、PHP-FPM は、FastCGI プロセス管理を PHP パッケージに統合するように設計されたパッチ パッケージです。 PHP 5.3.3 より前の PHP を使用している場合は、PHP ソース コードにパッチを適用する必要があります。PHP をコンパイルしてインストールした後に使用できるようになります。

そして、PHP 5.3.3 には php-fpm が統合されており、サードパーティ パッケージではなくなりました。 PHP-FPM は、メモリとプロセスを効果的に制御し、PHP 設定をスムーズにリロードできる、より優れた PHP プロセス管理方法を提供します。

(調査の推奨事項: java ビデオ チュートリアル )

脆弱性の説明

この脆弱性は、PHP-FPM の fpm_main です。 c ファイルの env_path_info のアンダーフローにより、sapi/fpm/fpm/fpm_main.c ファイルの 1140 行目にポインタ演算が含まれます。これらのポインタ演算では、env_path_info のプレフィックスが php スクリプトのパスと等しいと想定されています。ただし、コードではこれらの前提条件が満たされているかどうかがチェックされず、チェックが行われないため、「path_info」変数に無効なポインタが含まれます。

このような条件は、標準の Nginx 構成で実装できます。次のような Nginx 構成がある場合:

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_pass   php:9000;
        ...
  }

攻撃者は改行文字 (%0a としてエンコード) を使用して、`fastcgi_split_path_info` ディレクティブの正規表現を壊すことができます。正規表現が壊れていると空の PATH_INFO が生成され、エラーが発生します。

このエラーは、コード実行の脆弱性を引き起こす可能性があります。背後のコードでは、FCGI_PUTENV を呼び出す前に、path_info[0] の値が 0 に設定されます。攻撃者は、慎重に選択した URL パス長とクエリ文字列を使用して、path_info が _fcgi_data_seg 構造体の最初のバイトを正確に指すようにすることができます。次に、それに 0 を入力すると、「char* pos」フィールドが後方に移動し、FCGI_PUTENV によって一部のデータ (他の高速 CGI 変数を含む) がスクリプト パスで上書きされます。

この手法を使用すると、攻撃者は偽の PHP_VALUE fcgi 変数を作成し、慎重に選択した一連の構成値を使用してコードを実行できます。

影響を受ける製品:

2019 年 9 月 26 日の更新より前にダウンロードされた PHP-FPM では、Nginx php-fpm サーバーに次の構成を使用する必要があります。影響を受ける。

location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
 
        fastcgi_pass   php:9000;
        ...
  }

修復の提案

ビジネスで次の構成が必要ない場合は、ユーザーが削除することをお勧めします:

fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;

推奨チュートリアル: サーバー セキュリティのチュートリアル

以上がPHP リモート コード実行の脆弱性の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsecpulse.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。