
SQLインジェクション - MongoLite集約オプティマイザーのtoJsonExtractRaw()経由
cockpithq/cockpit:core-2.13.47fe563023b7fae854c857d2e2dc0878ef28fbb5f (タグ 2.13.4)CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:NCockpit CMS (Core Edition バージョン 2.13.4) にSQLインジェクションの脆弱性が確認されました。この脆弱性は MongoLite 集約オプティマイザー内、具体的には toJsonExtractRaw() メソッドに存在します。ユーザー制御のフィールド名が適切なサニタイズなしにSQLクエリに直接連結されます。
認証された攻撃者が、コンテンツモデルへの読み取りアクセス権(APIキー経由)を持つ場合、/api/content/aggregate/{model} RESTエンドポイントを介して集約パイプラインに任意のSQLコマンドを注入できます。
この欠陥により、攻撃者は以下が可能になります:
_state=1)をバイパスして、未公開の下書きを読み取る。sqlite_master を介して内部データベーススキーマを列挙する。以下の手順は、攻撃者が _state=1 認可フィルターをバイパスする方法を示しています。
testcol という名前の新しいモデルを作成します。title と body を追加します。スクリーンショット: testcol コンテンツモデルの設定

MasterRole などのロールを作成または変更し、testcol モデルに対する READ 権限を持たせます。スクリーンショット: コレクションのロール権限の設定

MasterRole を割り当てます。キー値をコピーします(例: API-b8e8...)。スクリーンショット: 読み取りアクセス権ロールを使用したAPIキーの設定

Public というタイトルのアイテムを作成し、その状態を公開(緑のアイコン)に設定します。SECRET_DRAFT というタイトルの2つ目のアイテムを作成し、その状態を非公開(赤のアイコン)に設定します。スクリーンショット: 公開アイテムと非公開アイテムの1つずつを表示するアイテムリスト

デフォルトでは、標準のAPIクエリは状態が公開のコンテンツのみを返します。ただし、集約パイプラインにSQLを注入することで、公開コンテンツフィルターをバイパスできます。
json_extract() SQL関数から抜け出し、SQLコメント -- を追加して後続のSQLを無効化し、特に結果を公開アイテムに制限する WHERE 句を標的にします。注入フィールド:
$title') as _id FROM collections_testcol--
完全なパイプラインJSON:
[{"$group": {"_id": "$title') as _id FROM collections_testcol--", "c": {"$sum": 1}}}]
/api/content/aggregate/testcol エンドポイントに送信します。YOUR_API_KEY を手順2.2で生成したキーに置き換えてください:curl "http://localhost:8080/api/content/aggregate/testcol?api_key=YOUR_API_KEY&pipeline=%5B%7B%22%24group%22%3A%20%7B%22_id%22%3A%20%22%24title%27%29%20as%20_id%20FROM%20collections_testcol--%22%2C%20%22c%22%3A%20%7B%22%24sum%22%3A%201%7D%7D%7D%5D"
以下の最終スクリーンショットに示すように、APIレスポンスは明示的に非公開とマークされているにもかかわらず、SECRET_DRAFT アイテムを正常に返します。これにより、SQLインジェクションがアプリケーションのコア認可メカニズムをバイパスし、APIを介した不正なデータ抽出を可能にすることが確認されます。
スクリーンショット: 未公開の「SECRET_DRAFT」データの抽出成功

一般的なヘッドレスCMSデプロイメントでは、公開読み取り専用APIキーがフロントエンドのJavaScriptに埋め込まれたりハードコードされたりすることがよくあります。この脆弱性を公開APIエンドポイントを通じて悪用することで、攻撃者は以下が可能になります:
content.sqlite データベース内のすべてのコンテンツコレクションを読み取る。APIキーが認可されていないコレクションも含みます。sqlite_master を介してデータベーススキーマを列挙し、すべてのテーブル名と構造を発見する。| 日付 | アクション |
|---|---|
| 2026-02-28 | 認可されたセキュリティ調査中に脆弱性を発見 |
| 2026-03-02 | ベンダーにレポートを提出 |
| 2026-03-02 | ベンダー修正 -- https://github.com/Cockpit-HQ/Cockpit/commit/b6a0b45c5e8fe16f3027b889583cc3a9127ab4b0 |
| 2026-03-09 | パッチリリース v 2.13.5 -- https://getcockpit.com/releases |