
CVE-2026-39275 - Cockpit CMSのStored XSSによるアカウント乗っ取り
注記: 公開前にCockpit CMSメンテナへ責任ある開示を行い、修正が適用されています。
| CVE ID | CVE-2026-39275 |
| 脆弱性 | 格納型クロスサイトスクリプティング(XSS)→ アカウント乗っ取り |
| CWE | CWE-79 |
| 影響を受けるバージョン | Cockpit CMS <= 2.13.5 |
| 修正バージョン | d70dc50 |
| CVSS 3.1 | 8.4 (AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N) |
| 報告者 | Rohith - SecurifyAI セキュリティコンサルタント |
コンテンツコレクションのリスト表示における格納型XSS脆弱性により、コンテンツ書き込み権限を持つユーザー(APIキーまたは認証済みエディターセッション)は、影響を受けるコレクションのアイテム一覧を表示する管理者またはエディターのブラウザで実行される任意のJavaScriptを注入できます。
CockpitのセッショントークンはJavaScriptから完全にアクセス可能です。セッションクッキーはHttpOnlyフラグなしで設定され、CSRF JWTはグローバル変数App.csrfおよび<html>上のdata-csrf属性に公開されています。これにより、注入されたスクリプトは両方のトークンを読み取り、外部で再生(リプレイ)でき、CSRF保護を無効化して完全なセッションハイジャックとアカウント乗っ取りを可能にします。
フィールドのrender()出力は、出力エンコーディングなしでVueのv-htmlディレクティブに渡されます。
| ファイル | 行 | 役割 |
|---|---|---|
modules/App/assets/vue-components/fields/field-tags.js | 25 - 34 | タグレンダラー - エンコーディングなし |
modules/App/assets/vue-components/fields/field-select.js | 26 | セレクトレンダラー - エンコーディングなし |
modules/Content/views/collection/items.php | 149 | v-htmlシンク |
curl -X POST "http://localhost:8080/api/content/item/posts" \
-H "Content-Type: application/json" \
-H "api-key: USR-<attacker-api-key>" \
-d '{
"data": {
"title": "Innocent Looking Post",
"tags": [
"",
""
],
"body": "Just a regular post.",
"_state": 1
}
}'
管理者またはエディターが/content/collection/items/postsに移動します。タグレンダラーが保存された文字列を返し、v-htmlがそれを実際の``要素として解析し、偽のsrcが失敗してonerrorハンドラーが発火します。
両方のトークンが読み取り可能になります。セッションクッキーはdocument.cookie、CSRF JWTはApp.csrf / document.documentElement.getAttribute('data-csrf')経由です。武器化されたペイロードは両方を外部へ送信します:
攻撃者は窃取したクッキーとCSRFトークンを再生し、完全な認証済み管理者アクセスを取得します。その後、管理者アカウントの作成、認証情報の変更、コンテンツの改変が可能になります。
低権限のエディター(またはコンテンツ書き込みAPIキーの保有者)が完全な管理者へ権限昇格します。ペイロードは保存され、一覧を表示するすべての管理者/エディターに対して発火するため、永続的で複数の被害者に影響する侵害となります。
主要な修正 - v-htmlに渡す前に、既存のApp.utils.stripTags()ヘルパーを使用してレンダー出力をサニタイズします。
field-tags.js:
value = App.utils.stripTags(value); // sanitize before v-html
field-select.js:
return App.utils.stripTags(value); // sanitize before v-html
多層防御 - セッションクッキーを強化します:
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); // over HTTPS
ini_set('session.cookie_samesite', 'Strict');
HttpOnlyだけでは不十分です。XSSは被害者の認証済みブラウザコンテキスト内で依然として動作するため、出力エンコーディングが不可欠な修正となります。
| 日付 | イベント |
|---|---|
| 2026-03-29 | Cockpit CMSメンテナに脆弱性を報告 |
| 2026-03-29 | メンテナが修正をリリース |
| 2026-04-04 | CVEを申請 |
| 2026-06-23 | CVE-2026-39275が採番 |
<pub date> | 公開開示 |
この資料は、調整された開示に従い、教育および防御目的で公開されています。自身が所有するシステム、または明示的にテストを許可されたシステムに対してのみ使用してください。