Technical Blog テクニカルブログ
  1. HOME
  2. テクニカルブログ
  3. PHPの脆弱性CVE-2024-4577 について

PHPの脆弱性CVE-2024-4577 について

投稿者:SS#3 熊谷

はじめに

2024年6月から7月にかけて、PHPの脆弱性(CVE-2024-4577)情報が公開されました。
この脆弱性はセキュリティコンサルティング会社 DEVCORE の研究者によって発見され、リモートコード実行の脆弱性として報告されています1

特定のロケール設定 (中国語繁体字(Code Page 950)/簡体字(Code Page 936),日本語(Code Page 932))で動作するWindows 環境では攻撃が可能であることが確認されており、脅威アクター TellYouThePass によって、本脆弱性を利用したランサムウェア攻撃も観測されています。
Censys ではこのランサム被害にあったサーバー台数についてのダッシュボード2が閲覧可能です。
(Censys : インターネット接続デバイス検索エンジン)

IPA(独立行政法人情報処理推進機構)は2024年7月5日以降、該当Web サービスにwebshell が設置されていたとの指摘3もあるとして、本脆弱性を報告しています。

本記事では、脆弱性の影響・対策と概要(どのような脆弱性であったか)を整理します。

影響

影響を受ける対象は、Windows においてPHP をCGI モード(PHP-CGI)で実行している環境となります。
また、Windows 版XAMPP のデフォルト設定のように、PHP バイナリを公開している環境も影響を受けます。

この脆弱性の対象となるPHPバージョンは下記。

PHP 8.1 < 8.1.29
PHP 8.2 < 8.2.20
PHP 8.3 < 8.3.8
※ PHP 5, PHP 7, PHP 8.0 系はサポートが終了しているバージョンですが、バージョンのアップグレードが推奨とされています。

影響を受ける環境の場合、本脆弱性を悪用されると、攻撃者はリモートから任意のコードが実行可能となる恐れがあります。
これにより、情報漏洩やシステムの破壊、ランサムウェアによる被害の他、webshell 設置によって、一度侵害されたサーバーは持続的にリモート制御される可能性があります。
また、侵害を受けたサーバーはマルウェアの設置・配信やDDoS攻撃 といった新たな攻撃のリソースとして利用される可能性もあります。

対策

PHP を下記のバージョン以上へアップデートしてください。
PHP 8.1.29
PHP 8.2.20
PHP 8.3.8

また、以下の緩和策1が挙げられています。

① PHPのバージョンアップができない場合
Apache Rewriteモジュール(mod_rewrite)に以下の設定をし、クエリ文字列が「%ad」で始まるリクエストを拒否します。

RewriteEngine On
RewriteCond %{QUERY_STRING} ^%ad [NC]
RewriteRule .? - [F,L]

② “CGI 機能を利用していない” Windows 版XAMPP を使用している場合
Apache の設定ファイル(httpd-xampp.conf)内の以下記述をコメントアウトします。

#ScriptAlias /php-cgi/ "C:/xampp/php/"

脆弱性の詳細

今回の脆弱性(CVE-2024-4577)は、古い脆弱性(CVE-2012-1823)の修正をバイパスするものになります。

元々、PHP 5.3.12, PHP 5.4.2 以前の5.3系、5.4系で動作するCGI 版PHP には、リモートコード実行が可能な脆弱性(CVE-2012-1823)が存在していました。これは特定のクエリ文字列はPHP-CGI の引数として指定される仕様を悪用したものになります。

例えば、以下は「-s オプション(ソースの表示)が指定された」と解釈され、対象のPHP スクリプトが実行される代わりにスクリプトのソースを表示してしまいます。

http://{host}/script.php?-s

次に、php.ini ディレクティブをスクリプト実行時に上書きすることができる -d オプションを利用した例です。

http://{host}/script.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input

ここでは、2つのphp.iniディレクティブ指定をしています。(URL エンコードに注意してください)
 -d allow_url_include=On ⇒ 外部リソース(URL)からPHP スクリプトをインクルードすることが可能
 -d auto_prepend_file=php://input ⇒ インクルードするURL/ファイルを指定
 ※例のように、攻撃者がURL を用意する代わりに php://input を指定するとリクエストボディを実行させることができます。

この仕様によって、インターネット上のURL、または以下のようなPOST リクエストのボディを介したリモートコード実行が可能となりました。

curl https://{host}/script.php?-d+allow_url_include%3DOn+-d+auto_prepend_file%3Dphp://input -X POST -d "<?php system('calc');?>"

そして、今回の脆弱性(CVE-2024-4577)はWindows がUnicode を変換する際に利用する、Best-Fit マッピングの機能4 によって脆弱性(CVE-2012-1823)への修正がバイパスされたものとなります。
Best-Fit はWin32 API に渡されるコマンドライン文字列を変換することがあり5、例えば「- (ソフトハイフン)」(0xAD)は「- (ハイフン)」(0x2D)と解釈されます。
この機能が見落とされていたために、攻撃者が送信した「ソフトハイフン」はエスケープされずにCGI ハンドラからPHP に渡される一方で、PHPは「ハイフン」(0x2D)と解釈し実行。脆弱性(CVE-2012-1823)に対する「ハイフン」のエスケープをすり抜けてクエリが実行できる、脆弱性(CVE-2024-4577)が発見されました。

さいごに(PoC情報)

脆弱性(CVE-2024-4577)については既に(実際には無害な)攻撃コード6 が複数公開されていす。これらには対象ホストが脆弱であるかチェックするスクリプトが含まれており、リストファイルに記述したホスト一覧への検査が可能なものもあります。
(対象が少ない場合は、手元のプロンプトから細工したリクエストを投げることが最も簡単な検査方法です。)
※許可のないホストへは実行しないでください

PoCの実行結果

独立した環境にある、脆弱性のあるホスト(IP末尾 .31)と、影響を受けないホスト(IP末尾 .18)で検証した結果です。
脆弱性の影響を受けるホストに対しては「Vulnerable」が返されます。

実行内容としては、POSTメソッドのパラメータとしてphpinfo() を実行させるスクリプトを渡し、レスポンスに「PHP Version」が含まれているかどうかで判定しているようです。
※攻撃シナリオのひとつにすぎないため、脆弱性の有無を保証するものではありません。


最後までご覧いただきありがとうございました。

なお、弊社では SaaS型のWebアプリケーション脆弱性診断サービス「AeyeScan」による、脆弱性診断の内製化に必要な機能を提供しています。また、こうした脆弱性を悪用した攻撃が、どのように行われているのかをハンズオン形式で体験いただく「セキュリティアリーナ」を開催しています。
詳細については、本ページ下部の「関連ソリューション」をご確認ください。

参考

1 Security Alert: CVE-2024-4577 – PHP CGI Argument Injection Vulnerability
2 PHP Infected Hosts
3 PHPの脆弱性(CVE-2024-4577)を狙う攻撃について
4 [MS-UCODEREF]: WCTABLE | Microsoft Learn
5 NVD-CVE-2024-4577
6 GitHub – ZephrFish/CVE-2024-4577-PHP-RCE: PHP RCE PoC for CVE-2024-4577 written in bash, go, python and a nuclei template

ページのトップへ