SOC Prime Bias: クリティカル

28 11月 2025 18:53

シャイ=フルード: 広範囲にわたるnpmサプライチェーン攻撃

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
シャイ=フルード: 広範囲にわたるnpmサプライチェーン攻撃
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

概要

GitLabは、npmエコシステムを対象とした広範なサプライチェーン侵入を公表しました。このキャンペーンは、悪意のあるpreinstallスクリプトを介して更新されたShai-Huludマルウェアの変種をプッシュします。このペイロードはクラウドおよびコードホストの認証情報を収集し、データを攻撃者制御のGitHubリポジトリに送信し、トロイの木馬化されたパッケージを再発行することでさらに拡散します。ビルトインのデッドマンスイッチは、攻撃者のインフラが妨害された場合にユーザーファイルを消去または破損させる可能性があります。

調査

GitLabの脆弱性リサーチチームは、setup_bun.jsローダーを参照する変更されたpackage.jsonを持つ汚染されたnpmパッケージに活動の痕跡をたどりました。このローダーはBunランタイムをインストールし、資格情報を収集し、Trufflehogを実行してシークレットを発見し、結果を公開GitHubリポジトリにアップロードするバンドルされたbun_environment.jsペイロードをトリガーします。マルウェアはまた、ドロップボックスとして新しいGitHubリポジトリを生成し、盗まれたnpmトークンを悪用して危険なパッケージを再発行します。GitHubとnpmへのアクセスが切断された場合、ペイロードはユーザーファイルを削除または上書きに進みます。

緩和策

GitLabは、組織に対してnpmの依存関係を予期しないpreinstallスクリプトや公開されたパッケージの完全性を確認するよう推奨しています。チームは、許可されていないsetup_bun.jsローダーを削除し、露出したnpmおよびGitHubトークンを無効にし、「Sha1-Hulud: The Second Coming」というマーカーが付いた疑わしいGitHubリポジトリを監視するべきです。エンドポイント保護は、信頼されていないNodeスクリプトをブロックし、報告書に記載された破壊的なコマンドラインを検出するように構成する必要があります。

対応

活動が検出された場合、影響を受けたシステムを隔離し、すべての侵害された認証情報を無効化し、内部レジストリから悪意のnpmパッケージを削除します。データの漏洩やファイルの破壊を確認または除外するためにフォレンジック調査を実施します。クラウドプラットフォームおよびGitHubのために新しい認証情報を発行し、攻撃者のマーカーに一致する新規作成のリポジトリをGitHubで継続的に監視します。最後に、CI/CDパイプラインを強化して任意のpreinstallスクリプトを禁止します。

mermaid graph TB %% クラス定義 classDef technique fill:#99ccff classDef file fill:#ffcc99 classDef tool fill:#cccccc classDef malware fill:#ff9999 classDef operator fill:#ff9900 %% ノード – 攻撃テクニック tech_supply_chain[“<b>テクニック</b> – <b>T1195.001 サプライチェーンの妥協</b>: 悪意のあるnpmパッケージがプリインストールスクリプトを追加する修正されたpackage.jsonを公開”] class tech_supply_chain technique tech_client_exec[“<b>テクニック</b> – <b>T1203 クライアント実行のためのエクスプロイト</b>: npmはパッケージインストール中にプリインストールスクリプトを実行し、悪意のあるsetup_bun.jsを実行”] class tech_client_exec technique tech_software_ext[“<b>テクニック</b> – <b>T1176 ソフトウェア拡張機能</b>: プリインストールスクリプトは正規のパッケージへの悪意のある拡張機能として機能する”] class tech_software_ext technique tech_obfuscate[“<b>テクニック</b> – <b>T1027 難読化されたファイルまたは情報</b>: 大きな難読化されたペイロードbun_environment.jsがダウンロードされる”] class tech_obfuscate technique tech_decode[“<b>テクニック</b> – <b>T1140 難読化/デコード</b>: ペイロードは実行前にデコードされる”] class tech_decode technique tech_hidden_files[“<b>テクニック</b> – <b>T1564.001 隠しファイルとディレクトリ</b>: .truffler‑cache/とサブディレクトリを作成する”] class tech_hidden_files technique tech_path_excl[“<b>テクニック</b> – <b>T1564.012 ファイルパスの排除</b>: 隠しパスに悪意のあるバイナリを保存して検出を回避”] class tech_path_excl technique tech_cred_in_files[“<b>テクニック</b> – <b>T1552.001 ファイル内の資格情報</b>: .npmrc、環境変数、およびコンフィグファイルをスキャンしてクラウドやリポジトリのトークンを探す”] class tech_cred_in_files technique tech_auto_collect[“<b>テクニック</b> – <b>T1119 自動収集</b>: トラッフルホッグを実行してファイルシステムからシークレットを収集する”] class tech_auto_collect technique tech_exfil_repo[“<b>テクニック</b> – <b>T1567.001 コードリポジトリへのデータ搾取</b>: 盗まれたGitHubトークンを使用して公開リポジトリを作成し、資格情報をアップロードする”] class tech_exfil_repo technique tech_destructive[“<b>テクニック</b> – <b>T1565 データ操作</b>: 破壊的なコマンド(del、cipher、shred)を実行してユーザーデータを削除および上書きする”] class tech_destructive technique tech_impair[“<b>テクニック</b> – <b>T1562 防御の損害</b>: デッドマンスイッチがデータの破壊によって回復を無効化する”] class tech_impair technique tech_propagate[“<b>テクニック</b> – <b>T1195.001 サプライチェーンの伝播</b>: 盗まれたnpmトークンを使用して犠牲者のパッケージに悪意のあるプリインストールスクリプトを注入し、それらを再発行する”] class tech_propagate technique %% ノード – ファイルとツール file_package_json[“<b>ファイル</b>: 悪意のあるプリインストールスクリプトを含むpackage.json”] class file_package_json file file_setup_bun[“<b>ファイル</b>: setup_bun.js (プリインストールスクリプト)”] class file_setup_bun file file_bun_env[“<b>ファイル</b>: bun_environment.js (難読化されたペイロード)”] class file_bun_env file file_trufflehog[“<b>ツール</b>: .truffler‑cacheに保存されたトラッフルホッグバイナリ”] class file_trufflehog tool file_hidden_dir[“<b>ファイル</b>: 隠しディレクトリ .truffler‑cache/”] class file_hidden_dir file file_github_repo[“<b>ファイル</b>: データ搾取のために作成された公開GitHubリポジトリ”] class file_github_repo file %% エッジ – 攻撃フロー tech_supply_chain u002du002d>|プリインストールスクリプトを追加| file_package_json file_package_json u002du002d>|npmインストール中にトリガー| tech_client_exec tech_client_exec u002du002d>|実行| file_setup_bun file_setup_bun u002du002d>|ダウンロード| file_bun_env file_bun_env u002du002d>|である| tech_obfuscate tech_obfuscate u002du002d>|要求する| tech_decode tech_decode u002du002d>|実行可能ペイロードを生成| tech_software_ext tech_software_ext u002du002d>|作成| file_hidden_dir file_hidden_dir u002du002d>|保存する| file_trufflehog file_trufflehog u002du002d>|使用| tech_auto_collect tech_auto_collect u002du002d>|資格情報を収集| tech_cred_in_files tech_cred_in_files u002du002d>|トークンを提供| tech_exfil_repo tech_exfil_repo u002du002d>|データをアップロード| file_github_repo tech_exfil_repo u002du002d>|トークンが失われた場合トリガー| tech_destructive tech_destructive u002du002d>|経由で回復を無効| tech_impair tech_impair u002du002d>|有効にする| tech_propagate tech_propagate u002du002d>|新しいnpmパッケージに悪意のあるプリインストールを注入| tech_supply_chain %% スタイリング class tech_supply_chain,tech_client_exec,tech_software_ext,tech_obfuscate,tech_decode,tech_hidden_files,tech_path_excl,tech_cred_in_files,tech_auto_collect,tech_exfil_repo,tech_destructive,tech_impair,tech_propagate technique class file_package_json,file_setup_bun,file_bun_env,file_hidden_dir,file_github_repo file class file_trufflehog tool

攻撃フロー

シミュレーションの実行

前提条件:テレメトリー&ベースラインのプリフライトチェックに合格している必要があります。

攻撃の物語とコマンド

攻撃者は侵入されたLinuxホスト上に足場を得ました。さらなるJavaScriptベースのペイロードを実行可能な永続的なランタイムを確立するために、彼らはBunランタイムをダウンロードしてインストールします。bashに直接ストリーミングされるインストーラーを介して一行でsleepでタイミングをシミュレートしたshredで確認した後すぐに、破壊的な操作を開始して(/var/log/auth.log).

手順は次の通りです:

  1. Bunのダウンロード&インストール:
    curl -fsSL https://bun.sh/install | bash
  2. 短時間待ちます(スイッチのタイミングをシミュレートするため)。
  3. 破壊的なshredを実行:
    shred -uvz -n 1 /var/log/auth.log

両方のコマンドは、Sigmaルールの正確なキーワードに一致するプロセス作成イベントを生成します。

回帰テストスクリプト

#!/bin/bash
# -------------------------------------------------
# Shai‑Hulud「Bunインストール + shred」動作をシミュレート
# -------------------------------------------------

# 1️⃣ Bunをインストール(検出に必要な正確なコマンド)
echo "[*] Bunランタイムをインストール中..."
curl -fsSL https://bun.sh/install | bash

# 現実的なタイミングをエミュレートするための短いポーズ
sleep 5

# 2️⃣ 破壊的なファイルワイプを実行(正確なコマンドが必要)
TARGET_FILE="/var/log/auth.log"
if [[ -f "$TARGET_FILE" ]]; then
    echo "[*] $TARGET_FILE を削除しています..."
    shred -uvz -n 1 "$TARGET_FILE"
else
    echo "[!] ターゲットファイルが見つかりません。デモ用にダミーファイルを作成中。"
    echo "ダミーデータ" > "$TARGET_FILE"
    shred -uvz -n 1 "$TARGET_FILE"
fi

echo "[*] シミュレーション完了。"

クリーンアップコマンド

#!/bin/bash
# -------------------------------------------------
# Bun/Shredシミュレーション後のクリーンアップ
# -------------------------------------------------

# 残留するBunファイルを削除(インストールされている場合)
if command -v bun >/dev/null 2>&1; then
    echo "[*] Bunランタイムを削除しています..."
    rm -rf "$HOME/.bun"
    rm -f /usr/local/bin/bun
fi

# 破壊されたログファイルを再作成(システム安定性のため)
TARGET_FILE="/var/log/auth.log"
if [[ ! -f "$TARGET_FILE" ]]; then
    echo "再作成されたログプレースホルダー" | sudo tee "$TARGET_FILE" >/dev/null
    sudo chmod 600 "$TARGET_FILE"
fi

echo "[*] クリーンアップ完了。"