SOCFortress CoPilotでコード実行の脆弱性、修正版あり
SOCFortress CoPilotに、レポート用テンプレート経由でバックエンドのコードを実行される脆弱性が見つかりました。複数の顧客を同じCoPilotで扱う運用では、最も権限の低いアカウントが全テナントのデータに手を伸ばす足がかりになります。0.1.76未満を使っている場合は、修正版への更新と、テンプレートの保管状況の点検が必要です。
急ぎ度: 早めに
CVSS v3は9.0で重要度はcritical、修正版0.1.76が出ており、低権限のアカウントから全テナントのデータと接続用の認証情報に届くため、更新の予定を前倒しする水準です。
関係があるか
CoPilotにcustomer_userロールのアカウントを発行し、顧客や部門にポータルを開放している組織が主な対象です。社内の少人数だけが使う構成でも、0.1.76未満であれば脆弱性そのものは存在します。
| 製品 | 影響を受ける版 | 直った版 |
|---|---|---|
| SOCFortress CoPilot | 0.1.76より前の版 | 0.1.76 |
確かめ方
- 1稼働中のCoPilotの版を確認し、0.1.76より前であれば対象です。
- 2ユーザー管理画面で、customer_userロールのアカウントがあるか、誰に発行しているかを確認します。
- 3レポートテンプレートの一覧を開き、見覚えのないテンプレートや、既定のテンプレートと同名で更新日時が不自然なものがないかを見ます。
何が起きたか
CoPilotのレポート生成機能で、アップロードされたテンプレートの中身がそのままPythonの式として評価され、バックエンドのコード実行につながる脆弱性です。管理者やアナリストが通常どおりレポートを生成するだけで、テンプレートに仕込まれた内容が実行されます。
原因は三つが重なっていることです。まず、/case-report-template/upload は、ファイル名から決まるMIMEタイプしか検査せず、テンプレートの中身を見ていません。次に、テンプレートはcustomer_codeで区切られない共通の保管場所に置かれ、customer_userでも一覧・ダウンロード・削除ができます。そのため、既定のテンプレートと同じ名前で差し替えられます。
さらに、レポートを生成する側のテンプレートエンジンにはサンドボックスがありません。DOCX形式では DocxTemplate を、PDF形式では自動エスケープなしの Environment を、制限をかけずに使っています。POST /api/incidents/report/generate-report-docx と /generate-report-pdf のどちらも経路になります。
0.1.76で修正されました。
攻撃の流れ
-
1
低権限で侵入
customer_userのアカウントでポータルにログインします。
-
2
テンプレート投入
中身を検査されないまま、細工したテンプレートを共通ストアに置き、既定のテンプレートと差し替えます。
-
3
レポート生成を待つ
管理者やアナリストが通常の操作でレポートを生成します。
-
4
コードが実行される
サンドボックスのないエンジンが、テンプレートの式をバックエンド上のPythonとして評価します。
-
5
データと認証情報
全テナントのインシデントやSIEMのデータ、保管中の接続用認証情報が読まれる状態になります。
どう悪用されるか
悪用にはCoPilotへのログインが必要で、最低限customer_userのアカウントがあれば足ります。ネットワーク経由で攻撃でき、複雑な条件は要りません。一方で、管理者かアナリストがレポートを生成する操作が必要なので、攻撃者が単独で完結させることはできません。ただ、その操作は日常業務そのものです。
実行されたコードはバックエンドの権限で動きます。報告された環境ではrootで動作しており、全テナントのインシデントとSIEMのデータ、保管されたコネクタの認証情報が露出する状態でした。顧客ごとの境界が崩れるため、CVSSでもスコープの変更ありと評価されています。
PDF出力に使われるwkhtmltopdfの側では、ローカルファイルの読み取りと、内部サービスへのリクエストも可能です。バックエンド全体を乗っ取られなくても、社内ネットワークの内側を探る足場にされるおそれがあります。
今すぐやること
-
1
CoPilotを0.1.76以降に更新する
稼働中の版を確認し、0.1.76より前であれば修正版に更新します。更新後はDOCXとPDFの両方でレポートが生成できることも確かめます。
git describe --tags -
2
テンプレートの保管内容を点検する
共通ストアにあるテンプレートを一覧し、既定のテンプレートが同名で差し替えられていないか、見覚えのないものが増えていないかを確認します。疑わしいものは削除し、正規のテンプレートを入れ直します。
-
3
customer_userのアカウントを棚卸しする
使われていないアカウントや、発行先が不明なアカウントを無効にします。更新が済むまでの間も、発行数を減らしておくと攻撃の入口が狭まります。
-
4
不審な痕跡があれば認証情報を入れ替える
更新前のテンプレートに不審な変更があった場合は、コネクタの認証情報を再発行し、バックエンドの実行ログやレポート生成の履歴を見直します。
すぐ更新できないとき
ベンダーの告知に回避策の記載はないため、更新までの暫定策としてできることを挙げます。customer_userのアカウントを一時的に無効にします。リバースプロキシなどで /case-report-template/upload へのアクセスを管理者に限ります。更新が済むまでは、管理者やアナリストによるレポート生成を、テンプレートの内容を確認できたものだけに限ります。
背景
CoPilotは、セキュリティ運用に必要な情報を一つの画面にまとめるための製品で、複数の顧客のインシデントやSIEMのデータを横断して扱います。そのため、各種コネクタの認証情報も保管しており、バックエンドが侵害されたときに失うものが大きい構成です。
ユーザーが用意したテンプレートを、サンドボックスのないテンプレートエンジンで実行する欠陥は、サーバーサイドテンプレートインジェクションと呼ばれる古くからの型です。Jinja2には制限付きの実行環境が用意されていますが、今回の脆弱性ではレポート生成のコードがそれを使っていませんでした。テンプレートは設定ファイルのように扱われがちですが、実行される以上はコードと同じ扱いが必要になります。
よくある質問
Q.customer_userのアカウントを発行していなければ、影響はありませんか。
Q.更新したあとに、過去に侵害されたかを調べる必要はありますか。
まだ分かっていないこと
- この脆弱性が実際の攻撃で悪用されたかどうかは、公表されていません。
- rootで実行される条件が標準の構成によるものか、報告された環境に固有のものかは分かっていません。
- 0.1.76より前のどの版から影響を受けるのかは示されていません。最新の情報は、ベンダーのセキュリティアドバイザリ(GHSA-7q83-228r-wfh5)で確認してください。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 直った版 |
|---|---|---|---|
| socfortress | CoPilot | — | — |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
SOCFortress CoPilot focuses on providing a single pane of glass for all your security operations needs. Prior to 0.1.76, in the reported deployment, case-report templates uploaded by customer_user, the lowest-privilege portal role, are later executed by non-sandboxed Jinja2 engines when an admin or analyst generates a report. The /case-report-template/upload route in backend/app/incidents/routes/db_operations.py validates only the filename-derived MIME type, not the template content. Templates share a global store without customer_code scoping, and customer_user can also list, download and delete them, allowing an attacker to replace a legitimate default template under the same name. In backend/app/incidents/services/reports.py, render_document_with_context uses DocxTemplate without a sandbox; in backend/app/incidents/services/reports_pdf.py, render_html_template uses a non-sandboxed Environment without autoescaping. Normal privileged requests to POST /api/incidents/report/generate-report-docx or /generate-report-pdf therefore evaluate attacker-controlled Jinja expressions as Python on the backend. The reported deployment executes commands as root, exposing all tenants' incident and SIEM data and stored connector credentials. The HTML/PDF wkhtmltopdf renderer additionally permits local-file reads and requests to internal services. This issue is fixed in version 0.1.76.
出典: CVE.org (CVE Program・cvelistV5) NVD