CakePHP 5.4.3以前にSQLインジェクションの脆弱性
CakePHP 5.4.3以前に、ウィンドウ関数の指定へユーザー入力を渡すアプリでSQLを実行される脆弱性が公表されました。使っている版と該当する実装の有無を調べ、修正版へ更新してください。
急ぎ度: 早めに
CVSS v3は8.1、v4は9.2と高く、公表直後で修正の変更内容もすでに公開されているため、該当するなら早めの更新が望ましい状況です。
関係があるか
CakePHP 5.4.3以前でWebアプリを作っている組織が対象です。とくに、画面の検索条件や並べ替えの値を、集計クエリのウィンドウ指定に渡している業務システムや集計画面が当てはまります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| cakephp/cakephp(Composerパッケージ) | 5.4.3以前 | 5.4.3より後の版で修正されます。具体的な版番号はCakePHPのリリース告知とGitHubのアドバイザリで確認してください |
確かめ方
- 1composer.lockまたは
composer show cakephp/cakephpで、導入されているCakePHPの版を確認します。 - 2自社のソースコードで、WindowExpressionのrange()とframe()、またはクエリビルダーのウィンドウ指定を呼ぶ箇所を検索します。
- 3見つかった箇所で、オフセットや方向の値がリクエストのパラメーターなど外部入力から来ていないかをたどります。
- 4サードパーティのプラグインやvendor配下のコードが同じ呼び出しをしていないかも、あわせて検索します。
何が起きたか
CakePHPのクエリ構築機能に、SQLインジェクションの脆弱性が見つかりました。アプリが外部からの入力を特定の集計指定に渡していると、データベース接続の権限でSQLを実行されるおそれがあります。
原因は、WindowExpression::range()とframe()にあります。ウィンドウ関数のフレームを決めるオフセットと方向を受け取りますが、値を検証しないままSQL文に組み込みます。その結果、OVER句に細工した値が入ると、SQLの構文として解釈されます。
公表は2026年10月30日で、識別子はGHSA-h3r5-88vp-3qm7です。種類はCWE-89、重要度はhighで、CVSS v3は8.1、v4は9.2です。
攻撃の流れ
-
1
入力を受ける
アプリが画面やAPIのパラメーターとして、集計の範囲や方向の値を受け取ります。
-
2
指定に渡る
その値が検証されないまま、ウィンドウ関数のフレーム指定に渡されます。
-
3
SQLに混入
値がOVER句のSQL文の一部として組み立てられます。
-
4
DBが実行
データベースがアプリの接続権限でそのSQLを実行します。
どう悪用されるか
悪用に認証は要らず、ネットワーク経由で届き、利用者の操作も必要ありません。ただし、アプリがユーザー入力をOVER句のフレーム指定へ渡す実装になっていることが前提です。この条件があるため、攻撃の複雑さは高と評価されています。
条件を満たすと、機密性・完全性・可用性のすべてに大きな影響が出ます。データベース接続が持つ権限の範囲で、情報の読み出し、書き換え、削除が起こりえます。接続に強い権限を与えているシステムほど、被害は広がります。
今すぐやること
-
1
導入版を確認する
本番・検証を含め、CakePHPを使うすべてのアプリで版を調べます。5.4.3以前なら対象です。
composer show cakephp/cakephp -
2
該当する呼び出しを探す
ウィンドウ関数のフレーム指定を使う箇所を検索し、外部入力が渡っていないかを確認します。見つからなければ、この経路での影響は小さいと考えられます。
grep -rn "WindowExpression\|->range(\|->frame(" src/ plugins/ -
3
修正版へ更新する
CakePHPのリリース告知とGitHubのアドバイザリで修正版の番号を確かめ、その版へ更新します。更新後は、集計や並べ替えの画面を中心に動作を確認してください。
-
4
ログを見直す
公表前から該当の実装があった場合は、データベースやアプリのログに、集計画面まわりの想定外のSQLやエラーがないかを調べます。
-
5
接続権限を絞る
アプリが使うデータベースユーザーに、読み取り専用のテーブルを含めて不要な権限がないかを見直します。今回の脆弱性に限らず、被害の範囲を狭める手になります。
すぐ更新できないとき
すぐに更新できないときは、フレームのオフセットと方向にユーザー入力を直接渡さないようにします。オフセットは整数に変換して上限と下限を決め、方向は決まった語(PRECEDINGやFOLLOWINGなど)の許可リストで判定してから渡してください。入力が使われているルートや画面を一時的に止める方法もあります。
背景
CakePHPはPHP向けのWebフレームワークで、ORMとクエリビルダーを備えています。業務システムや社内向けの管理画面で長く使われており、データベースを直接触る部分を担うため、ここに脆弱性があると影響がデータそのものに及びます。
ORMは通常、値をプレースホルダーに分けてSQLインジェクションを防ぎます。ところが、ウィンドウ関数のフレーム指定のように、値が構文の一部として文中に置かれる部分は、プレースホルダーで守りにくい場所です。今回の脆弱性は、まさにそこで入力の検証が抜けていたことが原因です。
よくある質問
Q.ウィンドウ関数を自分では使っていません。更新は不要ですか。
Q.WAFで防げますか。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| cakephp | cakephp |
5.4.3 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
CakePHP through 5.4.3 contains an sql injection vulnerability that allows attackers to inject SQL by supplying unvalidated frame offsets and directions to WindowExpression::range() and frame(). Attackers can pass crafted values through applications forwarding user input into the OVER clause to execute SQL with the database connection's privileges.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory abraxaslabs.tech
- advisory vulncheck.com
- advisory nvd.nist.gov
- advisory github.com
- package github.com
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- web github.com
- web github.com
- web github.com