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 ソースに入った修正内容
該当のコミットはこちらです。
max_multipart_body_parts
という設定項目が php.ini
に追加されています。この数値は multipart
送信された HTTP リクエストのボディをパースする際に、何個のパーツまで許可するかという設定です。
対応前だと、 while ループ内で、すべての Body を読み取るまでループが回り続ける状態でした、対応後は設定された値で早期 return するようになっています。
設定値のデフォルトは -1
です。負の数値が設定された場合は max_file_uploads
と max_input_vars
を足した数が設定されます。デフォルト状態では 1020 になります。
自然数が設定された場合は、そちらが使われます。
そもそも PHP が リクエスト Body を受取る仕組み
ほとんどすべての PHP ウェブアプリケーションは、以下の仕組みで動いています。
- Apache + mod_php
- 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 ってタブが増えていて、脆弱性が表示されるようになっている