人気の GitHub Action tj-actions/changed-files において、侵害(CVE-2025-30066)が 2025 年 3 月 14 日に発見されました。ファイル変更の追跡にこのアクションを使用している数万のリポジトリに影響しました。本ブログでは、Falco Actions をワークフローに簡単に統合して、この CI/CD 攻撃の検知を支援し、詳細な可視性を提供する方法を解説します。
Falco Actions は、OSS ツール Falco を活用し、CI/CD ワークフローをリアルタイムで監視して潜在的な脅威を検出するオープンソースプロジェクトです。不正なネットワーク接続、シークレットへのアクセス、ソースコードの改変などの不審なアクティビティを検知できます。
tj-actions/changed-file のペイロードを検知する
報告されているとおりこちらのとおり、侵害された GitHub Personal Access Token を通じてペイロードがリポジトリに持ち込まれました。リポジトリへのアクセスを得た攻撃者は、市販のペイロード(memdump.py)を使用して Runner.Worker プロセスのメモリに含まれるシークレットを窃取しました。これは proc ファイルシステムを利用して次を行います:
- Runner.Worker の PID を特定します。Runner.Worker は GitHub Actions ワークフローのジョブを実行するアプリケーションのプロセスです。このプロセスが重要なのは、ワークフローが必要とするあらゆるシークレットがここに渡されるためです。
/proc/{pid}/mapsを確認し、どの仮想メモリアドレスに読み取り権限があるかを把握します。/proc/{pid}/memを開き、読み取り可能な各メモリ領域を反復処理します。次にスクリプトが正規表現を用いて内容を標準出力にダンプします。出力は後で grep コマンドにパイプされ、GITHUB_TOKENやその他のユーザー定義シークレットなど、特定のシークレットを探します。
これらの操作は、意味のある検知ルールを書く余地を多く残します。falco-actions プロジェクトはこのような脅威に対処するために作られているため、/proc/{pid}/mem を使用して別プロセスのメモリへアクセスすることを検知するルールがすでに含まれています。
- rule: Process Dumping Memory of Others
desc: >
Detect a process dumping memory of other processes. Sensitive information can be stored in memory, and this could be a step prior to exfiltration.
condition: >
open_read and fd.name startswith "/proc/" and fd.name endswith "/mem" and not fd.name contains "/self/"
output: A process %proc.name with pid %proc.pid is dumping memory of other processes (file=%fd.name process=%proc.name proc_exepath=%proc.exepath gparent=%proc.aname[2] ggparent=%proc.aname[3] gggparent=%proc.aname[4] command=%proc.cmdline terminal=%proc.tty container_image=%container.image.repository)
priority: WARNING
tags: [CI/CD]
Falco Actions が救う
Falco Actions は、任意の GitHub ワークフローに組み込んで、各ワークフロー実行中にランタイムで何が起きているかを追跡できます。
このアクションは、start と stop のアクションを定義するだけでワークフローに組み込めます。以下の例は、脆弱なバージョンの tj-actions/changed-files を使用するワークフローで Falco Action を利用する方法を示しています。
- name: Start Falco
uses: falcosecurity/falco-actions/start@f67ddcc4b202aae0ab3d7194159c9c947ae77791
with:
mode: live
falco-version: '0.39.0'
verbose: true
- name: List all changed files
env:
ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }}
run: |
for file in ${ALL_CHANGED_FILES}; do
echo "$file was changed"
done
- name: Get changed files
id: changed-files
uses: trmlabs/changed-files@eb3c72d826fc4f9a9af40679c867cfdcf2e88012 # vulnerable version
- name: Read Sensitive File
run: |
sleep 3
docker run --rm --privileged ubuntu cat /etc/shadow
- name: Stop Falco
uses: falcosecurity/falco-actions/stop@f67ddcc4b202aae0ab3d7194159c9c947ae77791
with:
mode: live
verbose: true
ワークフロー実行の最後に、実行中にトリガーされた Falco イベントを含むレポートが生成されます。以下のスクリーンショットにあるとおり、Falco は memdump.py スクリプトを用いて認証情報をダンプしようとしたエクスプロイトの実行を検知しました。
Falco Action は、どのワークフローステップでルールがトリガーされたかも特定できます。これにより、調査活動と是正対応が簡素化されます。
Analyze モード
Falco Actions は、ワークフロー実行中に何が起きたかについてさらに多くの情報を得るための analyze モードもサポートしています。
analyze アクションを使うと、実行中に発生した接続、ファイル変更、実行されたコンテナなどの情報も抽出できます。これを実現するために、scap ファイル が Sysdig OS コンテナを介して生成されます。このコンテナは、先に見た start と stop アクションで起動・停止されます。キャプチャファイルはその後アーティファクトとしてアップロードされ、analyze アクションを使用する後続の分析ジョブに渡されます。
Falco Actions は、次の外部サービスとも連携します:
- 実行が悪性 IP に接触したかどうかを強調表示するための、IP レピュテーション向け VirusTotal
- 実行中に起きたことの要約と是正オプションを含むレポートを生成するための OpenAI
分析ジョブが完了すると、キャプチャから抽出されたすべての情報を含む、カスタマイズ可能ですぐに使えるレポートが生成されます。内容には次が含まれます:
- 各ステップの実行中にトリガーされた Falco ルール
- 接触した IP
- 接触した DNS ドメイン
- 生成された実行ファイルの SHA256 ハッシュ
- 起動されたコンテナイメージ
- 書き込まれたファイル
- OpenAI により生成されたレポート要約
- 接触した IP のレピュテーション
- SHA256 ハッシュのレピュテーション
抽出される情報の中には、ワークフロー実行中に接触したドメインも含まれます。マルウェアがダウンロードされ実行されたこの tj-actions/changed-file のユースケースでは、以下のスクリーンショットのとおり、接触した DNS 接続に gist.githubusercontent.com が現れていることが分かります。
結論
tj-actions/changed-files の GitHub Action 脆弱性は、CI/CD 環境におけるサプライチェーン攻撃のリスクが高まっていることを示す、最新の例にすぎません。攻撃の仕組みを理解し、Falco Actions のようなランタイムセキュリティ制御を用いてワークフローを保護し、迅速に是正することで、組織は潜在的な被害を軽減し、機微なデータを守ることができます。
翻訳元: https://www.sysdig.com/blog/tj-actions-changed-files-with-falco-actions

