JetBrains は 10 月 9 日、Kotlin 向け ORM の Exposed 1.5.1 を公開しました。GitHub Advisory Database の CVE-2026-108474 (GHSA-cv5g-jv44-53r2) として CVSS v3.1 で 9.8 (Critical) が割り当てられている SQL インジェクション脆弱性の修正版で、CWE-89 に分類されています。認証なし・ユーザー操作なしでネットワーク越しに悪用でき、Exposed 利用アプリは早急な更新対象です。
主なポイント
- 脆弱な実装では
locate()concat()groupConcat()match()と JSON 系のextract()exists()contains()が文字列引数を SQL に直接埋め込んでいたため、入力値がそのままクエリに連結されていました (EXPOSED-1093)。 - 1.5.1 ではこれらの引数をクエリパラメータとしてバインドする実装に変更し、DB 側が「データ」として扱うようにしています。Oracle の
extract/existsの JSON パスや SQL Server のgroupConcatセパレータなど、プレースホルダを許容しない位置ではシングルクォートをエスケープしたリテラル文字列として書き出します。 - 併せて EXPOSED-909 として
locate()に渡されるサブ文字列中のシングルクォートがエスケープされるよう修正されました。 - アップグレード注意点: 独自に二重クォートなどで値をエスケープしていた既存コードでは、エスケープがそのまま DB に届いて二重エスケープで記録される可能性があります。手動エスケープを外して値をそのまま渡す形に変更する必要があります。
- GitHub Advisory による公表は 10 月 10 日付。影響範囲は Exposed 1.5.1 未満で、1.5.1 以降への更新が修正版となります。