ファントムギップワームを介して広がるミアスマサプライチェーン攻撃
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
新しいMiasmaワームの変種が悪意のあるファイルを悪用してnpmエコシステム内で拡散しています。 binding.gyp ファイルが、 npm install中にコード実行をトリガーします。この方法は多くの伝統的なスクリプトベースのチェックをすり抜け、代替のBunランタイムをダウンロードし、CI/CDやクラウドの認証情報を盗み、収集したデータをGitHubのデットドロップアカウントに送信します。57以上のパッケージが、2026年6月3日に2時間以内に展開された迅速なキャンペーン中に妥協されました。ワームはAIコーディングアシスタントの構成ファイル内にもバックドアを植え付けます。
調査
研究者たちは強化されたGitHub Actionsランナー内で侵入を再現し、攻撃に関与した完全なプロセスツリー、ネットワークトラフィック、コードアーティファクトをキャプチャしました。彼らの分析により、Phantom Gyp技法、四段階の難読化されたペイロードチェーン、およびNode.jsの振る舞いにのみ焦点を当てた検出を避けるためのBunの使用が明らかになりました。資格情報の盗難はランナーのメモリを読み取り、クラウドインスタンスのメタデータエンドポイントをクエリすることで実行されました。そしてデータの流失は、認証済みのGitHub APIリクエストを通じて動的にリポジトリを作成してデータを保存する悪意のあるアカウントを通じて行われました。
緩和策
防御者は、ネイティブビルドステップをブロックし、 node-gyp を可能な限り無効化するか、高リスク環境ではインストールスクリプトを無視して露出を減らすべきです。レジストリのクールダウンウィンドウとSLSAプロビナンス署名の検証も、パッケージの改ざんを防ぐのに役立ちます。セキュリティチームは予期しないBunのダウンロード、オーバーサイズのルート index.js ファイル、CI発行トークンによる新しいGitHubリポジトリの作成を監視するべきです。露出したトークンやクラウド認証情報は直ちに回転させる必要があります。
対応
組織は、パターンを含む binding.gyp ファイルを検知し、 <!(node index.js ...)Bunランタイムのダウンロードについて警告し、悪意のある活動が確認され次第、影響を受けたワークフローを停止するべきです。リポジトリはAIアシスタント構成ファイルが注入されていないかスキャンし、迅速にクリーンアップされるべきです。盗難に遭ったトークンはすべて無効化及び回転され、CI/CDの権限範囲が見直され、資格情報の露出範囲を決定するための完全なインシデントレスポンス調査が開始されるべきです。
攻撃フロー
この部分はまだ更新中です。通知を受け取るためにサインアップしてください。
通知する検出
標準ツールを介したリモートファイルアップロード/ダウンロード(コマンドライン経由)
表示
Linuxスクリプトが一時フォルダに作成されました(file_event経由)
表示
Linuxホストに隠しファイルが作成されました(file_event経由)
表示
IOCs (HashSha256) によって検出:Phantom Gypを介したMiasma npmサプライチェーン攻撃:自己拡散ワーム
表示
IOCs (HashMd5) によって検出:Phantom Gypを介したMiasma npmサプライチェーン攻撃:自己拡散ワーム
表示
Miasma npmサプライチェーン攻撃検出[ネットワークインディケータ]
表示
Phantom Gyp技法によるMiasma npmサプライチェーン攻撃検出[Linuxプロセス作成]
表示
シミュレーション実行
前提条件:テレメトリとベースラインのプレフライトチェックに合格していること。
合理性:このセクションでは、検出ルールをトリガーするために設計された敵対者技術(TTP)の正確な実行を詳述します。コマンドとナラティブは、特定されたTTPを直接反映し、検出論理によって期待される正確なテレメトリを生成することを目標とします。
-
攻撃ナラティブとコマンド:
攻撃者は、悪意のあるコードを追加してオープンソースのnpmパッケージを侵害します。binding.gyp開発者が実行したときnpm installパッケージのビルドプロセスが次を呼び出します。node-gyp rebuild生成されたビルドスクリプトの内部で、攻撃者は次の操作を行います:- Bunランタイムをダウンロードします (署名済みバイナリ)を介して
curl一時ディレクトリへ(/tmp/b-<rand>/). - 特権を昇格させます 次を呼び出すことにより
sudo python3Zipを解凍し、バイナリを配置します。/usr/local/bin. - 開発者のGitHubトークンを収集します 使用する
gh auth token. - ペイロードを実行します (
bun run /tmp/p1764ajw42rg.js) がデータを流出させます。
それぞれのステップは、Sigmaルールの
containsリストを満たす形でプロセス作成ログにそのまま表示されます。 - Bunランタイムをダウンロードします (署名済みバイナリ)を介して
-
回帰テストスクリプト: 次のBashスクリプトは、制御されたラボ環境でコマンドチェーンを正確に再現します。
# miasma_phantom_gyp_simulation.sh set -euo pipefail # 1. 悪意のあるbinding.gypを含む偽のnpmパッケージを準備 PKG_DIR=$(mktemp -d /tmp/miasma_pkg.XXXX) cd "$PKG_DIR" npm init -y >/dev/null 2>&1 cat > binding.gyp <<'EOF' { "targets": [ { "target_name": "evil", "sources": [ "evil.c" ] } ] } EOF echo "int main(){return 0;}" > evil.c # node‑gypをローカルでインストール npm install node-gyp >/dev/null 2>&1 # 2. node‑gyp rebuild実行(最初の指標) ./node_modules/.bin/node-gyp rebuild # 3. Bunランタイムのダウンロード(2番目の指標) TMPDIR=$(mktemp -d /tmp/b-XXXXXX) curl -sSL "https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/bun-linux-x64-baseline.zip" -o "$TMPDIR/bun.zip" # 4. sudo python3を使用して特権を昇格 zip解凍(三番目の指標) sudo python3 - <<PYTHON import zipfile, sys, os zip_path = os.getenv('TMPDIR') + '/bun.zip' with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(os.getenv('TMPDIR')) PYTHON # 5. GitHubトークンの取得(4番目の指標) # 注意:これにはGitHub CLIがインストールされ、事前に認証されている必要があります。 gh auth token > "$TMPDIR/gh_token.txt" # 6. Bunを介した悪意のあるペイロードの実行(5番目の指標) # ダミーのJSペイロードを作成 echo "console.log('exfiltrated');" > "$TMPDIR/p1764ajw42rg.js" "$TMPDIR/bun" run "$TMPDIR/p1764ajw42rg.js" echo "シミュレーション完了。生成されたアラートを確認するためにSIEMを確認してください。" -
クリーンアップコマンド: 一時的なアーティファクトと権限昇格アーティファクトを削除します。
# cleanup_miasma_simulation.sh set -euo pipefail # 一時ディレクトリの削除 rm -rf "$PKG_DIR" "$TMPDIR" # /usr/local/binに配置されたBunバイナリをオプションで削除 if command -v bun >/dev/null; then sudo rm -f "$(command -v bun)" fi # キャプチャされたGitHubトークンのクリア shred -u "$HOME/.config/gh/hosts.yml" 2>/dev/null || true echo "クリーンアップが完了しました。"