CoPilotのXSS脆弱性でアカウント乗っ取りの恐れ、0.1.76で修正
SOCFortress CoPilotの顧客向けポータルに、書き込まれた内容が無害化されずに表示される脆弱性があります。低い権限のポータル利用者が、閲覧した分析者や管理者のアカウントを奪える構造で、複数の顧客を扱う運用ほど被害が広がります。0.1.76以降へ更新し、更新後はトークンの失効と履歴の点検まで進めてください。
急ぎ度: 早めに
CVSS v3は9.9で、すべての修正を含む0.1.76が出ているため、定例の更新を待たずに適用する価値があります。
関係があるか
SOCFortress CoPilotを運用し、顧客向けポータル(customer-portal)に顧客側の利用者を迎えている組織が対象です。複数の顧客を一つのCoPilotで扱うSOC事業者や、社内の部門別にポータルを開放している情シスは、とくに影響を受けやすい構成です。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| SOCFortress CoPilot(customer-portal)のアラートコメント欄とSOCケース関連の表示部分 | 0.1.76より前 | 0.1.76 |
| SOCFortress CoPilot(customer-portal)のヘルスチェック表示部分 | 0.1.70より前 | 0.1.70で修正済み。ただし他の表示部分が残るため、実際には0.1.76以降が必要 |
確かめ方
- 1稼働中のCoPilotの版を、デプロイに使ったタグやコンテナーイメージのタグで確認します。0.1.76未満なら対象です。
- 2customer-portalを公開しているか、customer_userなどポータル利用者のアカウントを発行しているかを確認します。発行していれば攻撃の入口が存在します。
- 3分析者や管理者が、ポータル利用者の書き込んだアラートコメントやSOCケースの内容を日常的に開く運用かどうかを確認します。開く運用なら、影響を受ける人の範囲が広がります。
何が起きたか
CoPilotの顧客向けポータルで、利用者が書き込んだ文字列がHTMLとして解釈されたまま画面に表示される脆弱性です。低い権限の利用者が仕込んだスクリプトが、あとから画面を開いた分析者や管理者のブラウザーで動いてしまいます。
アラートへのコメント投稿APIで受け付けた内容は、AlertComment.vueで改行を置き換えただけでv-htmlに渡されます。エスケープも無害化もありません。同じ表示方法が、SOCケースのメモや項目、アセット、ヘルスチェックを表示するSocCaseNote.vue、SocCaseItem.vue、SocCaseAssetsItem.vue、SocAlertAssetsItem.vue、HealthcheckItem.vueにも見つかっています。
被害を大きくしているのが、認証情報の持ち方です。auth.tsはアクセストークンとリフレッシュトークンの両方をJavaScriptから読める場所に保存し、httpClient.tsはHttpOnlyのCookieではなくbearerヘッダーで送ります。ページ内で動いたスクリプトは両方のトークンを読めるため、閲覧者になりすまし、/auth/refreshで新しいトークンまで得られます。
弱点の種類はCWE-79(クロスサイトスクリプティング)とCWE-922(機微情報の不適切な保管)です。
攻撃の流れ
-
1
コメント投稿
ポータル利用者が、HTMLを含む文字列をアラートコメントやSOCケースの項目に保存します。
-
2
そのまま保存
サーバーは内容を無害化せず保存し、画面側もHTMLとして描画します。
-
3
分析者が閲覧
分析者や管理者が該当のアラートやケースを開くと、スクリプトがアプリケーションと同じオリジンで動きます。
-
4
トークン奪取
ブラウザーに保存されたアクセストークンとリフレッシュトークンが読み取られます。
-
5
権限の継続利用
リフレッシュで新しいトークンを得続け、閲覧者の権限で操作を続けます。
どう悪用されるか
起点になるのは、ポータルにログインできる低権限のアカウントです。customer_userを含むポータル利用者がコメントなどを保存でき、ネットワーク越しに実行できます。特別な権限や複雑な手順は要りません。
実行のきっかけは、別の利用者が細工済みのアラートやケースを開くことです。CVSSのベクトルは利用者の操作を不要と評価していますが、脆弱性の説明では閲覧時にスクリプトが動くとされています。分析者や管理者が日常業務で開く画面なので、待っていれば閲覧される前提で見ておくのが安全です。
分析者や管理者のトークンが奪われると、永続的なアカウント乗っ取りになります。顧客をまたいだデータの閲覧、インシデントの改ざんや削除、検知と対応の妨害まで、閲覧者の権限で可能です。CVSSでスコープが変更ありとされているのは、顧客側の入口から運用側の権限へ被害が及ぶためです。
今すぐやること
-
1
CoPilotを0.1.76以降に更新する
ヘルスチェックの修正は0.1.70に入っていますが、コメントとSOC関連の修正は0.1.76で初めて入ります。0.1.76以降へ更新してください。更新前に、現在の版をタグで確認しておくと記録が残ります。
git describe --tags -
2
分析者と管理者のセッションを無効にする
更新で表示の穴は塞がりますが、すでに奪われたトークンは自動では失効しません。分析者・管理者を再ログインさせ、リフレッシュトークンを失効させてください。失効手段がない場合は、パスワード変更や署名鍵の更新を検討します。
-
3
保存済みの書き込みを点検する
ポータル利用者が投稿したアラートコメントや、SOCケース、アセット、ヘルスチェックの項目に、HTMLタグらしき文字列が混ざっていないかを調べます。見つけたら内容を退避して削除し、投稿元のアカウントを特定します。
-
4
不審な操作の履歴を確認する
身に覚えのない場所からのログイン、顧客をまたぐデータの参照、インシデントの変更や削除、検知ルールの変更がないかをアクセスログと監査記録で確認します。公開から日が浅い脆弱性ですが、更新前に仕込まれた書き込みは残っている可能性があります。
-
5
ポータル利用者のアカウントを棚卸しする
使われていないcustomer_userや、発行元が分からないアカウントを無効にします。入口になるアカウントを減らしておけば、次に同種の問題が出たときの被害も小さくなります。
すぐ更新できないとき
すぐに更新できないときは、まずcustomer-portalへのアクセスを社内ネットワークや許可したIPアドレスに限り、ポータル利用者のコメント投稿を止めます。あわせて、ポータル利用者が書き込んだアラートやケースを分析者が開く運用を、更新が済むまで控えてください。リバースプロキシでContent-Security-Policyを設定し、インラインのスクリプトを禁じる方法もあります。ただし画面の動作に影響する可能性があるため、先に検証環境で試してください。いずれも暫定策で、修正版の適用に代わるものではありません。
背景
SOCFortress CoPilotは、セキュリティ運用に必要な画面を一か所にまとめる、GitHubでソースが公開されているツールです。分析者はアラートやケースをここで確認し、対応の記録を残します。顧客向けポータルは、その一部を顧客側の利用者にも見せ、コメントを書けるようにする入口です。顧客が書いた文字列を、運用側のもっとも強い権限を持つ人が読むという流れが、構造上つねに存在します。
保存した入力を他の人が読むときに実行される脆弱性は、Webアプリケーションで古くから知られた型です。Vueのv-htmlは渡された文字列をそのままHTMLとして描画するため、ユーザー入力を通すと無害化の責任が実装側に残ります。今回は、トークンがJavaScriptから読める場所にあるせいで、画面を開かれただけで認証情報まで持ち出される構成だった点が深刻さを決めています。コメント欄という最も低い権限の入口と、検知や対応の記録を扱う最も高い権限の画面が、同じオリジンでつながっていました。
よくある質問
Q.customer_userを発行していなければ、影響はありませんか。
Q.更新したあと、なにを追加で確認すべきですか。
まだ分かっていないこと
- 影響を受ける最初の版は分かっていません。説明では「修正前のスナップショット」とされており、どこまで遡るかはGitHubのアドバイザリで確認してください。
- ヘルスチェックの修正(0.1.70)と、コメントなどその他の修正(0.1.76)を、一つのCVEにまとめるか分けるかは調整中です。範囲が変わる可能性があるため、最新の告知を確認してください。
- 実際の攻撃での悪用が確認されたかどうかは、現時点で分かっていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
SOCFortress CoPilot focuses on providing a single pane of glass for all your security operations needs. In affected snapshots preceding the respective 0.1.70 and 0.1.76 sink repairs, portal users, including customer_user, can submit stored markup through POST /api/incidents/db_operations/alert/comment. In customer-portal/src/components/alerts/AlertDetails/AlertComment.vue, commentHtml replaces newlines in comment.comment but passes the result to v-html without escaping or sanitizing HTML. When another user views the poisoned alert, stored script executes on the application origin; the same unsanitized rendering pattern affects server-stored SOC case, asset and health-check fields in SocCaseNote.vue, SocCaseItem.vue, SocCaseAssetsItem.vue, SocAlertAssetsItem.vue and HealthcheckItem.vue. The authentication store in customer-portal/src/stores/auth.ts persists both access and refresh tokens in JavaScript-readable storage, and customer-portal/src/api/httpClient.ts uses bearer headers rather than HttpOnly cookies. An injected script can steal both tokens, impersonate the viewer and obtain fresh tokens through /auth/refresh. If an analyst or administrator views the poisoned alert or case, this enables persistent privileged account takeover, cross-tenant data access, incident modification or deletion, and detection/response subversion. The health-check sink repair is first contained in version 0.1.70, while the comment and other SOC sink repairs are first…
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory github.com
- advisory nvd.nist.gov
- patch github.com
- patch github.com
- patch github.com
- patch github.com
- web github.com