本文の内容は、2025年4月10日に Crystal Morin が投稿したブログ(https://sysdig.com/blog/tj-actions-changed-files-with-falco-actions/)を元に日本語に翻訳・再構成した内容となっております。
2025年3月14日、人気のGitHub Actions tj-actions/changed-filesに脆弱性(CVE-2025-30066 )が発見されました。このActionsを使用してファイルの変更を追跡している数万のリポジトリに影響が出ました。このブログでは、Falco Actionsをワークフローに簡単に統合し、このCI/CD攻撃を検知し、詳細な可視性を提供する方法について説明します。
Falco Actionsは、 OSSツールFalcoを活用し、CI/CDワークフローにおける潜在的な脅威をリアルタイムで監視するオープンソースプロジェクトです。不正なネットワーク接続、秘密アクセス、ソースコードの変更といった不審なアクティビティを検知できます。
tj-actions/changed-fileペイロードの検知
ペイロードは、こちらで報告されているように、侵害されたGitHubパーソナルアクセストークンを通じてリポジトリに導入されました。リポジトリへのアクセスを取得した攻撃者は、既製のペイロード(memdump.py
)を使用して、Runner.Workerプロセスのメモリに含まれるシークレットを窃取しました。これは、procファイルシステムを利用して以下の操作を行うことで実行されます。
- Runner.Worker の PID を特定します。これは、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 Actions は、ルールがトリガーしたワークフローステップを特定することもできます。これにより、調査活動と修復アクションが簡素化されます。

分析モード
Falco Actions は、analyze
ワークフローの実行中に何が起こったかについてのさらに多くの情報を取得するモードもサポートしています。

analyze アクションを使用することで、実行中に発生した接続情報、ファイルの変更、実行されたコンテナなどの情報も抽出できます。これを実現するために、Sysdig OS コンテナを使って scap ファイルが生成され、前述の start アクションと stop アクションによってコンテナが開始・停止されます。その後、キャプチャファイルはアーティファクトとしてアップロードされ、analyze アクションを使用する後続の分析ジョブに渡されます。
Falco Actions は次の外部サービスとも統合されます。
- VirusTotal はIP の評判を調べ、実行時に悪意のある IP に接続したかどうかを強調表示します。
- 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 のようなランタイムセキュリティ制御を使用してワークフローを保護し、迅速に対処することで、潜在的な被害を軽減し、機密データを守ることができます。