【PHP】CVE-2024-4577への対応必要性について

セキュリティ

 先日PHPの脆弱性(JVN-2024-3292、CVE-2024-4577)が発表されました。(公開日 2024/06/09)
 PHPを使ったサイトを運営している者として、原因と対応の必要性について調査した結果について記載します。

● 公開された脆弱性(日本国内)

 今回の脆弱性公表日は2024/6/9でした。
 
 CVE-2024-4577,JVN-2024-3292 危険性 緊急・致命的
 概要 OSコマンドインジェクションの脆弱性が存在します
 影響を受けるシステム
   PHP 5.0.0 以上 8.1.29 未満 (8.1.29は大丈夫!)
   PHP 8.2.0 以上 8.2.20 未満 (8.2.20は大丈夫!) 
   PHP 8.3.0 以上 8.3.8 未満 (8.3.8は大丈夫!)
 とのこと。

  正直なところ、これだけでは正確なリスク判断を行う情報が足りません。
  バージョンアップをするメリットとデメリットを比較しなければ、事態の重要度を判断することはできません。
  もう少し不具合(脆弱性)の特性や原因をある程度解説し、
     応急対策や恒久対策の具体的な説明
 をしてほしいと思ったので、自分で調べることにしました。

  今回は、JPCERT/CCとIPA(情報処理推進機構)が共同で運営しているJVN情報を出発点に、情報を集めました。  

 データベース情報(https://jvndb.jvn.jp/ja/contents/2024/JVNDB-2024-003292.html)より抜粋

● CVE-2024-4577が持つ脆弱性

  CVE番号から海外の参考文献を確認したところ、本ケースの原因が見えてきました。
  参考文献からまとめた私の私見となりますが、

    CVE-2024-4577の原因は、PHP-CGIが受け取ったリクエストパラメータをwin32APIに渡す際に、BesFit機能(Unicode コードで書かれた文字をASCIIコードの似た文字に変換する機能)が働き、本来リクエストできないはずの[-d]オプションを送信できてしまうことが原因
    一部の文字コード(日本語、中国語で確認)環境のみで確認されている
    Unicodeコード「0xad(ハイフンではない)」がBestFitによってASCIIコードの「-(ハイフン)」に置き換えられてしまう
    PHPには外部スクリプトを制限する、allow_url_includeという設定があるが、同じ脆弱性を利用するとこの制限を解除することができ、php.exeに任意のphpコードを送信、実行させることができるようになる

というものです。(私なりの解釈ですので、詳しい方は海外のサイトを直接確認してください)
 ですから、今回の脆弱性によって影響を受ける構成は
    win32APIを使用しているWindowsサーバ
    日本語ロケールを使用している
    PHPのver(5.0.0 以上 8.1.29 未満,8.2.0 以上 8.2.20 未満, 8.3.0 以上 8.3.8 未満)
となります。
 アメリカはロケール対象外ですので、
   アメリカのネット上にはエクスプロイトコードが散見される状態
    丁度このタイミングで土日が来ることから、対応が遅れるのではないかとの心配の声
があり、ちょっと危険な香りがしています。(情シスさんガンバレ!)
 
関連記事 脆弱性対策情報データベースの関連記事より一部抜粋
 National Vulnerability Database (NVD) : CVE-2024-4577
 www.openwall.com (oss-security/2024/06/07/1)
 arstechnica.com (php-vulnerability-allows-attackers-to-run-malicious-code-on-windows-servers)
 blog.orange.tw (cve-2024-4577-yet-another-php-rce)
 cert.be (warning-php-remote-code-execution-patch-immediately)
 devco.re (security-alert-cve-2024-4577-php-cgi-argument-injection-vulnerability-en)
 isc.sans.edu (diary/30994)
 labs.watchtowr.com (no-way-php-strikes-again-cve-2024-4577) 
 www.imperva.com (imperva-protects-against-critical-php-vulnerability-cve-2024-4577)

● 危険性

 今回の脆弱性については、PHPがパッチをリリースし脆弱性を公開してから2日後には、この脆弱性を利用したランサムウェアによる被害がすでに報告されており、エクスプロイトコードも出回っていることからかなり危険性が高い脆弱性といえます。
 php.exeにどのような命令も送ることができてしまうということは、
    ランサムウェアによるサーバ破壊
    system関数を使ったリモート攻撃
    バックドアとなるプロセスを起動させて、継続的に情報を搾取
といった攻撃が考えられます。

● 対策について

 可能な対策としては 「PHPのバージョンを上げる」 ことが一番の対策となります。
 しかし、稼働中のサーバに対するバージョンアップは、かなり慎重に行っているのが現状と思いますので、暫定措置をとった上でバージョンアップを行う企業が多いのではないでしょうか。
 今回のケースであれば、Unicode[0xad]をハイフンに置き換えられることが根本原因ですので、.htaccesshttpd.confファイルを使って、ハイフンに置き換えられる恐れのある[0xad]を入力させない設定を加えるという暫定対策をとることができます。

〇 暫定措置参考対応
 (環境に応じて適切に修正してください)

(例)rewrite_module 
#LoadModule rewrite_module modules/mod_rewrite.so
↓
# CVE-2024-4577 暫定対応 2024-06-?? PHP verをアップデート後に解除すること
LoadModule rewrite_module modules/mod_rewrite.so

# 末尾に追加
# CVE-2024-4577 暫定対応 2024-06-?? PHP verをアップデート後に解除すること
<Directory "${SRVROOT}/htdocs">
    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^%ad [NC]
    RewriteRule .? - [F,L]
</Directory>

クエリ文字列に%adを含むURLをすべてブロックする(403 Forbiddenエラー)設定です

上の暫定対応を行ったローカルサーバに%adを含むエクスプロイトコードを送信しましたが、403エラーが返ってきているのがわかります。
 

このような対応も難しい場合には、アップデートの準備が整うまで、CGIモジュールをコメントアウトしてしまうことも検討しなければならないかもしれません。 

今回の脆弱性対応バージョンについては、PHP公式サイトにおいて2023/6/6に、対応パッチが公開されています。
 CVE-2024-4577以外の脆弱性も修正してあるとのことですので、なるべく早期にアップデートをした方がよさそうです。
 https://nvd.nist.gov/vuln/detail/CVE-2024-4577

 なお、私が利用しているレンタルサーバのPHPバージョンを確認したところ、8.3未満だったことから憂慮していたのですが、サーバOSがWindowsではありませんので、管理会社の対応を見守りたいと思います。
 ローカル環境のPHPは最新版にしました。w