エグゼクティブ サマリー

npmエコシステムのセキュリティは、2025年9月に重大な転換点に達しました。Shai Huludワームは、悪意のあるパッケージの侵害と再配布を自動化する自己複製型マルウェアで、npm攻撃の「迷惑な」時代の終わりと、重大な脅威の始まりとなりました。

この転機以来、Unit 42はサプライチェーンにおける侵害の頻度と技術的な深さを積極的に加速させてきました。攻撃は、一連の孤立したタイポスクワッティング インシデントから、現代のソフトウェア開発の原動力となっている信頼を武器にする、さまざまな脅威アクターによる組織的なキャンペーンへと発展しています。

4月には2件のキャンペーンが発生しました。最初のキャンペーンは2026年4月22日に始まり、「Shai-Hulud: The Third Coming」というストリングが含まれるものでした。2回目は2026年4月29日に開始され、通称Mini Shai-Huludと呼ばれるものです。

npmの脅威に対する新たなベースライン

Shai Huludインシデントは、npmレジストリがマルウェアの拡散のための戦力倍増装置として使用される可能性があることを証明しました。その後数カ月で、攻撃者の戦術、手法、手順(TTP)に3つの核心的な変化が見られました。

  • ワーム型の伝播: 悪意のあるペイロードは、npmトークンとGitHubパーソナル アクセス トークン(PAT)の窃取を優先するようになり、2026年3月のAxiosの侵害で見られたように、合法的なパッケージを自動的に感染させ、再公開するようになりました。
  • インフラストラクチャレベルの永続性: 攻撃者はもはやデータを盗むだけではありません。継続的インテグレーション/継続的デリバリ(CI/CD)パイプラインに組み込まれ、企業環境への長期的で検知不可能なアクセスを獲得しているのです。
  • 多段階ペイロード: 2025年9月のテンプレートに倣い、現在の攻撃は、自動化されたスキャナーを回避するために、特定の環境条件下でのみ起動する休止状態の「スリーパー」への依存を多くの場合でデプロイします。

npm攻撃の全体的な概要

npmの侵害には共通のテーマがあります。Shai Hulud以降の時代には、アタックサーフェスを全体的に考えることが有効だと私たちは考えています。

この記事では、以下について取り上げます:

  1. 主要なインシデントの詳細: 重大なパッケージ侵害のリアルタイム分析(例: Shai-Hulud 2.0Axios、Chalk/Debug)
  2. キャンペーン間の相関:異なる攻撃を同じ脅威アクターに結びつける共通のインフラストラクチャやコード スニペットの特定
  3. 修復プレイブック: 認証情報をローテーションし、ローカルおよびクラウドベースのキャッシュから悪意のある依存関係を削除するための実用的なガイダンス

Shai-Hulud: 新しい波

bitwarden/cliのバージョン2026.4.0として公開された悪意のあるnpmパッケージは、TeamPCPを原因とする広範なサプライチェーン キャンペーンの一部として特定されました。このパッケージは正規のBitwardenコマンドライン インターフェイス(CLI)パスワード マネージャーになりすまします。

インストールされると、クラウド プロバイダ、CI/CDシステム、開発者ワークステーションから認証情報を盗み出す多段階のペイロードが実行されます。そして、被害者が公開できるすべてのnpmパッケージをバックドアすることで自己増殖します。公開されたGitHubリポジトリの内部には、「Shai-Hulud:The Third Coming」という文字列が含まれていることが指摘されています

攻撃者は同じペイロードを複数のCheckmarx配布チャネルにデプロイしました:

  • Docker Hubのイメージ
  • GitHub Actions
  • VSコードのエクステンション

これは、影響範囲を最大化するために、侵害された開発者ツールの認証情報を武器化するための組織的キャンペーンであることを示しています。

パロアルトネットワークスのお客様は、以下の製品とサービスによって、本書で取り上げる脅威に対する確実な保護を構築できます:

Unit 42インシデント レスポンス チームは、お客様のリスク軽減のために、侵害を受けた際の支援だけでなくプロアクティブな評価を提供しています。

関連するUnit 42のトピック サプライチェーン, 認証情報の収集, 難読化, バックドア

2026年4月 - Shai-Hulud: 新しい波

4月下旬のMini Shai-Huludの波

2026年4月29日現在、新たなサプライチェーン攻撃の波(Mini Shai-Huludと命名)が、侵害された4つのnpmパッケージを通じて、SAP開発者エコシステムを積極的に標的としています。影響を受けるバージョンは以下のとおりです:

  • @cap-js/sqlite@2.2.2
  • @cap-js/postgres@2.2.2
  • @cap-js/db-service@2.10.1
  • mbt@1.2.48

これらのパッケージは、合わせると毎週約57万件のダウンロードがあり、そのうち@cap-js/sqliteが約25万件、@cap-js/db-serviceが約26万件となっています。

4つのパッケージはすべて、SAPのクラウド アプリケーション プログラミング(CAP)モデルとマルチターゲット アプリケーション(MTA)ビルド ツールチェーンの一部です。このため、この攻撃のターゲットは、クラウド認証情報、GitHubトークン、デプロイメント シークレットにアクセスできる企業の開発者やCI/CDパイプラインとなります。

このキャンペーンは、2026年4月に行われた@bitwarden/cli@2026.4.0の侵害を構造的に引き継ぐものです。同じツールチェーン、同じ難読化、同じ伝播ロジックを使用しており、今やSAPのエコシステムに反旗を翻しています。

攻撃メカニズム

侵害された各パッケージは2つの新しいファイルを受け取りました:

  • setup.mjs
  • execution.js

これらのファイルは、プリインストールのライフサイクル フック("preinstall": "node setup.mjs")を追加した変更されたpackage.jsonと一緒に届きました。

つまり、インストールが完了する前に、悪意のあるコードがnpmのインストール プロセス中に自動的に実行されるのです。setup.mjsブートストラッパーは、ホストOSとアーキテクチャを検出し、次のアクティビティを実行します:

  • 公式github[.]com/oven-sh/bunリリースからBun JavaScriptランタイム(v1.3.13)をダウンロードする
  • ランタイムを一時ディレクトリに展開する
  • ランタイムをすぐに使用してexecution.jsを実行する

ペイロード機能

11.7MBの単一ファイルで難読化された認証情報窃取ツールのexecution.jsは伝播フレームワークです。以下のようなアクティビティを行います:

  • ctf-scramble-v2とラベル付けされたカスタム文字列スクランブル レイヤーを使用して、機密文字列を静的解析から隠す
  • ロシア語ロケールのキルスイッチを含む(システムロケールがruに設定されている場合、確認なしで終了する)
  • 非CIマシンでデーモン化し、バックグラウンドで実行する

次のような情報が得られます:

  • GitHubトークン(gh authトークンの出力を含む)
  • .npmrcからのnpmトークン
  • 完全な環境変数ブロック
  • GitHubアクションのシークレット
  • AWS STSアイデンティティ
  • シークレット マネージャーとSSMパラメータ
  • Azure Key Vaultのシークレット
  • GCPシークレット マネージャーの値
  • Kubernetesサービス アカウント トークン
  • ClaudeとMCPの設定ファイル
  • Electrumウォレット
  • VPN設定

特にアグレッシブなCIパスでは、GitHub Actions Runner.Workerプロセスの/procメモリを読み込み、マスクされたシークレットの値を抽出するPythonヘルパーが組み込まれています。収集されたデータはすべて以下の過程を経ます:

  • 圧縮
  • AES-256-GCMで暗号化され、埋め込みRSA公開鍵にキーをラッピング
  • Duneをテーマにしたランダムな名前と「A Mini Shai-Hulud has Appeared(ミニ・シャイフルードが現れた)」という説明文のついた、新しく作成された公開GitHubリポジトリへの流出

伝播とGitHubデッドドロップ

このキャンペーンは、GitHubの公開コミット検索APIを秘密のコマンド&コントロール(C2)チャネルとして利用しています。このマルウェアは以下のアクティビティを行います:

  • キーワード「OhNoWhatsGoingOnWithGitHub」を含むコミットを検索する
  • 盗まれたGitHubトークンを復元するために、トークンのデッドドロップとして一致するコミットメッセージを解読する
  • メッセージを拡散のために使う

使用可能なトークンが取得されると、以下のようなペイロードが生成されます:

  • 自身をexecution[.]jsにコピーする
  • setup.mjsを書き込む
  • package.jsonに"preinstall": "node setup.mjs"を設定する
  • パッチのバージョンを上げる
  • 公開用にtarballをリパックする

このマルウェアはまた、以下のファイルを被害者のリポジトリに直接プッシュします:

  • .vscode/setup.mjs
  • .claude/execution.js
  • .claude/settings.json

このマルウェアは、claude <claude@users.noreply.github.com>として作成されたコミットを使って、chore: update dependenciesというメッセージとともに上記のファイルをプッシュします。

Bitwardenキャンペーンとの関連

bitwarden/cli@2026.4.0への3つのフォレンジック リンクは、作者の共有や直接再利用されたツールチェーンを示すのに十分な正確さを持っています。

1. setup.mjsプリインストール ブートストラッパー。Bitwardenのキャンペーンでは、setup.mjsがワーム(bw1.js)の自己複製アーティファクトとして、被害者が公開できるすべてのnpmパッケージに注入されました。SAPパッケージはブートストラッパーとして同じファイル名を使い、同じBunバージョン(1.3.13)、同じAlpine/musl検出ロジック、同じリダイレクト フォロー ダウンロード アプローチなど、この2つには明確な共通の系統があります。

2.decodeScramble / ctf-scramble-v2難読化メソッド。Bitwardenのペイロードは、カスタムシードのASCIIシャッフル暗号を使用して、すべての機密文字列を暗号化します。これは、0x3039(12345)をシードとする線形合同PRNGによって駆動される128文字のASCIIテーブルに対するフィッシャーイェーツシャッフルです。SAPのexecution.jsは、ctf-scramble-v2と明示的にラベル付けされたレイヤーを使用しており、これは同じ決定論的置換スキームです。これはライブラリではなく、オーダーメイドの実装です。両方のペイロードで再利用されます。

3. GitHubのコミットのデッドドロップのパターン。Bitwardenマルウェアは、GitHubの公開コミット検索APIを秘密のC2チャネルとして利用しました。LongLiveTheResistanceAgainstMachines:<base64>に一致するコミット メッセージに窃取されたトークンを埋め込み、攻撃者が管理するインフラストラクチャなしで新しい流出経路をブートストラップするために使用しました。

この波では、まったく同じパターンを新しいキーワード(OhNoWhatsGoingOnWithGitHub)で適用し、一致するコミット メッセージをトークンのデッドドロップとしてデコードします。この仕組みは実装も同じです:

  • GitHub APIでキーワードを含むコミットを検索する
  • コミット メッセージ本文をパースする
  • 埋め込まれたトークンをデコードする
  • リポジトリへのアクセスを検証する

テクニックを維持したままキーワードを入れ替えるのは、再利用されるコードベースを更新する同じオペレーターの特徴です。

Shai-Huludキャンペーンのコンテキスト

Checkmarxの公式セキュリティ アップデートによると、このnpmパッケージは、複数のCheckmarx配布チャネルを同時に侵害する、より広範なサプライチェーン キャンペーンの1つのコンポーネントです:

  • Docker Hub: ポイズニングされたcheckmarx/kicsイメージ (v2.1.20、v2.1.21、最新版、alpine、debian)
  • GitHub Actions: 悪意のあるcheckmarx/ast-github-action v2.3.35
  • VSコードのエクステンション: checkmarx/ast-results (v2.63, v2.66)およびcheckmarx/cx-dev-assist (v1.17, v1.19)をバックドア化
  • npm: 本レポートで分析する@bitwarden/cliパッケージ

Checkmarxの開示情報によると、すべてのアーティファクトは同じC2インフラストラクチャ(audit.checkmarx[.]cx)、同じ難読化技術、同じ認証情報の獲得および伝播ロジックを共有しています。このVS Codeエクステンションの亜種は、Checkmarx自身のGitHubリポジトリにある日付を遡った孤立コミットからペイロード(mcpAddon.js)を配信し、ダウンロードURLを信頼性のあるものに見せていました。

TeamPCP (@pcpcats)は、この侵害を自分の手柄だと公言しました。ソケットの分析によると、このグループは、2026年3月にもTrivyやLiteLLMとともにCheckmarxのインフラストラクチャを標的にしており、セキュリティ ツール ベンダーに対する継続的なキャンペーンを示唆していました。

攻撃の概要

表1に攻撃の属性を示します。

属性 詳細
パッケージ @bitwarden/cli@2026.4.0
トリガー プリインストール ライフサイクル スクリプト
ランタイム Bun v1.3.13 (インストール時にダウンロード)
C2サーバー audit.checkmarx[.]cx:443 (94.154.172[.]43)
C2パス /v1/telemetry
フォールバックC2 動的、GitHub Search APIデッドドロップ経由でフェッチ
データ窃取 HTTPS POST (暗号化) + GitHub公開リポジトリ
アトリビューション TeamPCP (@pcpcats)

表1.攻撃の属性。

Bitwardenのセキュリティ チームは、以下の情報を提供しました。表1に記載のこの悪意のあるパッケージは、2026年4月22日午後5時57分から午後7時30分(米国東部標準時間)の間に、@bitwarden/cli@2026.4.0 のnpm配信パスを通じて、より広範なサプライチェーン インシデントに関連して短期間配布されました。

彼らの調査では、エンドユーザーのボールトデータがアクセスされたり危険にさらされたりした証拠も、本番データや本番システムが侵害された証拠も見つかりませんでした。問題が発見されると、以下のアクションを行いました:

  • 侵害されたアクセスを取り消し
  • 悪意のあるnpmリリースを廃止
  • 直ちに改善手順を開始

この問題は、その限られた期間中にCLIのnpm配布メカニズムに影響を及ぼしたものであり、正規のBitwarden CLIコードベースや保存されているボールトデータの完全性には影響しませんでした。

この期間中にnpmからパッケージをダウンロードしなかった人は影響を受けませんでした。Bitwardenは、社内環境、リリースパス、関連システムのレビューを完了しました。現時点では、影響を受けた追加の製品や環境は見つかっていません。

このインシデントに関連して、Bitwarden CLIバージョン2026.4.0のCVEが発行されています。

ステージ1: ブートストラップ - bw_setup.js

package.jsonには、図1に示すように、悪意のあるスクリプトの実行パスが2つ用意されています。

JSON形式のコード スニペットのスクリーンショット。これには、"preinstall"キーでノードを実行する"scripts"セクションと、"bw"キーでノードを実行する"bin"セクションが含まれます。
図1.package.jsonファイル内の悪意のあるスクリプトの実行パス。

プリインストール フックは、npmインストール中に自動的に実行されます。binフィールドは、bw_setup.jsをbwコマンドとして登録し、ユーザーのPATHにシンボリックリンクします。

正規のBitwarden CLIもバイナリ名としてbwを使用しているため、これは二次的なトリガーとして機能します。プリインストールが(--ignore-scriptsなどで)ブロックされていても、マルウェアは次にユーザーやスクリプトがbwを起動したときに実行されます。bw_setup.jsの先頭にあるシバン行#!/usr/bin/env nodeノードは、直接呼び出されたときにNode.jsスクリプトとして実行されることを保証します。

ブートストラップ スクリプトは3つのアクションを実行します:

  1. プラットフォームの検出: OSとアーキテクチャ(Linux、macOS、Windows、x64またはarm64)を識別し、Linuxでのmuslglibcの検出を含みます
  2. Bunランタイムのダウンロード: 公式github[.]com/oven-sh/bunリリースからBun JavaScriptランタイム(v1.3.13)をダウンロードします。これは、メインのペイロードがNode.jsでは利用できないBun固有のAPI(シェル実行、ファイルI/O、gzip)を使用するために必要です。
  3. ペイロードの実行: ダウンロードしたばかりのBunバイナリを使用してbw1.jsを実行します

カスタムZIP抽出実装は、依存関係を回避するために含まれており、ブートストラップを完全に自己完結型にしています。

ステージ2: ペイロード - bw1.js

ペイロードは約10MBの単一行JavaScriptファイルで、フォーマットされると約285,000行になります。正規のソフトウェア開発者キット(SDK)(AWS SDK、Google Cloudクライアント ライブラリ、Azure Identity、Octokit、jsonwebtoken、tarなど)を悪意のあるオーケストレーション コードと一緒にバンドルしています。

難読化の手法

コードは何重にも難読化されています:

  • ストリング テーブルのローテーション: 関数_0x214eは、大きな回転配列(_0x1ee1)から文字列への16進インデックスを解決し、単純な静的文字列解析を打ち破ります
  • シードASCIIシャッフル暗号: 機密文字列(ドメイン、ファイル パス、シェル コマンド)は、フィッシャーイェーツシャッフルされたASCIIテーブルへの数値インデックスの配列としてエンコードされます。シャッフルには、以下の図2に示すように、0x3039 (12345)をシードとする線形合同PRNGを使用します。
コンストラクタと次のメソッドを持つPRNGという名前のクラスを示すスニペットのスクリーンショット。コンストラクタはシード値を設定し、次のメソッドは特定の計算式を使ってシード値を再計算し、大きな数で割った後にそれを返します。
図2.シードASCIIシャッフル暗号。

128文字のASCIIセットは決定論的にシャッフルされ、16進数値0x42のインデックスがASCII文字a0x6euにマッピングされる置換テーブルを生成します。例えば、C2ドメインは、[0x42, 0x6e, 0x36, 0x4b, 0x2b, 0x5c, 0xd, 0x57, 0x0, 0xd, 0x7, 0x26, 0x42, 0x3, 0x2a, 0x5c, 0xd, 0x2a]として格納され、ドメインaudit.checkmarx[.]cxのASCII文字列にデコードされます。

  • GzipおよびBase64埋め込みペイロード: RSA公開鍵、GitHub ActionsワークフローYAML、ワームのsetup.mjsローダー、マニフェスト文字列など、いくつかのblobがgzip圧縮されたBase64文字列として格納されています
  • 名前就職される識別子: すべての変数名と関数名は、_0x3865d8のような16進数パターンに置き換えられます

認証情報の獲得

ペイロードは複数のプロバイダ クラスをデプロイし、それぞれが異なる認証情報ソースをターゲットとします。すべてのプロバイダは、図3に示すように、npmとGitHubのトークンを抽出するために正規表現パターンで結果をスキャンします。

トークンを検出するための2つの正規表現を示すコード スニペットのスクリーンショット: 1つは「ghtoken」、もう1つは「npmtoken」で、どちらも特定のパターンに従っています。
図3.npmとGitHubトークンを抽出するための正規表現パターン。
ファイル システム プロバイダ(Cn)

これは、開発者のワークステーションから機密ファイルを読み取るもので、OSごとのパスリストは、以下の表2に示すようにスクランブラを介してデコードされます。

プラットフォーム 対象ファイル
Linux ~/.ssh/id_*, ~/.ssh/keys, .git/config, ~/.npmrc, .npmrc, .env, ~/.claude/mcp.json, ~/.claude.json, ~/.kiro/settings/mcp.json
MacOS ~/.aws/credentials, .git/config, ~/.npmrc, .npmrc, .env, ~/.claude.json, .claude.json, ~/.kiro/settings/mcp.json, .kiro/settings/mcp.json
Windows 認証情報ストアのパス、config.ini

表2.マルウェアからのOSパスリスト。

約5MB以上のファイルはスキップされます。その他はすべて完全に読み取られ、窃取ペイロードに含まれます。

シェルプロバイダ(un)

execSyncを使ってgh認証トークンを実行し、GitHub CLIのアクティブ トークンを取得し、process.env環境ブロックをすべて取得します。どちらもトークン正規表現のスキャンと流出用に返されます。以下のクラウド プロバイダとは異なり、シェル プロバイダはSDKを使用せず、単一のシェル コマンドと環境変数のみに依存しています。

GitHub Actionsプロバイダ(Co)

process.env.GITHUB_ACTIONS === "true"を介してCI/CD環境を検出し、Actionsランナー コンテキストから{"value":"...", "isSecret":true}パターンをパースすることで、設定されたすべてのシークレットを抽出します。

AWS SSMプロバイダ(ku)

バンドルされているAWS SDK (SSMClient、DescribeParameters、GetParameter)を使用して、AWS Systems Manager Parameter Storeからパラメータを列挙して読み込みます。

Azure Key Vaultプロバイダ(Rn)

Azure IdentityおよびKey Vault SDKを使用してgetSecretsFromVaultを呼び出し、アクセス可能なすべてのボールトからシークレットをリストアップして読み取ります。

Google Cloud Secret Managerプロバイダ (uo)

Google Cloud Secret Managerクライアントを使用してlistSecretsaccessSecretVersionを行い、プロジェクト全体でアクセス可能なすべてのシークレットを読み取ります。

データ窃取

獲得された認証情報はすべて、2層の流出システムを通じて処理されます。

プライマリ: HTTPSからC2 (Cyクラス)へ
  1. 結果はJSONにシリアライズされ、gzipで圧縮されます
  2. ランダムな32バイトのAES-256-GCM対称鍵が生成されます
  3. データはAES-256-GCMで暗号化されます
  4. 共通鍵はハードコードされた4096ビットの公開鍵(Fr)でRSA暗号化されます
  5. 暗号化されたエンベロープは、POST hxxps[:]//audit.checkmarx[.]cx:443/v1/telemetryによって送信されます
セカンダリ: GitHub公開リポジトリ(kyクラス)

盗まれたGitHubのトークンを使って、マルウェアは以下のアクティビティを行います:

  1. 被害者のアカウントの下に、「Checkmarx Configuration Storage」という説明と、Duneをテーマにした名前(例:gesserit-melange-813)で、新しいパブリック リポジトリを作成します
  2. 暗号化された結果ファイルをresults/ディレクトリにコミットします
  3. LongLiveTheResistanceAgainstMachines:<base64_token>というフォーマットでコミット メッセージに盗まれたトークンを埋め込みます

この二重の流出により、C2ドメインがブロックされても、データは確実に攻撃者に到達します。

GitHub Actionsワークフロー インジェクション(u_ クラス)

マルウェアがリポジトリとワークフローのスコープを持つGitHubトークンを取得すると、クラスu_はスコープを検証し、その後:

  • 被害者がプッシュできるリポジトリを列挙し、最近アクティブになったリポジトリを優先します
  • 各リポジトリにGitHub Actionsシークレットが設定されているかどうかをチェックします(設定されていないリポジトリはスキップします)
  • 新しいブランチを作成し、.github/workflows/format-check.ymlをコミットします。以下の図4に示すように、すべてのシークレットをダンプする悪意のあるワークフローです
GitHub ActionsワークフローのYAML設定スクリプトのスクリーンショット。ワークフロー名は"Formatter"で、"actions/checkout"および"upload-artifact"アクションを使用します。ワークフローは、結果を特定のファイルに出力するように設定されています。
図4.format-check.ymlファイルの内容。
  • すべてのシリアライズされたシークレットを含む結果のアーティファクトをダウンロードします
  • 痕跡を隠ぺいするためにブランチとワークフローの実行を削除します

npmワームの伝播

これが自己複製コンポーネントです。マルウェアは、npmトークン(npm_...)を見つけると、以下のアクティビティを行います。

トークンの検証

これは、npmトークンAPIを認証で呼び出します: ベアラー<token>は、トークンがパッケージ スコープで公開(書き込み)パーミッションを持っていることと、2要素認証(2FA)をバイパスすることを検証します。

パッケージ列挙

検証されたトークンは、以下のアクティビティに使用されます:

  • npmユーザー名を取得する
  • トークンの許可されたリソース(組織、スコープ、特定のパッケージ)を反復処理する
  • 書き込み可能なパッケージを/-/org/<user>/packageに問い合わせる
  • 公開パッケージ用に/-/v1/search?text=maintainer:<user>にフォールバックする
tarballのダウンロードとバックドア

各ターゲット パッケージについて:

  • npmレジストリから最新のtarballをダウンロードする
  • 一時ディレクトリに展開する
  • Bunのバイナリをパッケージにコピーする
  • package.jsonを書き換える:
    • すべてのスクリプトを消去する
    • "preinstall": "node setup.mjs"(スクランブラからデコード)を設定する
    • パッチのバージョンを上げる(例: 1.2.3 → 1.2.4)
  • ワームの完全なペイロード(K$、gzip+Base64でエンコードされたマルウェアのコピー)を含むsetup.mjsを書き込む
  • tarballを再パックする
パブリッシング

盗まれたトークンの認証行(//registry.npmjs[.]org/:_authToken=<token>)で.npmrcを書き、bun publish<tarball>を実行します。

新しく感染したパッケージはすべて、それをインストールする開発者に同じプリインストール チェーンをトリガーし、指数関数的な伝播ベクトルを作り出します。

C2レジリエンス: GitHubのデッドドロップ

このマルウェアは、GitHubの公開検索APIを秘密のコマンド チャネルとして使用することで、C2レジリエンスのためのフォールバック メカニズムを実装しています。

プライマリC2サーバー(audit.checkmarx[.]cx)が到達不能な場合、マルウェアは以下のことを行います:

  1. 公開されているSearch APIを使って、beautifulcastleというキーワードでGitHubのコミットを検索する
  2. [helloworm00/hello-world](hxxps[:]//github[.]com/helloworm00/hello-world)(本攻撃の1日前、4月21日付のコミットbc544f4)で一致するコミットを発見する
  3. コミット メッセージ本文を正規表現/beautifulcastle ([A-Za-z0-9+/=]{1,30})/([A-Za-z0-9+/=]{1,700})/でパースする
  4. 最初のキャプチャ グループをBase64からデコードし、ドメインを取得する
  5. ハードコードされた公開鍵Erに対するデジタル署名(512バイトのRSA-4096)として、2番目のキャプチャ グループを検証する。これにより、攻撃者だけがマルウェアを新しいC2サーバーに誘導できるようになる。

分析時、デッドドロップにはプレースホルダーの値(hxxps[:]//example[.]com)が含まれており、将来の使用のために事前にステージングされていたことがわかります。攻撃者は、公開されているGitHubリポジトリに新しい署名付きコミットを作成することで、いつでもC2インフラストラクチャをローテーションすることができます。

第二のフォールバック(Hr関数)は、LongLiveTheResistanceAgainstMachines:<base64>に一致するコミットを検索し、以前に盗まれたGitHubトークンを流出リポジトリから回収することで、攻撃者が管理するインフラストラクチャを使わずに、新しいGitHubベースの流出チャネルを起動します。

検知対策

  • ロシアロケールのキルスイッチ: mz0関数は、ロシア語(ru)のIntl.DateTimeFormat().resolvedOptions().localeLC_ALL、LC_MESSAGES、LANGUAGE、LANGをチェックします。一致するものがあれば、マルウェアは以下の処理を実行せずに直ちにprocess.exit(0)を呼び出します
  • デーモン化: Ml0関数は、__DAEMONIZED=1でデタッチされたプロセスを環境に再スポーンし、ペイロードがバックグラウンドで実行されている間に親プロセスがきれいに終了できるようにします
  • PIDベースのロック ファイル: $l0process.pidを一時ファイルに書き込み、process.kill(pid, 0)によって前のインスタンスがまだ生きているかどうかをチェックすることで、複数のインスタンスの同時実行を防ぎます
  • シグナル ハンドラ: SIGINT/SIGTERMをno-opコールバック(() => {})でキャッチし、中断を防ぎます
  • 一時ディレクトリのクリーンアップ: tarball操作後、フォレンジック アーティファクトが削除されます
  • すべての機密文字列: スクランブラまたはgzip+Base64でエンコードされます
  • サイレントエラー処理: 失敗はキャッチされ、抑制されます
  • 無害なネーミング: C2パスv1/テレメトリは正規の分析エンドポイントを模倣します

中間ガイダンス

  1. 上記のC2ドメインとIPをネットワーク境界でブロックします。
  2. npmトークン、GitHub PAT、AWS/Azure/Google Cloudキー、SSHキー、CI/CDシークレットなど、公開された可能性のあるすべての認証情報をローテーションします。
  3. メンテナンスしているnpmパッケージに不正なバージョンアップや新しいプリインストール フックがないか監査します。
  4. 不正なリポジトリ作成、予期せぬワークフロー ファイル、アーティファクトのダウンロードがないかGitHubを確認します。
  5. 組織全体のGitHub Actionsログからformat-resultsアーティファクトを検索します。
  6. 予期せぬBunプロセスの実行や、IoC(侵害のインジケーター)インフラストラクチャへのアウトバウンド接続をハントします。
  7. ロックファイルと整合性ハッシュを使用して、依存関係を既知の良いバージョンに固定します。

結論

Unit 42は、2025年9月のShai Huludインシデント以来の変化を目の当たりにし、それが一時的な急増ではなく、ソフトウェアのサプライチェーン リスクの新たな基準値であることを証明しました。コードが思考のスピードで共有されるエコシステムでは、たったひとつの侵害された依存関係がグローバルな連鎖を引き起こす可能性があります。

結局のところ、npmの侵害には共通点があり、組織は特定のベストプラクティスを念頭に置くことで、この不安定な状況を乗り切ることができます。npmパッケージに関連する調査結果を監視、分析、更新し続ける中で、静的な防御にとどまらず、継続的な検証の文化を受け入れることをお勧めします。サプライチェーンは新たな主要ターゲットとなる可能性がありますが、集合的インテリジェンスと絶え間ない可視性により、主要な脆弱性となる必要はありません。

侵害されたnpmパッケージの緩和策

クールダウン期間を適用する

過去24時間から72時間以内に公開されたパッケージ バージョンをブロックするポリシーを(プライベート レジストリやArtifactoryのようなプロキシを介して)実装します。ほとんどの悪意のあるパッケージは、このウィンドウ内で特定され、パブリック レジストリから削除されます。

ライフサイクル スクリプトを無効にする

多くの侵害は、プリインストールまたはポストインストール フックに依存し、シークレットを流出させます。.npmrcで以下を使用します: ignore-scripts=true。

バージョンのピン留めとnpm ci

package-lock.jsonを使用し、CI/CDパイプラインがnpm installの代わりにnpm ciを使用するようにします。これにより、ビルド中の依存関係の「隠された」更新を防ぐことができます。

プライベート レジストリのプロキシ

開発者マシンやCIランナーがregistry.npmjs[]orgと直接会話することは決して許可しないでください。すべてのトラフィックをプライベート レジストリに通します。

名前空間シャドウイング(依存関係の混乱の防止)

攻撃者は多くの場合、内部ライブラリと同じ名前のパッケージをパブリック レジストリに公開します。常にスコープ付きパッケージ(@myorg/internal-libなど)を使用し、そのスコープを内部的に解決するためだけにプライベート レジストリを設定します。

出所の検証

OpenID Connect認証を確認します。多くの主要パッケージは、コードが特定のGitHub/GitLabランナーでビルドされたことを証明する「出所」を提供しています。ビルド中にこれらをチェックするには、slsa-verifierのようなツールを使います。

CI/CDにおけるエグレス フィルタリング

ほとんどのnpmベースのマルウェアは、~/.npmrcトークンまたは~/.sshキーをC2サーバーに送信しようとします。CIランナーに厳格なエグレス ネットワーク ポリシーを適用します。プライベート レジストリと既知のデプロイメント ターゲットへの接続のみを許可します。

ソフトウェア部品表(SBOM)

生産リリースごとにSBOMを自動生成します。これにより、お客様のセキュリティ チームは、新しいゼロデイが発表されたときに、即座に影響分析を行うことができます。

侵害されたnpmパッケージに関するパロアルトネットワークス製品の保護

パロアルトネットワークスのお客様は、さまざまな製品保護、アップデートを活用して、本脅威を特定し組織を保護いただけます。

情報漏えいの可能性がある場合、または緊急の案件がある場合はUnit 42インシデント レスポンス チームにアクセスするか電話でご連絡ください:

  • 北米:フリーダイヤル: +1 (866) 486-4842 (866.4.UNIT42)
  • 英国: +44.20.3743.3660
  • ヨーロッパおよび中東: +31.20.299.3130
  • アジア: +65.6983.8730
  • 日本: +81.50.1790.0200
  • オーストラリア: +61.2.4062.7950
  • インド: 000 800 050 45107
  • 韓国: +82.080.467.8774

Advanced WildFire

Advanced WildFireの機械学習モデルと分析技術は、悪意のあるBitwardenパッケージを含むnpmの侵害に関連するインジケーターに照らして見直され、更新されています。

次世代ファイアウォール向けクラウド提供型セキュリティ サービス

Advanced URL FilteringAdvanced DNS Securityは、この活動に関連する既知のドメインとIPアドレスを悪意のあるものとして識別することが可能です。

Cortex Cloud

Cortex Cloudのアプリケーション セキュリティ モジュール(ASPM)は、クラウド リソースにインストールされたnpmパッケージのスキャンだけでなく、この記事で取り上げたGitHubを含むサードパーティのSaaSベンダーからの監査ログのモニタリングもサポートしています。Cortex Cloudは、取り込まれたアプリケーションとその使用状況に基づいて、アラート、問題、ポリシー、アセットに優先順位をつけます。これにより、セキュリティ チームは、影響を受けたクラウド リソースを特定して修復し、関連するランタイム オペレーションに積極的に対応することで、Cortex CloudのXDRエージェントとサーバーレス オペレーションを通じて、この記事で取り上げた脅威に対してオンプレミスとクラウド環境全体のセキュリティ意識を維持することができます。Cortex Cloudを使用してこの脅威から保護する方法の詳細については、ブログをご覧ください

侵害のインジケータ

2026年4月29日のアクティビティのインジケータ

影響を受けるパッケージ

  • @cap-js/sqlite@2.2.2
  • @cap-js/postgres@2.2.2
  • @cap-js/db-service@2.10.1
  • mbt@1.2.48

SHA256ハッシュ

  • setup.mjs:4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • execution.js:6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95

URLs

  • hxxps[:]//github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/ (Bunダウンロード)
  • hxxps[:]//api.github[.]com/search/commits?q=OhNoWhatsGoingOnWithGitHub (デッドドロップ)

2026年4月22日のアクティビティのインジケータ

ネットワークインジケータ

表3は、このアクティビティで得られたネットワークインジケータの一覧です。

インジケータ タイプ
audit.checkmarx[.]cx C2ドメイン
94.154.172[.]43 C2 IPアドレス
checkmarx[.]cx 攻撃者が制御するドメイン
91.195.240[.]123 攻撃者のIPアドレス

表3ネットワークインジケータ。

GitHubインジケータ

表4は、このアクティビティで得られたGitHubの指標の一覧です。

インジケータ タイプ
helloworm00/hello-world デッドドロップ リポジトリ
bc544f455d7c06c8a1f3446160a6d9a4a8236b11 デッドドロップ コミットのSHA1ハッシュ
helloworm00@proton[.]me 攻撃者のメールアドレス
LongLiveTheResistanceAgainstMachines:*に一致するコミット メッセージ データ窃取ステージング
"Checkmarx Configuration Storage "という説明付きの<dune-word>-<dune-word>-<3digits>という名前のパブリック リポジトリ データ窃取リポジトリ

表4.GitHubのインジケータ。

ファイルとプロセスのインジケータ

表5は、このアクティビティで得られたファイルとプロセスのインジケータです。

インジケータ タイプ SHA256ハッシュ
bw_setup.js ブートストラップ スクリプト f35475829991b303c5efc2ee0f343dd38f8614e8b5e69db683923135f85cf60d
bw1.js 難読化されたペイロード 18f784b3bc9a0bcdcb1a8d7f51bc5f54323fc40cbd874119354ab609bef6e4cb
package.json 悪意のあるマニフェスト 167ce57ef59a32a6a0ef4137785828077879092d7f83ddbc1755d6e69116e0ad
感染したパッケージのsetup.mjs ワームのペイロード
予期せぬbunプロセスの実行 ランタイム インジケータ
一時的ブランチの.github/workflows/format-check.yml ワークフロー インジェクション
結果のフォーマット ワークフロー アーティファクト シークレットの窃取

表5. ファイルとプロセスのインジケータ。

npmインジケータ

表6は、このアクティビティで得られたnpm指標の一覧です。

インジケータ タイプ
@bitwarden/cli@2026.4.0 悪意のあるパッケージ
新たなプリインストール: package.jsonの"node setup.mjs" インジェクション フック

表6 npmインジケータ。

参考文献

2026年4月27日午後2時15分更新。PTがBitwardenに関する情報を追加し、Additional ReferencesセクションにCortex Cloudの記事へのリンクを追加。

2026年5月1日午後5時55分更新。PTがMini Shai-Huludキャンペーンに関する情報を追加。

Enlarged Image