CVE-2022-31631 (CVSS 9.1): Critical PHP Flaw Exposes Websites to SQL Injection Attacks
2025/02/16 SecurityOnline — PHP で発見された深刻な脆弱性により、Web サイトやアプリケーションが SQL インジェクション攻撃にさらされる可能性が生じている。ユーザーに対して、強く推奨されるのは、可能な限り早急に、最新バージョンへと PHP を更新することだ。
この脆弱性 CVE-2022-31631 (CVSS:9.1) は、PHP のバージョン 8.0.27 未満/8.1.15 未満/8.2.2 未満に影響を及ぼすものだ。この欠陥は、SQLite データベースで使用される、PDO::quote() 関数内に存在する。この関数は、データベース・クエリを実行する前に、ユーザーが入力したデータをサニタイズするものであり、SQL インジェクションを防ぐための重要なステップである。

脆弱性 CVE-2022-31631 は、整数オーバーフローの問題に起因する。 PDO::quote() 関数に対して、長すぎる文字列が渡されると、入力が適切にエスケープされないケースが生じる。それにより、不正な SQL クエリが作成され、悪意のコードを挿入する攻撃者に、データベースの制御を許す可能性が生じる。
根本的な問題は、PHP における文字列長の処理の方法にある。基盤となる SQLite 関数 sqlite3_snprintf() は、長さパラメータに 32 Bit の整数を使用する。その一方で、PHP の PDO::quote() は zend_long を使用するが、最近のシステムでは 64 Bit に設定されるという。この不一致により、整数オーバーフローが発生し、長さの値がラップ・アラウンドしてしまい、文字列が不適切に引用される可能性が生じる。
このオーバーフローにおける特定のシナリオでは、関数が単一のアポストロフィを返すこともあり、意図したサニタイズが無効化され、SQL インジェクションへの扉が開かれる。メモリ制限と post_max_size 設定により、ある程度の緩和策が得られる可能性はあるが、この脆弱性に対する信頼できる保護策とはならない。
32 Bit システムでは、整数と zend_long のサイズが同一であるため、理論的には影響を受けにくいが、64 Bit アーキテクチャは脆弱になる。提供されるテスト・スクリプトが示すのは、このオーバーフローの悪用の方法である。
この脆弱性は、SQLite データベースの影響を受ける PHP バージョン上の、すべてのアプリケーションに対して重大なリスクをもたらす。SQL インジェクションを引き起こす攻撃者は、機密データの窃取/データベース・コンテンツの改竄に加えて、サーバの制御を奪う可能性も手にする。
したがって、すべての PHP ユーザーにとって重要なことは、パッチ適用された PHP 8.0.27/8.1.15/8.2.2 へと、速やかにアップグレードすることだ。また、Web サイトの管理者と開発者は、適切なデータ・サニタイズ・プラクティスの実施を確認するために、更新後におけるコードの徹底的な調査が必要となる。
PHP の SQLi 脆弱性が FIX しました。この脆弱性は 2022 年に採番されていたものですが、つい最近のアップデートで修正されたようです。ご利用のチームは、アップデートを、ご確認ください。前回の PHP に関するトピックは、2024/11/25 の「PHP の脆弱性 CVE-2024-8929 などが FIX:PoC も提供されている」です。よろしければ、PHP で検索と併せて、ご参照下さい。
You must be logged in to post a comment.