サーバー上でリモートコード実行を可能にするphp-fpmの脆弱性

利用できる PHP 7.3.11、7.1.33、および 7.2.24 の修正リリース。 排除された クリティカル 脆弱性 PHP-FPM (FastCGI Process Manager) 拡張機能の (CVE-2019-11043)。これにより、システム上でコードをリモートで実行できるようになります。 PHP スクリプトを実行するために Nginx と組み合わせて PHP-FPM を使用するサーバーを攻撃するために、すでに公開されています。 ワーキング エクスプロイト.

この攻撃は、「fastcgi_split_path_info」を使用して URL の一部を分離し、PATH_INFO 環境変数を定義することによって PHP-FPM への転送が実行される nginx 構成で可能ですが、最初に「try_files $fastcgi_script_name」を使用してファイルの存在を確認しません。ディレクティブまたは「if (!-f $) document_root$fastcgi_script_name)」。 問題はまた、 明らかになっている NextCloud プラットフォームに提供される設定で。 たとえば、次のような構造の構成があります。

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

次のページの配布キットで問題の解決策を追跡できます。 Debianの, RHEL, Ubuntu, SUSE/openSUSE, FreeBSDの, アーチ, フェドーラ。 回避策として、「fastcgi_split_path_info」行の後に、要求された PHP ファイルの存在のチェックを追加できます。

try_files $fastcgi_script_name =404;

この問題は、ファイル内のポインターを操作する際のエラーによって発生します。 sapi/fpm/fpm/fpm_main.c。 ポインターを割り当てる場合、PATH_INFO 環境変数の値には、PHP スクリプトへのパスと一致するプレフィックスが含まれている必要があると想定されます。
fastcgi_split_path_info ディレクティブが改行を区別する正規表現を使用してスクリプト パスを分割することを指定している場合 (たとえば、多くの例では "^(.+?\.php)(/.*)$" の使用が推奨されています)、攻撃者は空の値が PATH_INFO 環境変数に書き込まれます。 この場合、実行のさらに途中で です path_info[0]をゼロに書き込み、FCGI_PUTENVを呼び出します。

特定の方法でフォーマットされた URL をリクエストすることにより、攻撃者は path_info ポインタを「_fcgi_data_seg」構造の最初のバイトにシフトすることができ、このバイトにゼロを書き込むと「char* pos」が移動します。以前に配置されたメモリ領域へのポインタ。 次に呼び出される FCGI_PUTENV は、攻撃者が制御できる値でこのメモリ内のデータを上書きします。 指定されたメモリには他の FastCGI 変数の値も格納されており、攻撃者はそれらのデータを書き込むことで、架空の PHP_VALUE 変数を作成し、コードを実行することができます。

出所: オープンネット.ru

コメントを追加します