CoPilotにファイル上書きの脆弱性、0.1.77で修正
SOCFortressのセキュリティ運用ツールCoPilotに、サーバー上のファイルをroot権限で上書きされる脆弱性が見つかりました。0.1.77より前を動かしている組織が対象で、修正版への更新が必要です。更新までの間は、操作できるアカウントと外からの到達範囲を絞ってください。
急ぎ度: 早めに
CVSS v3が10の重大な脆弱性で、修正版0.1.77が公開されているため、次の定期作業を待たずに更新するのが妥当です。
関係があるか
CoPilotを自社で運用しているSOCやセキュリティチームが対象です。とくにバックエンドをroot権限で動かしている環境と、管理画面を広いネットワークに公開している環境で影響が大きくなります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| SOCFortress CoPilot | 0.1.77より前のすべての版(影響の下限となる版は公表されていません) | 0.1.77 |
確かめ方
- 1CoPilotを導入しているサーバーやコンテナを洗い出し、動いている版が0.1.77より前かを確認します。
- 2GCPのレポート機能を使っていなくても、該当のルートは版に含まれているため、版だけで判断します。
- 3バックエンドがどのユーザーで動いているかを確認します。rootで動いていれば、上書きできる範囲が広がります。
- 4adminとanalystの権限を持つアカウントを一覧にし、使われていないものがないかを見ます。
何が起きたか
CoPilotのGCP向けレポートのアップロード機能に、保存先を意図しない場所へずらせる脆弱性がありました。悪用されると、本来のレポート用ディレクトリの外にあるファイルが、root権限で上書きされます。
対象は POST /api/scoutsuite/generate-gcp-report です。このルートは、アップロードされた内容がGCPScoutSuiteJSONの形式かどうかは検証します。ところが、リクエストのヘッダーに入っているファイル名は、そのまま保存処理に渡していました。保存処理は、このファイル名を scoutsuite-report と os.path.join でつなぐだけで、無害化も、保存先が想定したディレクトリの中に収まるかの確認もしていません。
報告者は、rootで動くバックエンドで、レポート用ディレクトリの外とアプリケーションのソースディレクトリ内に、root所有のファイルが書き込まれることを示しました。0.1.77では、このルートが呼び出し側からファイル名を受け取らない形に変わっています。
攻撃の流れ
-
1
ログイン
adminまたはanalystの権限でCoPilotにアクセスします。
-
2
アップロード
GCPレポートの形式に合わせたJSONを、細工したファイル名で送ります。
-
3
保存先のずれ
ファイル名が検証されないため、レポート用ディレクトリの外に保存されます。
-
4
ファイル上書き
root権限で、アプリのソースなどの既存ファイルが書き換わります。
-
5
動作への影響
書き換えられたファイルによって、CoPilotの動作が乱れることがあります。
どう悪用されるか
CoPilotのAPIにネットワーク越しでアクセスでき、adminまたはanalystとして認証済みであることが前提です。利用者の操作は要りません。ただし、CVSSのベクターでは権限は不要とされており、説明文の記載とは評価が異なります。
被害は、サーバー上の既存ファイルの上書きです。バックエンドがrootで動いていると、レポート用ディレクトリの外にも、アプリケーションのソースディレクトリにも書き込めます。上書きされたファイルによって、CoPilotが正常に動かなくなる恐れがあります。
書き込める中身は、GCPScoutSuiteJSONとして通るJSONに限られます。実証された範囲では、自由な実行ファイルの内容を書き込めることも、テナントをまたいだ情報漏えいが必ず起きることも、確認されていません。
今すぐやること
-
1
CoPilotを0.1.77以上に更新する
修正版に更新し、更新後にコンテナやサービスを再起動します。更新後の版が0.1.77以上になっていることを確認してください。
-
2
上書きされたファイルがないか調べる
アプリケーションのソースディレクトリで、導入時やデプロイ時より新しい更新日時のファイルを探します。レポート用ディレクトリの外に、JSON形式のファイルが増えていないかも見てください。
-
3
アクセスログを見直す
リバースプロキシやアプリのログで、
/api/scoutsuite/generate-gcp-reportへのPOSTを確認します。心当たりのない送信元や利用者によるものがあれば、記録しておきます。 -
4
adminとanalystのアカウントを棚卸しする
使っていないアカウントや、共有されているアカウントを無効にし、パスワードの変更も検討します。
-
5
バックエンドの実行ユーザーを見直す
rootで動かしている理由が特になければ、権限を絞ったユーザーで動かす構成に変えます。書き込める範囲が狭まります。
すぐ更新できないとき
すぐに更新できないときは、CoPilotの管理画面とAPIに入れる範囲を、運用担当者のネットワークだけに絞ります。リバースプロキシでは、/api/scoutsuite/generate-gcp-report へのリクエストを遮断できます。ただし遮断すると、GCPレポートの生成機能が使えなくなります。adminとanalystのアカウントも、必要な人に限ってください。
背景
CoPilotは、SOCFortressが公開しているオープンソースのツールです。複数のセキュリティ製品の画面や操作を一か所にまとめることを目的にしており、SOCの担当者が日常的にログインします。今回の機能が扱うScoutSuiteは、クラウド環境の設定を監査するツールで、CoPilotはその結果のJSONを取り込んでレポートにします。
今回の脆弱性は、アップロードされたファイルのファイル名をそのまま保存先の決定に使ったことで起きました。ファイル名の経由で保存先をずらすこの種の脆弱性は、CWE-22として分類されています。ファイルの形式を検証していても、保存先の確認が抜けると防げません。
よくある質問
Q.GCPを使っていなくても、更新は必要ですか。
Q.更新したあとも、上書きの痕跡は調べるべきですか。
まだ分かっていないこと
- 実際の攻撃で悪用されたかどうかは、公表されていません。
- 任意のコード実行に至るかどうかは、確定していません。表題にはRCEとありますが、報告者が示したのは、JSONの中身に限られたファイルの上書きです。
- 影響を受ける最も古い版は、公表されていません。詳細は、ベンダーのGitHubのセキュリティアドバイザリで確認してください。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
SOCFortress CoPilot focuses on providing a single pane of glass for all your security operations needs. Prior to 0.1.77, POST /api/scoutsuite/generate-gcp-report in backend/app/integrations/scoutsuite/routes/scoutsuite.py admits admin and analyst users and validates the uploaded content as GCPScoutSuiteJSON, but passes raw file.filename from the multipart header to save_file_to_directory in backend/app/integrations/scoutsuite/services/scoutsuite.py. The writer combines this filename with scoutsuite-report using os.path.join without sanitization or a resolved-path containment check. A traversal filename therefore writes the supplied JSON outside the intended report directory. In the reported root-running backend, the researcher demonstrated root-owned writes outside that directory and into the application source directory. This permits host-file overwrite subject to the accepted JSON-content constraint and can disrupt application operation; the demonstrated primitive does not establish unrestricted executable contents or unconditional cross-tenant confidentiality loss. Version 0.1.77 removes caller-controlled filenames from the affected route; unrestricted-content and direct-code-execution claims require separate curator reconciliation.
出典: 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