CVE-2023-0662 の詳細まとめ

2023-03-15
PHP

CVE-2023-0662 が公開されました。

https://nvd.nist.gov/vuln/detail/CVE-2023-0662

Score は 7.5 となっており、 high と赤文字で表示されています。

Score のリンクをクリックすると、詳細を見ることが出来ます。

項目 評価 メモ
Attack Vector Network ネットワーク経由で攻撃可能
Attack Complexity Low 攻撃がかんたん
Privileges Required None 特別な権限がなくても攻撃可能
User Interaction None ユーザーが特に操作する必要がなくても攻撃可能
Confidentiality Impact None 情報漏えいリスクは無し
Integrity Impact None 情報改ざんリスクは無し
Availability Impact High 業務停止可能性は高い

IPA のウェブサイトに CVSS Version3 のスコアについての解説があります。興味がでた人は、さらにチェックしてみましょう!

https://www.ipa.go.jp/security/vuln/CVSSv3.html

対応する必要あるのか?

むろん、対応しておくに越したことはないのですが、対応したとしても DoS 攻撃自体は根本的には防ぐことが難しいため、ちゃんとマイナーバージョンをアップしておきましょうねという感じです。今すぐというよりは、定期メンテとかで上げても遅くは無い気がします。

実際に手元で、PoC を作って攻撃してみましたが、本脆弱性のある無しに関わらず、大量リクエストが来れば ウェブサーバーは詰まってしまうので、DoS 攻撃を受けたときのプラスアルファのひどい状態を防ぐという趣旨の脆弱性対応だと思いました。

影響を受けるバージョン

すべてのバージョンの PHP が影響を受けます。

PHP ソースに入った修正内容

該当のコミットはこちらです。

https://github.com/php/php-src/commit/716de0cff539f46294ef70fe75d548cd66766370#diff-2978fe1c2c45b4eca89dc476376ddc7193bc4e5e7fff0c7d1c465f057b35a5e6

max_multipart_body_parts という設定項目が php.ini に追加されています。この数値は multipart 送信された HTTP リクエストのボディをパースする際に、何個のパーツまで許可するかという設定です。

対応前だと、 while ループ内で、すべての Body を読み取るまでループが回り続ける状態でした、対応後は設定された値で早期 return するようになっています。

設定値のデフォルトは -1 です。負の数値が設定された場合は max_file_uploadsmax_input_vars を足した数が設定されます。デフォルト状態では 1020 になります。

自然数が設定された場合は、そちらが使われます。

そもそも PHP が リクエスト Body を受取る仕組み

ほとんどすべての PHP ウェブアプリケーションは、以下の仕組みで動いています。

  1. Apache + mod_php
  2. Nginx + php-fpm

リクエスト Body は、まず前段にいるウェブサーバーの設定の影響を受けます。

Apache -> LimitRequestBody デフォルト 0 で無制限
Nginx -> client_max_body_size デフォルト 1MB

そのため、今回の脆弱性対応の一貫として、ウェブサーバーの設定を確認することをまずおすすめします。無制限となると、大きいリクエスト Body を送りたい放題ですので、少し大きめの値で良いので設定値を入れると良いと思います。

次に PHP 側です

  • post_max_size デフォルト 8M
  • upload_max_filesize デフォルト 2M

この辺の値は、むやみに大きい値にしていると、今回の脆弱性の影響をさらに受けやすくなります。

おすすめとしては、ウェブサーバー側と PHP 側で リクエストボディのサイズは合わせた上で、サービスに必要な十分で大きさの最小値にしておくと良いと思います。Apache の無制限設定はやめたほうが良いでしょう。

余談

https://github.com/php/php-src/security/advisories/GHSA-54hq-v5wp-fqgv

最近、 Security ってタブが増えていて、脆弱性が表示されるようになっている