本文へ移動
English version →
高 9.2 急ぎ度: 早めに

CakePHPにSQLインジェクションの脆弱性、修正版あり

CakePHPの5.4.3以前に、照合順序の名前を通じてSQLを差し込める脆弱性が公開されました。CakePHPで業務システムを動かしている担当者は、版を確認して修正版に更新し、照合順序に外部入力を渡していないかもコードで見直してください。

CVE-2026-119419 公開 生成 AI で作成
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

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. 1プロジェクトのディレクトリで、導入されているCakePHPの版を確認します。5.4.3以前なら対象です。
  2. 2アプリのソースコードで、StringExpressionとIdentifierExpressionの生成箇所、およびsetCollation()の呼び出し箇所を検索します。
  3. 3見つかった箇所で、照合順序の名前がリクエストの値や設定画面の入力など、外部から決められる値になっていないかを読んで確かめます。固定の文字列だけなら、実際の悪用経路にはなりにくい状態です。

何が起きたか

CakePHPのクエリ生成部分に、SQLインジェクションの脆弱性が見つかりました。データベースに文字列の並び順(照合順序)を指定する処理で、渡された名前が検査されないままSQL文に入ります。悪用されると、データベース接続に与えられた権限の範囲で、データの読み取り、書き換え、削除ができてしまいます。

対象は、StringExpressionとIdentifierExpressionの二つのクラスです。コンストラクターまたはsetCollation()に渡した照合順序名が、引用符で囲まれないままCOLLATE句の後ろに置かれます。このため、名前の後ろにSQLを付け足せる状態でした。

CWEの分類はCWE-89(SQLインジェクション)です。修正は、CakePHPのリポジトリにコミットとプルリクエストとして取り込まれています。

攻撃の流れ

  1. 1

    外部入力が到達

    アプリが、利用者の指定した値を照合順序の名前として渡す実装になっている。

  2. 2

    検査されずに通過

    StringExpressionまたはIdentifierExpressionが、名前を検証せず引用符も付けない。

  3. 3

    SQLが付け足される

    COLLATE句の後ろに、本来のクエリと別のSQLが入り込む。

  4. 4

    権限の範囲で操作

    データベース接続のユーザーに許された範囲で、データの閲覧や改ざんが起きる。

公開されている情報をもとにした流れの例です。

どう悪用されるか

認証は不要で、ネットワーク経由で届き、利用者の操作も要りません。ただし、アプリが照合順序の名前を外部から決められる形で渡していることが前提です。CVSSの攻撃複雑性が高とされているのは、この前提があるためです。CakePHPを使っているだけで、すぐに誰でも突ける状態になるわけではありません。

悪用された場合の被害は、接続ユーザーの権限で決まります。読み取りだけでなく、更新や削除ができる権限で動いているアプリでは、顧客情報の流出、データの改ざん、テーブルの削除まで起こり得ます。

今すぐやること

  1. 1

    導入中の版を確認する

    本番、検証、開発の各環境で、CakePHPの版を確かめます。5.4.3以前が対象です。

    composer show cakephp/cakephp
  2. 2

    修正版に更新する

    CakePHPの告知で修正版の版番号を確認し、composer.jsonの制約を直したうえで更新します。検証環境で画面とバッチの動作を確かめてから、本番に反映します。

  3. 3

    照合順序に外部入力を渡していないか調べる

    検索結果の並び替えや多言語対応の処理で、照合順序の名前をリクエストの値から決めていないかを読みます。見つけたら、更新の前でも先に直します。

    grep -rn "setCollation\|StringExpression\|IdentifierExpression" src/
  4. 4

    データベース接続ユーザーの権限を見直す

    アプリ用のユーザーが、不要な更新や削除、他のデータベースへのアクセス権を持っていないかを確認します。今回に限らず、被害の大きさを決めるのはこの権限です。

  5. 5

    クエリのログに不審な跡がないか見る

    照合順序を指定するクエリで、COLLATEの後ろに想定外の文字列が続いているものがないかを、データベースとアプリのログで確認します。

すぐ更新できないとき

すぐに更新できないときは、照合順序の名前を外部入力から受け取らず、コード内に用意した許可リスト(utf8mb4_unicode_ciなど数種類)から選ぶ実装に変えます。リストにない値は拒否します。あわせて、アプリ用のデータベースユーザーの権限を必要最小限に絞ります。

背景

CakePHPはPHP製のWebアプリケーションフレームワークで、データベース操作のためのクエリビルダーとORMを備えています。社内の業務システムや顧客向けの管理画面で、検索や一覧表示の土台として使われることが多く、SQL文はこの仕組みが組み立てます。

通常、値はプレースホルダーに束縛されるため、SQLインジェクションは起きにくくなっています。ところが、照合順序の名前はSQLの構文の一部で、値として束縛できません。そのためSQL文に直接書き込まれ、入力の検証が抜けるとそこが穴になります。ORMを使っているから大丈夫と思いやすい箇所で、今回の脆弱性が生じたことになります。

よくある質問

Q.CakePHP 4系や3系を使っています。影響はありますか。
A.公開されている情報で影響が明記されているのは、5.4.3以前です。4系以前が対象に含まれるか、修正が提供されるかは、CakePHPのセキュリティアドバイザリで確認してください。サポートが終わった系統を使っている場合は、新しい系統への移行も検討が必要です。
Q.WAFを入れていれば、更新は後回しにできますか。
A.後回しにしないほうがよいでしょう。照合順序の名前は、ふつうのSQLインジェクションとは入力の形が違うため、WAFのルールで確実に止められるとは限りません。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

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく