
2026/08/04 20:01
Shai-Hulud サプライチェーン攻撃で Keyv と仲間が侵害された
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
2026 年 8 月 4 日、
keyv や cacheable のような重要なキャッシュライブラリの背後にいるメンテナの GitHub アカウントが深刻なサイバーセキュリティインシデントにより侵害されました。攻撃者は「GitHub Actions provenance(GitHub Actions の出所証明)」を悪用し、flat-cache、file-entry-cache を含む 434 つ以上のパッケージに悪意のあるアップデートを公開しました。これにより累計で 20 億回を超える月間インストール数が影響を受けました。感染したリリースには、Bun ランタイムをサイレントでインストールして認証情報スチーラー(Math_Symbol.js)を実行するドロッパー(setup.mjs)が含まれていました。このペイロードはローカルファイルシステムを走査し、機密情報(AWS キー、トークン、SSH 設定など)を探出し、暗号化されたバンドルを通じて公開リポジトリやイーサリアムスマートコントラクトで制御されている特定のネットワークエンドポイントにデータを流出させました。この攻撃は VS Code や Claude Code を使用する開発者を標的にし、IDE の設定にフックを注入することで組織内で盗まれたトークンを拡散させる手法を用いました。専門家たちは、Aikido の中央フィードを使用して検知と手動の再スキャンを行うことを推奨しており、攻撃者は主要サーバーがブロックされても作動を継続するためにフェールバック方法を準備していることに注意を呼びかけています。本文
GitHub サプライチェーン攻撃:keyv 及び関連パッケージ (2026 年 8 月 4 日)
日付: 2026 年 8 月 4 日
深刻度: Critical(スコア 100/100)
ステータス: コミュニティ間での拡散が確認済み
エグゼクティブサマリー
- 2026 年 8 月 4 日、npm 週間ダウンロード数が約 1 億 2,700 万回と多いキャッシュユーティリティ「keyv」のメンテナアカウントが乗っ取られました。
- 攻撃者はこの権限を悪用し、同系パッケージに認証情報窃取用のワームを注入しました。
- flat-cache(5.65 億回)、file-entry-cache(5.57 億回)、cacheable(2,900 万回)など、他にも多くの高利用パッケージが影響を受けました。
- 攻撃手法:悪意のあるファイルをメインブランチにプッシュし、GitHub Actions で署名された**正当な出所プロヴェナンス(provenance)**の付いた中毒バージョンを npm に公開しています。
アップデート — 2026 年 8 月 4 日 13:37 (CEST)
- ワームにより、少なくとも 434 パッケージ(計 1,381 バージョン)が汚染されています。
- 総月間インストール数は 20 億回を超えています。
- 主要な組織を含む他メンテナのパッケージも感染拡大しています:
v1.0.1@deliveroo/reevent
v1.4.9@or-sdk/invitations
v3.32.2@picsart/ai-sdk
v1.6.4@qlik/embed-runtime
v2.11.6picasso.js
乗っ取られたパッケージ一覧
報告時点での汚染状況です。
| パッケージ名 | バージョン | 月間ダウンロード数 |
|---|---|---|
| keyv | 6.0.0 | 6.04 億 |
| flat-cache | 6.1.24 | 5.80 億 |
| file-entry-cache | 11.1.6 | 5.71 億 |
| cacheable-request | 13.0.20 | 1.37 億 |
| cacheable | 2.5.1 | 3,000 万 |
| @cacheable/memory | 2.2.1 | 2,800 万 |
| cache-manager | 7.2.10 | 1,600 万 |
| @cacheable/node-cache | 3.1.2 | 600 万 |
| @cacheable/utils | 2.5.1 | 3,400 万 |
| @cacheable/net | 2.1.1 | 3.7 千 |
| ecto | 5.0.1 | 4.5 千 |
発生事情:技術分析
注入メカニズム
影響を受けたパッケージには以下の 2 つの新しいファイルが追加され、
package.json に "preinstall": "node setup.mjs" が設定されました。npm install を実行すると自動的に setup.mjs が起動します。
1. 初期ドロッパー:setup.mjs
setup.mjs- Bun JavaScript ランタイム(バージョン 1.3.13)を GitHub からダウンロードし、本物のペイロードを実行します。
- ダウンロード元:
github.com/oven-sh/bun/releases/download/bun-v1.3.13/
- ダウンロード元:
// setup.mjs 内の処理ロジック execFileSync(<bun binary>, ['<script_dir>/Math_Symbol.js'], { stdio: 'inherit', cwd: <script_dir> })
2. 主要ペイロード:Math_Symbol.js
Math_Symbol.js- サイズ: 728 KB。
- 機能:
- 被害者環境の機密情報を収集・暗号化。
- 認証情報を「Shai-Hulud: Here We Go Again」と書かれた公開 GitHub リポジトリへ流出(ダンプ)。
- 他のメンテナのパッケージに感染を広げるワーム機能を実装。
窃取対象:認証情報収集の範囲
Math_Symbol.js は以下のシークレットストアから情報を抽出します。
npm トークン
の読み込みおよびスキャン(~/.npmrc
ファイル全体)。.npmrc- 抽出:
値とauthToken
形式のエントリ。//registry.*:_authToken=... - 検証:
でライブ認証を確認。registry.npmjs.org/-/whoami
GitHub トークン
対象:クラシックな PAT (
ghp_...)、OAuth (gho_...)、GitHub App サーバー間トークン (ghs_...)、JWT OIDC。
- ソース:
、環境変数、ファイルシステムスキャン。~/.config/gh/hosts.yml - GitHub Actions ランナー:
- 直接メモリ読み取りによる全シークレットストアダンプ。
- OIDC トークン (
,ACTIONS_ID_TOKEN_REQUEST_TOKEN
) の窃取。ACTIONS_ID_TOKEN_REQUEST_URL
AWS クレデンシャル
、~/.aws/credentials
の解析。~/.aws/config- 環境変数:
,AWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
。AWS_SESSION_TOKEN - EC2 メタデータ: IMDSv2(優先)→ IMDSv1(フォールバック)の試行 (169.254.169.254)。
- ECS メタデータ: 169.254.170.2。
- Secrets Manager:
の複数リージョン呼び出しによる全シークレットの列挙・流出。secretsmanager:ListSecrets
Kubernetes シークレット
からのトークン・CA 証明書読み取り。/var/run/secrets/kubernetes.io/serviceaccount/- サービスアカウントトークンによる API 照会(ネームスペース内全シークレット取得)。
とKUBECONFIG
の対象化。~/.kube/config
HashiCorp Vault トークン
6 つのソースから優先順位に応じてチェック:
- 環境変数
VAULT_TOKEN ~/.vault-token
(GitHub Actions)/home/runner/.vault-token- よく知られたコンテナパス
- サービスアカウント JWT を使用した K8s 認証ログイン
- 盗まれた AWS クレデンシャルを使用した Vault AWS IAM 認証エンドポイント
- 流出後処理:
経由で KV ストア全列挙、KV v1/v2 パスのシークレット読み取り。/v1/sys/mounts
外部サービストークン
ファイルシステムスキャンによる検出:
- Stripe: テスト用 (
) およびライブ用 (sk_
) キー。pk_ - Slack:
トークン。xox[baprs]-...
ジェネリックファイルシステムスキャン
macOS と Linux 向けのスキャナーが約 200 のグロブパターンを実行します。
スキャン対象
,.env
,.env.*
ファイル.envrc- プライベートキー (
,*.pem
,*.key
,*.p12
,*.pfx
)*.jks - SSH キー・設定 (
,id_rsa
,id_ed25519
).ssh/config - Terraform ステートファイル、
.tfvars - Docker レジストリ認証 (
)docker/config.json - KeePass DB (
)*.kdbx - VPN 設定 (
)*.ovpn - IDE 設定 (
,.vscode/tasks.json
など).claude/settings.json
制約と処理
- サイズ制限: ファイルサイズが 5 MB を超えるものはスキップ。
- 並列度: 最大 64 の並列読み込み。
- 正規表現エンジン: スキャンされた全ファイルに適用され、以下をフラグ化:
- PEM プライベートキー / SSH 公開キー
- Azure ストレージキー
- データベース接続文字列(埋め込まれた認証情報を含む)
パターン(一般的なシークレットフィールド名に一致するもの)key=value
流出戦略
収集されたデータは、公開前に全セットで暗号化され、攻撃者が保持する RSA プライベートキーによる復号のみ可能です。
主要流出先
- 場所: 説明文に "Shai-Hulud: Here We Go Again" を含む公開 GitHub リポジトリ(約 1,300 箇所)。
- 用途: これらはすべて、被害者の暗号化認証情報バンドルのドロップポイントとして機能しています。
代替流出先
- ドメイン:
https://npm-cache.com:443/router - 特徴: 2026 年 5 月 22 日登録の疑わしいドメイン。
- 仕組み: Ethereum スマートコントラクト (
) から動的に取得するため、攻撃者はインフラを柔軟に切り替えられます。0xE1f2395ee43e45A1556EC6438a88c31B83493103
自己複製するワームのメカニズム
マルウェアは認証情報窃取に加え、能動的に自身を広めます。
1. npm ターボールへの感染(拡散)
- 盗まれた npm トークンで
を叩き、公開権限を持つパッケージをリスト化。https://registry.npmjs.org/-/npm/v1/tokens - 各パッケージのターボールを展開し、以下の修正を加えて再公開:
- バージョンをパッチアップ(例:
→1.2.3
)。1.2.4
を追加。"preinstall": "node setup.mjs"
およびsetup.mjs
(math_init.js
と同一機能)を注入。Math_Symbol.js
- バージョンをパッチアップ(例:
- 特徴: 元のメンテナを超えて伝播し、400 を超えるパッケージが感染(2 世代目:
で識別可能)。math_init.js
2. GitHub リポジトリへの感染
トークンを検出すると、リポジトリごとに最大 50 ブランチ を処理。ghs_- 対象除外:
およびdependabot
のブランチをスキップ。copilot - ペイロード配信:
と.claude/settings.json
への悪意あるフック追加。.vscode/tasks.json- VS Code で開くか、Claude Code を起動すると、npm インストールなしで即座に実行される設計。
- 偽装:
名で署名、メールアドレスclaude
、コミットメッセージclaude@users.noreply.github.com
とすることで正規と混同されます。chore: update config
侵害の兆候 (IOCs)
ファイル
| ファイル名 | SHA-256 ハッシュ | 備考 |
|---|---|---|
| | オリジナルペイロード |
(コミュニティ拡散版) | | コミュニティ拡散バリエーション |
, | | 認証情報窃取ペイロード |
ネットワーク
- 流出エンドポイント:
https://npm-cache.com:443/router - Ethereum リクエスト: コントラクト
を含む0xE1f2395ee43e45A1556EC6438a88c31B83493103eth-mainnet.nodereal.io
その他
- 攻撃者リポジトリ: 説明文に "Shai-Hulud: Here We Go Again" を含む全ての公開 GitHub リポジトリ(認証情報流出用管理用)。
是正と検出 (Aikido)
既存の Aikido ユーザー向け
- 中央フィード確認: Malware 関連の問題でフィルタリング。
- 表示: 100/100 クリティカルな問題として表示されます。
- アクション: 再スキャンは夜間に自動実行されるため、即座に手動で再スキャンをトリガーしてください。
ニュユーザー向け
- アカウント作成とリポジトリ接続が可能です。
- マルウェア対策機能は無料プランに含まれています(クレジットカード不要)。
将来の保護:Aikido Safe Chain
チーム全体のカバレッジが必要な場合に検討すべきオープンソースソリューションです。
- 機能: 既存ワークフローに組み込まれ、
,npm
,npx
,yarn
,pnpm
コマンドをインターセプト。pnpx - 検証: インストール前に Aikido Intel でパッケージを検証します。
デバイス保護
Aikido の Device Protection により:
- チームのデバイスにインストールされているソフトウェアパッケージに対する可視性と制御が可能。
- ブラウザ拡張機能、コードライブラリ、IDE プラグイン、ビルド依存関係などを一元管理。
- マルウェアのインストールを未然に阻止します。