CakePHPにSQLインジェクションの脆弱性、修正版あり
CakePHPの5.4.3以前に、照合順序の名前を通じてSQLを差し込める脆弱性が公開されました。CakePHPで業務システムを動かしている担当者は、版を確認して修正版に更新し、照合順序に外部入力を渡していないかもコードで見直してください。
急ぎ度: 早めに
CVSS v3は8.1、v4は9.2と高く認証も不要ですが、攻撃複雑性が高く、アプリが照合順序名を外部入力から組み立てている場合に限られるため、定期の更新を待たず今週中に確認する水準です。
関係があるか
CakePHP 5.4.3以前で作られたWebアプリや業務システムが対象です。データベースの種類は問わず、すべてのドライバーが影響を受けます。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| CakePHP(cakephp/cakephp) | 5.4.3以前 | 5.4.3より新しい版。版番号と、4系以前の扱いはCakePHPの告知(GitHubのセキュリティアドバイザリ)で確認してください |
確かめ方
- 1プロジェクトのディレクトリで、導入されているCakePHPの版を確認します。5.4.3以前なら対象です。
- 2アプリのソースコードで、StringExpressionとIdentifierExpressionの生成箇所、およびsetCollation()の呼び出し箇所を検索します。
- 3見つかった箇所で、照合順序の名前がリクエストの値や設定画面の入力など、外部から決められる値になっていないかを読んで確かめます。固定の文字列だけなら、実際の悪用経路にはなりにくい状態です。
何が起きたか
CakePHPのクエリ生成部分に、SQLインジェクションの脆弱性が見つかりました。データベースに文字列の並び順(照合順序)を指定する処理で、渡された名前が検査されないままSQL文に入ります。悪用されると、データベース接続に与えられた権限の範囲で、データの読み取り、書き換え、削除ができてしまいます。
対象は、StringExpressionとIdentifierExpressionの二つのクラスです。コンストラクターまたはsetCollation()に渡した照合順序名が、引用符で囲まれないままCOLLATE句の後ろに置かれます。このため、名前の後ろにSQLを付け足せる状態でした。
CWEの分類はCWE-89(SQLインジェクション)です。修正は、CakePHPのリポジトリにコミットとプルリクエストとして取り込まれています。
攻撃の流れ
-
1
外部入力が到達
アプリが、利用者の指定した値を照合順序の名前として渡す実装になっている。
-
2
検査されずに通過
StringExpressionまたはIdentifierExpressionが、名前を検証せず引用符も付けない。
-
3
SQLが付け足される
COLLATE句の後ろに、本来のクエリと別のSQLが入り込む。
-
4
権限の範囲で操作
データベース接続のユーザーに許された範囲で、データの閲覧や改ざんが起きる。
どう悪用されるか
認証は不要で、ネットワーク経由で届き、利用者の操作も要りません。ただし、アプリが照合順序の名前を外部から決められる形で渡していることが前提です。CVSSの攻撃複雑性が高とされているのは、この前提があるためです。CakePHPを使っているだけで、すぐに誰でも突ける状態になるわけではありません。
悪用された場合の被害は、接続ユーザーの権限で決まります。読み取りだけでなく、更新や削除ができる権限で動いているアプリでは、顧客情報の流出、データの改ざん、テーブルの削除まで起こり得ます。
今すぐやること
-
1
導入中の版を確認する
本番、検証、開発の各環境で、CakePHPの版を確かめます。5.4.3以前が対象です。
composer show cakephp/cakephp -
2
修正版に更新する
CakePHPの告知で修正版の版番号を確認し、composer.jsonの制約を直したうえで更新します。検証環境で画面とバッチの動作を確かめてから、本番に反映します。
-
3
照合順序に外部入力を渡していないか調べる
検索結果の並び替えや多言語対応の処理で、照合順序の名前をリクエストの値から決めていないかを読みます。見つけたら、更新の前でも先に直します。
grep -rn "setCollation\|StringExpression\|IdentifierExpression" src/ -
4
データベース接続ユーザーの権限を見直す
アプリ用のユーザーが、不要な更新や削除、他のデータベースへのアクセス権を持っていないかを確認します。今回に限らず、被害の大きさを決めるのはこの権限です。
-
5
クエリのログに不審な跡がないか見る
照合順序を指定するクエリで、COLLATEの後ろに想定外の文字列が続いているものがないかを、データベースとアプリのログで確認します。
すぐ更新できないとき
すぐに更新できないときは、照合順序の名前を外部入力から受け取らず、コード内に用意した許可リスト(utf8mb4_unicode_ciなど数種類)から選ぶ実装に変えます。リストにない値は拒否します。あわせて、アプリ用のデータベースユーザーの権限を必要最小限に絞ります。
背景
CakePHPはPHP製のWebアプリケーションフレームワークで、データベース操作のためのクエリビルダーとORMを備えています。社内の業務システムや顧客向けの管理画面で、検索や一覧表示の土台として使われることが多く、SQL文はこの仕組みが組み立てます。
通常、値はプレースホルダーに束縛されるため、SQLインジェクションは起きにくくなっています。ところが、照合順序の名前はSQLの構文の一部で、値として束縛できません。そのためSQL文に直接書き込まれ、入力の検証が抜けるとそこが穴になります。ORMを使っているから大丈夫と思いやすい箇所で、今回の脆弱性が生じたことになります。
よくある質問
Q.CakePHP 4系や3系を使っています。影響はありますか。
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 collation values to StringExpression and IdentifierExpression. Attackers controlling a collation name passed to the constructor or setCollation() can append SQL after the unquoted COLLATE clause, affecting every database driver within the 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
- patch github.com
- web github.com
- web github.com
- web github.com