セキュリティ
Keyvとその関連ライブラリがShai-Huludのサプライチェーン攻撃により侵害される
Keyv and friends compromised in active Shai-Hulud supply chain attack (aikido.dev)
要約
2026年8月4日、人気のあるnpmパッケージであるKeyvとその関連ライブラリが、GitHubアカウントの侵害を通じてShai-Huludと名乗る攻撃者によってサプライチェーン攻撃の標的となりました。攻撃者は、これらのパッケージに悪意のあるコードを注入し、ユーザーの認証情報(npmトークン、GitHubトークン、AWS認証情報、Kubernetesシークレットなど)を盗み出すワームを拡散させました。この攻撃により、20億以上の月間インストール数を誇る868以上のパッケージが影響を受けました。
全文翻訳
BlogVulnerabilities & ThreatsKeyv and friends compromised in active Shai-Hulud supply chain attackKeyv and friends compromised in active Shai-Hulud supply chain attackWritten byIlyas MakariPublished on:Aug 4, 20262026年8月4日、キーバリューストレージライブラリであるkeyvのメンテナーのGitHubアカウントが侵害され、そのアクセス権を利用して、関連するパッケージファミリー全体に認証情報窃取型ワームが注入されました。keyvは毎週約1億2700万回のnpmダウンロード数を誇ります。同じメンテナーは、cacheable(月間2900万ダウンロード)、flat-cache(月間5億6500万ダウンロード)、file-entry-cache(月間5億5700万ダウンロード)など、広く使用されている他の多くのキャッシュユーティリティも所有しており、これらもすべて同じ攻撃で巻き込まれました。侵害は、悪意のあるファイルを直接メインブランチにプッシュし、すぐに新しいリリースをカットすることで実行されました。これは、汚染されたバージョンがGitHub Actionsによって署名された有効なプロベナンスとともにnpmに公開されたことを意味します。
侵害されたパッケージには以下が含まれます:
keyv 6.0.0 (月間6億400万ダウンロード)
flat-cache 6.1.24 (月間5億8000万ダウンロード)
file-entry-cache 11.1.6 (月間5億7100万ダウンロード)
cacheable-request 13.0.20 (月間1億3700万ダウンロード)
cacheable 2.5.1 (月間3000万ダウンロード)
@cacheable/memory 2.2.1 (月間2800万ダウンロード)
cache-manager 7.2.10 (月間1600万ダウンロード)
@cacheable/node-cache 3.1.2 (月間600万ダウンロード)
@cacheable/utils 2.5.1 (月間3400万ダウンロード)
@cacheable/net 2.1.1 (月間3.7Kダウンロード)
ecto 5.0.1 (月間4.5Kダウンロード)
また、このサプライチェーンワームが、主要な組織を含む他のメンテナーやパッケージにも非常に活発にコミュニティで拡散していることも確認されています:
@deliveroo/reevent 1.0.1
@or-sdk/invitations 1.4.9
@picsart/ai-sdk 3.32.2
@qlik/embed-runtime 1.6.4
picasso.js 2.11.6
アップデート — 2026年8月4日 13:37 CEST: 執筆時点で、少なくとも868のパッケージ(1381バージョン)がワームによって侵害されており、合計で20億以上の月間インストール数を記録しています。
何が起こったのか
ファミリー内の各パッケージには、setup.mjsとMath_Symbol.jsの2つの新しいファイルが追加され、それぞれのpackage.jsonに "preinstall": "node setup.mjs" というエントリが追加されました。影響を受けたバージョンに対してnpm installを実行したユーザーは、インストールが完了する前にsetup.mjsが自動的に実行されることになります。
setup.mjsは高度に難読化されたドロッパーです。その唯一の目的は、github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ からBun JavaScriptランタイムをサイレントにダウンロードし、それを使用して実際のペイロードであるMath_Symbol.jsを実行することです:
execFileSync(<bun binary>, ['<script_dir>/Math_Symbol.js'], { stdio: 'inherit', cwd: <script_dir> })
Math_Symbol.jsは、高度に難読化された728 KBのJavaScriptファイルで、被害者の環境から秘密情報を収集し、その発見を暗号化し、説明文に "Shai-Hulud: Here We Go Again" と書かれた公開GitHubリポジトリに送信する認証情報窃取機能を含んでいます。ペイロードには、侵害されたパッケージのいずれかをインストールした他のメンテナーのパッケージに感染するためのワームのような伝播機能も含まれています。
何を盗むのか
Math_Symbol.jsファイルは、被害者マシン上の異なる秘密情報ストアを標的とする一連の認証情報抽出器を実装しています。
npmトークン
~/.npmrcを読み込み、ファイルシステム上の他の.npmrcファイルをスキャンします。authToken値と //registry.*:_authToken=... というエントリを抽出します。送信前に、各トークンをregistry.npmjs[.]org/-/whoamiに対してライブで検証します。
GitHubトークン
3種類のトークン形式が標的となります: クラシックPAT(ghp_...)とOAuthトークン(gho_...)、GitHub Appサーバー間トークン(ghs_...)、JWT OIDCトークン。ソースには、~/.config/gh/hosts.yml、環境変数、およびファイルシステムのスキャンが含まれます。
GitHub Actionsランナー上では、ペイロードはランナープロセスのメモリを直接読み取り、秘密情報ストア全体をダンプするシェルコマンドも実行します。npm公開に使用される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インスタンスメタデータサービス(169.254.169.254)で、IMDSv2を最初に試行し、IMDSv1にフォールバックします。
ECSコンテナメタデータエンドポイント(169.254.170.2)。
AWS Secrets Managerで、複数のリージョンにわたってsecretsmanager:ListSecretsを呼び出し、そこに保存されているすべての秘密情報を列挙して送信します。
Kubernetesシークレット
/var/run/secrets/kubernetes.io/serviceaccount/ からサービスアカウントトークン、CA証明書、名前空間を読み取ります。サービスアカウントトークンを使用してKubernetes APIに直接クエリを実行し、名前空間内のすべてのシークレットを取得します。また、KUBECONFIGおよび~/.kube/configも標的とします。
HashiCorp Vaultトークン
優先順位に従って6つのソースをチェックします: VAULT_TOKEN環境変数、~/.vault-token、GitHub Actionsランナーパス /home/runner/.vault-token、いくつかのよく知られたコンテナパス、盗まれたサービスアカウントJWTを使用したKubernetes認証ログイン、および盗まれたAWS認証情報を使用したVaultのAWS IAM認証エンドポイント。トークンを取得した後、/v1/sys/mountsを介してすべてのKVストアを列挙し、KV v1およびv2パスからすべての秘密情報を読み取ります。
StripeおよびSlackトークン
ファイルシステムスキャナーによってアクセスされたすべてのファイルから、Stripe APIキー(テスト用と本番用、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データベース(*.kdbx)。
VPN設定(*.ovpn)。
IDE設定ファイル(.vscode/tasks.jsonおよび.claude/settings.jsonを含む)。
5MBを超えるファイルはスキップされます。最大64の同時読み取りが使用されます。汎用正規表現エンジンも、スキャンされたすべてのファイルに適用され、PEMプライベートキー、SSH公開キー、Azureストレージキー、埋め込まれた認証情報を持つデータベース接続文字列、および一般的な秘密フィールド名に一致する汎用key=valueパターンをフラグ付けします。
Aikidoによる検出方法
Aikidoユーザーの場合、中央フィードを確認し、マルウェアの問題でフィルタリングしてください。これは100/100のクリティカルな問題として表示されます。Aikidoは夜間に再スキャンしますが、手動での再スキャンをすぐにトリガーすることをお勧めします。
まだAikidoユーザーでない場合は、アカウントを作成してリポジトリを接続できます。当社のマルウェアカバレッジは無料プランに含まれており、クレジットカードは不要です。
チーム全体をより広範囲にカバーするために、AikidoのDevice Protectionは、チームのデバイスにインストールされているソフトウェアパッケージに対する可視性と制御を提供します。ブラウザ拡張機能、コードライブラリ、IDEプラグイン、ビルド依存関係をすべて1か所でカバーします。マルウェアがインストールされる前に停止します。
将来の保護のために、Aikido Safe Chain(オープンソース)を検討してください。Safe Chainは既存のワークフローに配置され、npm、npx、yarn、pnpm、およびpnpxコマンドをインターセプトし、インストール前にAikido Intelに対してパッケージをチェックします。
共有: https://www.aikido.dev/blog/keyv-and-friends-compromised-in-npm-supply-chain-attackText LinkScan for malwareStart for Free 4.7/5Tired of false positives? Try Aikido like 100k others.Start NowGet a personalized walkthroughTrusted by 100k+ teamsBook NowScan your app for IDORs and real attack pathsTrusted by 100k+ teamsStart ScanningSee how AI pentests your appTrusted by 100k+ teamsStart TestingStart NowSimilar PostsSee all July 31, 2026•Vulnerabilities & ThreatsAnthropic's Fever Dream: Claude's package that stole real keysAnthropic disclosed an agent that pushed real malware to PyPI. We think we found the package, and every mistake in it points back to the AI.#AI#AI Safety#Malware July 22, 2026•Vulnerabilities & ThreatsFinding eight high-severity vulnerabilities in NodeBB in six hoursEight high-severity NodeBB vulnerabilities, found by our AI Pentest in six hours. Full technical breakdown of the XSS chains, auth bypasses, and post hijacking.#AI Penetration Testing#Vulnerabilities July 19, 2026•Vulnerabilities & ThreatsSleeperGem: RubyGems supply chain attack targets dormant maintainer accountsSleeperGem: two dormant RubyGems maintainer accounts were hijacked to inject malware into trusted