2026年11月10日から、盗まれたGitHubの認証情報を使い、CIシークレット窃取を狙う大規模な攻撃が進行しています。悪意あるワークフローが数万のリポジトリにpushされており、セキュリティ企業 Aikido Security が報告しました。狙われるのは GitHub Actions の CI シークレットとクラウド認証情報で、ペイロードはログ中で自らを 「wfx」 と名乗ります。

これはサプライチェーンへの感染拡大というより、CIシークレットそのものを抜くキャンペーンです。仕組みの背景は サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説 にまとめています。以下の数値・IoC・手口はすべて Aikido の報告(2026-11-12 時点)に基づきます。

30秒でわかる wfx 攻撃

  • いつ — 2026年11月10日 12:45 UTC ごろ開始。probe の PR は 11月11日 15:00 UTC まで確認
  • 規模(Aikido 報告) — 4,837の侵害アカウントが61,764リポジトリに probe、少なくとも1,806で認証情報が流出
  • 手口 — ①書込権限を確かめる probe PR → ②ワークフローにペイロード注入 → ③1分以内に revert しログ削除
  • 盗まれるもの — Actions secrets・GITHUB_TOKEN・OIDC・AWS/GCP/Azure 認証、各種 AI プロバイダのトークン
  • まず確認 — git fetch --all --prune 後、wfx-docs ブランチ・docs: dependency audit notes の PR・不審コミットを探す(本文のコマンド)

何が起きたか——6万超リポジトリへのCIシークレット窃取

時系列(タイムライン)はこうです(すべて Aikido 報告・UTC)。

  • 2026年11月10日 12:45 UTC ごろ — 攻撃開始。probe の PR が開かれ始める
  • 2026年11月11日 15:00 UTC — probe の PR はこの時刻まで確認(計61,839件)
  • 2026年11月12日 — Aikido が公表(本記事の一次情報)

攻撃者は、盗んだGitHubトークンで書き込めるリポジトリに対し、次の3段階を踏みます。

HOW THE ATTACK WORKS盗んだGitHubトークンで書けるリポジトリに(Aikido報告)

探り → ペイロード投入 → 証拠削除の3段

  1. 1

    探り(probe)

    wfx-docs ブランチから『docs: dependency audit notes』のPRを開き、書き込み権限があるかを確認する

  2. 2

    ペイロード投入(3亜種)

    ci: refresh build cache で既存ワークフローに約1,500行注入/chore: add ci helper で .ci-xxxxxx.sh と package.json の postinstall /chore: add dependency audit workflow で chore/ ブランチに新ワークフロー

  3. 3

    証拠削除

    最長1分以内に revert し、ワークフローの実行とログを削除。実行番号が1つ飛んでいることが唯一の痕跡になりやすい

出典: Aikido Security『Compromised GitHub accounts push CI secret stealer...』(2026-11-12)。数値・名称は報告から転記
  1. 探り(probe) — wfx-docs ブランチから docs: dependency audit notes というPRを開き、書き込み権限があるかを確認します。
  2. ペイロード投入 — 3つの亜種のいずれかを使います。既存ワークフローへの注入(ci: refresh build cache で約1,500行を追加)、インストールフック(chore: add ci helper で .ci-xxxxxx.sh と package.json の postinstall を追加し npm install で実行)、使い捨てブランチ(chore: add dependency audit workflow で chore/ + 8文字のブランチに .github/workflows/build-audit-xxxxxx.yml を追加)。
  3. 証拠削除 — 最長でも1分以内に revert し、ワークフローの実行とログを削除します。実行番号が1つ飛んでいることが、しばしば唯一の痕跡です。

Aikido が現時点で集めたデータでは、4,837の侵害アカウントが61,764リポジトリで probe PR を開き、少なくとも1,806のリポジトリでペイロードが実行されて認証情報が流出しました。GitHub 検索では docs: dependency audit notes のPRが61,839件(11月10日 12:45 UTC〜11月11日 15:00 UTC)見つかり、うち10,431件はアカウント本人が所有しないリポジトリ(コラボレーター/組織アクセス経由)で、92%がまだ open のまま——つまり多くの持ち主が気づいていません。probe が走った時点で、ワークフローが実行されなくてもそのユーザーは侵害されたとみなすべき、とされています。

自分のリポジトリを確認する

まず最新を取得し、IoC(侵害の痕跡)で探します。git fetch --all --prune を最初に実行して、消されたブランチや追加されたブランチを手元に反映させるのが起点です。

# 1. 最新の参照を取得(消された/増えたブランチを反映)
git fetch --all --prune

# 2. 不審なブランチ名(wfx-docs / chore/+8文字 / ci-check-4桁)
git branch -a | grep -E 'wfx-docs|chore/[a-z0-9]{8}|ci-check-[0-9]{4}'

# 3. 不審なコミットメッセージ
git log --all --oneline | grep -iE 'refresh build cache|add ci helper|add dependency audit workflow|ci: cleanup|ci: restore'

# 4. 不審なファイル(インストールフック / 使い捨てワークフロー / 偽フォント)
find . -path ./.git -prune -o -type f \( -name '.ci-*.sh' -o -name 'build-audit-*.yml' -o -name 'fa-solid-400.woff2' \) -print

# 5. package.json に不審な postinstall が無いか(node_modules は除外)
grep -rn '"postinstall"' . --include=package.json --exclude-dir=node_modules

GitHub の画面側では、docs: dependency audit notes というPRが自分のリポジトリや組織に開かれていないか、Actions タブで実行番号が飛んでいないかも見ます。疑わしいスクリプトを見つけたら、ハッシュで照合できます(Aikido が公開した窃取スクリプトのSHA-256)。

# 窃取スクリプトのハッシュ照合(一致したら侵害)
find . -path ./.git -prune -o -type f -name '*.sh' -exec sha256sum {} + \
  | grep -i 89695abb392d5cfd4972672961e644bb46baa98aa1ed7173c2a2816c762735cf

該当が無ければ、これらの検索はすべて何も返しません。ただしヒットが無いことは「安全」の証明ではありません——攻撃者は実行ログを消すため、残るのは実行番号の欠落だけのこともあり、private リポジトリや別アカウント経由の侵害はこの検索では捉えられません。これは痕跡の有無の確認であって、侵害の有無を確定する判定ではありません。何か返った場合は、次節の対応に進みます。

対策——該当したら全シークレットとクラウドロールを即ローテーション

ペイロードが実行された形跡があれば、そのワークフローから使えた全シークレットと全クラウドロールが漏れたと想定します。Aikido の推奨は「ただちにすべてのシークレットとクラウドロールをローテーション」です。優先順に:

ローテーションと点検の順番

  1. GitHub — リポジトリ/組織の Actions secrets、GITHUB_TOKEN に紐づく PAT、OIDC を使う連携を失効・再発行
  2. クラウド — AWS のアクセスキー、GCP のサービスアカウント鍵、Azure のクライアントシークレットを無効化して再発行
  3. パッケージ — npm・PyPI・Packagist・crates の公開トークン
  4. 永続化の点検 — AWSロールの信頼ポリシーが "Principal": {"AWS": "*"} に書き換えられていないか。Azure AD のアプリに wfx-ci- で始まるフェデレーション資格情報が足されていないか。これらはトークンを回しても攻撃者が入り直せる仕掛けなので、鍵のローテーションと別に消す必要があります

とくに注意すべきは、ペイロードがブランチ保護を迂回する点です。必須チェックの「コンテキスト名」に一致する偽の成功ステータスを付けるため、鍵を回しただけでは不正なマージが通り続ける恐れがあります。マージゲートの設定と、最近マージされたPRも併せて見直してください。

何が盗まれるのか——CIシークレット窃取ツールwfxの中身

ペイロードは約1,500行の単一シェルスクリプトで、難読化されておらずコメントも多く、ログや変数名で自らを「wfx」と名乗ります。動作は collect(収集)→ escalate(昇格)→ persist(永続化)→ exfiltrate(持ち出し)の4段で、設定フラグで機能を切り替えます。

WHAT WFX STEALSランナー上で手に入る認証情報をほぼ全部(約1,500行のシェル)

CIシークレット・クラウド認証・AIトークン

  1. 1.GitHub

    Actions のシークレットと変数、ワークフローの GITHUB_TOKEN、OIDC とランタイムトークン

  2. 2.クラウド

    AWS/GCP/Azure の認証。OIDC を交換、AWS は iam:CreateAccessKey で長期鍵、Azure はCLIのリフレッシュトークンを使い回す

  3. 3.AIプロバイダ

    OpenAI・Anthropic/Claude・Gemini・Hugging Face・Cursor・Copilot・Codex などのトークン

  4. 4.ファイル・メモリ

    $HOME 以下の .env・.pem・.p12・kubeconfig を再帰探索。実行中プロセスのメモリから JWT・PAT・AWSキーを抽出

出典: Aikido Security の同報告(2026-11-12)。持ち出しは今回 194.150.166[.]244 等への HTTP POST のみ有効化

収集対象は、ランナー上で手に入る認証情報ほぼすべてです。GitHub Actions のシークレットと変数、GITHUB_TOKEN、OIDC とランタイムトークン。AWS/Azure/GCP/Docker/Kubernetes/npm/PyPI/Git/SSH/GPG/Vault/Terraform の認証ファイル。そして OpenAI・Anthropic/Claude・Gemini・Hugging Face・Cursor・Copilot・Codex など AI プロバイダと AI 開発ツールのトークンまで対象に含みます。さらに $HOME 以下の .env・.pem・.p12・.jks・.kdbx・kubeconfig を再帰的に探し、実行中プロセス(Runner.Worker/Listener を優先)のメモリから JWT や PAT、AWSキーを抜きます。self-hosted ランナーでは、インスタンスメタデータ認証やランナーの RSA パラメータまで取ります。

昇格では、OIDC トークンを AWS/GCP/Azure 向けに発行して交換し、AWS では iam:CreateAccessKey で長期鍵を作り、Azure ではキャッシュされた CLI のリフレッシュトークンを使い回して Graph/ARM/Key Vault のトークンを得ます。持ち出しは、GitHub の Cache API・ステップサマリ・アーティファクトといったGitHub自身のインフラを使う経路も用意されていますが、今回のキャンペーンでは外部の 194.150.166[.]244:8080/exfil と 18.143.168[.]96:8080/exfil への HTTP POST のみが有効化されていました。

Aikido は、Cache・ステップサマリ・アーティファクトの各経路が今回オフだったため、wfx-loot アーティファクトや WFX-BEGIN のステップサマリが無いことは「盗まれなかった」ことを意味しないと注意しています。実行自体が消されるため、コミットに対応する実行番号の欠落の方が信頼できる痕跡です。

影響範囲とIoC——汚染パッケージ・10月GhostActionとの重複

自動公開トリガー経由で、いくつかのパッケージにも混入が確認されています。読者が照合できる主なIoCは次のとおりです(IPアドレスは [.] で無害化表記)。

種別 侵害の痕跡(IoC)
汚染パッケージ Packagist digitalelvis/neuronai-studio 3.14.3(入れた端末は侵害とみなす)/ Go github.com/onuragtas/docker-env v1.0.278・v1.0.280(ワークフローファイルのみ・Goソースは無傷だが除去推奨)
ネットワーク 194.150.166[.]244:8080(/exfil)/ 18.143.168[.]96:8080(/exfil)
ブランチ名 wfx-docs/chore/[a-z0-9]{8}/ci-check-[0-9]{4}
PRタイトル docs: dependency audit notes
コミットメッセージ ci: refresh build cache/ci: restore/chore: add ci helper/ci: cleanup/chore: add dependency audit workflow
窃取スクリプト SHA-256 89695abb392d5cfd4972672961e644bb46baa98aa1ed7173c2a2816c762735cf

Aikido は、このキャンペーンが10月の GhostAction キャンペーンと一部アカウントで重複すると指摘しています(10月のIoCは security-audit.yml 等が鍵を 193.32.204[.]199 へ送るもの、および public/fonts/fa-solid-400.woff2 を装ったJavaScript)。10月に侵害されたアカウントは、他の稼働中アカウントより約1,000倍の確率で11月に使われ、100超のリポジトリでは10月のワークフローに11月のペイロードが注入されていました。ただし Aikido はインフラ・手口が異なるため、現時点で同一の攻撃者とは断定していません。盗まれた認証情報が複数の攻撃者に渡ることは珍しくないためです。

サプライチェーン攻撃の確認手順の型は、npm の事例(keyv系30パッケージがnpmで汚染|サプライチェーン攻撃の時系列・影響範囲・自環境の確認コマンド)や GitHub Actionsセキュリティ|2026年連鎖攻撃と新ロードマップ完全ガイド でも整理しています。書き込めるリポジトリに心当たりのIoCが1つでもあれば、完全侵害を想定して鍵を回す——これが Aikido の結論であり、CIシークレットを扱うすべての開発者に当てはまります。

参照ソース