Skip to main content

休眠中のコントリビューターアカウントがMastraのnpmパッケージスコープ全体を侵害

著者
Headshot of Marian Corneci

Marian Corneci

blog feature toolkit

2026年6月16日

0 分で読めます

2026年6月17日、攻撃者が@mastra npmスコープ全体を再公開しました。143個以上のパッケージに単一の悪意ある依存関係を仕込みました。その中には、月間約400万ダウンロードされ、数百のプロジェクトが依存する@mastra/coreも含まれます。注入された依存関係easy-day-jsはdayjsに偽装したパッケージで、インストールフックがTLS検証を無効化し、生のIPアドレスから第2段階のペイロードをダウンロードして、クロスプラットフォーム対応の暗号資産窃取ツールをバックグラウンドで実行します。このnpmパッケージへの攻撃は、スコープへのアクセス権を剥奪されていなかった元コントリビューターのアカウントを悪用して実行されました。

対応が必要です。2026年6月17日以降に新規作成または更新した依存関係ツリーで、@mastraのパッケージ、またはそれに依存するパッケージをインストールした場合、認証情報とウォレットの漏えいが発生したものとして扱い、以下の内容を確認してください。

更新:Snykは、新たに侵害されたパッケージ@mastra/node-speakerのバージョン0.1.1を追加しました。

要約

  • インシデント:@mastra npmスコープの乗っ取り。悪意ある依存関係を注入して大量再公開

  • 悪意ある依存関係:easy-day-js@1.11.22(dayjsを装い、ドロッパーとして動作)

  • Snykアドバイザリ:SNYK-JS-EASYDAYJS-17353313、悪意あるコードの埋め込み。影響を受けるのはeasy-day-js 1.11.21および1.11.22

  • 影響を受けるパッケージ:2026年6月17日に再公開された@mastraスコープのほぼ全体。Mastraによる修正では、公開可能な142パッケージが対象

  • 注目すべきバージョン:@mastra/core@1.42.1、mastra@1.13.1、create-mastra@1.13.1

  • CVE / CVSS:割り当てなし。進行中のサプライチェーンインシデントであり、Mastraのソースコード自体は改変されていません

  • ペイロード:クロスプラットフォーム対応の暗号資産ウォレット窃取ツールと、永続化機能を備えたリモートアクセス型トロイの木馬(RAT)

  • 状況:easy-day-jsはnpmから削除され、ehinderoはスコープのオーナーではなくなりました。Mastraはクリーンなバージョンへのフォワードロールを実施済みです(PR #18056)。@mastra/core latestはクリーンな1.42.0に戻っています。すでに取得した侵害バージョンは、ホスト侵害として扱ってください。

攻撃の手口

侵入の足掛かりとなったのは、古いメンテナー認証情報です。@mastraスコープは、Mastraの元コントリビューター本人のnpmアカウントehinderoから公開されました。npmレジストリの公開履歴には、このアカウントから2024年後半から2025年前半にかけて@mastra/coreの正規アルファ版が公開された記録があります。その後アカウントは使われなくなりましたが、スコープへのアクセス権は剥奪されていませんでした。

このアカウントには、内部の犯行ではなく乗っ取りを示す兆候があります。たとえば、メールアドレスがコントリビューターの元のアドレスからehindero2016@tutamail[.]comに変更されていました。ここで注目すべきなのは、npmでは非アクティブでもスコープの公開権限が失効しない点です。古いメンテナー認証情報ひとつで、スコープ内のすべてのパッケージに公開できてしまいました。根本原因はゼロデイではなく、プロジェクトの管理体制です。

攻撃を運んだもの:すべてのpackage.jsonに加えられた1行

攻撃者はMastraのソースコードには手を加えていません。公開時に配布用tarballへ悪意あるコードを注入しました。Mastra自身の修正PRでは、すべてのpackage.jsonとロックファイルでeasy-day-jsが使われていないことを確認しています(PR #18056)。npmに公開された悪意あるリリースでは、package.jsonに次の1行が追加されていました。

"easy-day-js": "^1.11.21"

この依存関係はMastraのソースコード内で一度もインポートされていません。インストール時にトロイの木馬を引き込むことだけが目的です。仕掛けはキャレット範囲です。攻撃者はまず6月16日に、バイト単位でdayjsを模倣したクリーンなeasy-day-js@1.11.21を公開しました。バンドルされたdayjs.min.jsからパッケージの説明文まで、そっくりに偽装されていました。翌日、マルウェアを含むeasy-day-js@1.11.22を公開し、latestタグを付けました。1.11.22は^1.11.21を満たすため、通常のnpm installでは、武装済みのバージョンがそのまま解決されます。

続いて2026年6月17日、攻撃者は短時間のうちに残りのスコープも再公開し、すべてのパッケージに同じ依存関係を注入しました。Mastra自身の修正内容では、被害範囲が正確に示されています。緊急の変更セットにより、@mastra/*スコープの公開可能な142パッケージに加え、mastra、create-mastra、mastracodeがクリーンなバージョンへフォワードロールされました(PR #18056)。公開報道では、集計時点によって80〜144個と幅がありましたが、基準にすべきなのはベンダー自身が示した数値です。いずれにしても、スコープ全体に近い範囲が被害を受けました。

一部のパッケージでは、攻撃者は正規のlatestよりも上位のバージョンまで公開しました(例:@mastra/schema-compat@1.2.12、@mastra/react@1.0.1、@mastra/voice-playai@0.12.2)。そのためMastraは、これらを置き換える際、通常のパッチ更新ではなく明示的にさらに高いバージョンを指定する必要がありました(PR #18060)。

マルウェアのドロッパー:TLSを無効化し、取得・分離実行・削除

easy-day-js@1.11.22には、postinstallフックとして実行されるsetup.cjsが含まれています。インストール時に次の処理を行います。

  1. NODE_TLS_REJECT_UNAUTHORIZED='0'を設定してTLS証明書の検証を無効化し、生のIPアドレス上の自己署名証明書に対するHTTPS取得を可能にします。

  2. インストールを記録するマーカーファイル(~/.pkg_history, ~/.pkg_logs)を書き込みます。

  3. 第2段階のペイロードをhttps://23.254.164[.]92:8000/update/49890878(Hostwindsでホスト)からダウンロードします。

  4. 一時ディレクトリに書き込み、コンソール出力のない、分離された非表示のバックグラウンドプロセスとして起動します。

  5. フォレンジック調査の痕跡を減らすため、自身を削除します。

ペイロード:複数プラットフォーム対応の暗号資産窃取ツールとRAT

第2段階のペイロード(SHA256 221c45a790dec2a296af57969e1165a16f8f49733aeab64c0bbd768d9943badf)は難読化された暗号資産ウォレット窃取ツールです。これは、Snykが以前のnpm侵害で追跡したものと同じ種類のペイロードです。Chrome、Brave、Edgeのプロファイルを調べ、MetaMask、Phantom、Solflare、Coinbase Wallet、OKX、Keplrなど、暗号資産ウォレットのブラウザー拡張機能をハードコードされたリストで探します。ウォレットデータに加え、ユーザー名、ホスト名、OSとアーキテクチャ、Nodeのバージョン、インストール済みアプリケーション、ブラウザー履歴、実行中のプロセス一覧を収集し、すべてをBase64でエンコードしてJSONビーコンにまとめます。

また、Nodeのツールに偽装して永続化し、自己署名のwolfSSLテスト証明書(CN=www.wolfssl.com、2018年1月に期限切れ)を使用して、およそ10分ごとに別のRATのC2(23.254.164[.]123/49890878)へビーコンを送信します。

  • macOS:~/Library/LaunchAgents/com.nvm.protocal.plistにLaunchAgentを作成

  • Linux:systemdユーザーサービス~/.config/systemd/user/nvmconf.service

  • Windows:C:\ProgramData\NodePackagesにPowerShell実行ファイルを配置

クリーンな依存関係から武装済みの依存関係への切り替え、setupのpostinstallドロッパー、TLSを回避した生IPへのアクセス、そして暗号資産窃取ペイロードは、Snykが2026年初めに分析したAxios npm侵害とよく似ています。インストール時に実行され、自身を削除するドロッパーまで共通しています。Microsoft Threat Intelligenceは、先のキャンペーンをSapphire Sleet(BlueNoroff)として追跡する攻撃者に帰属させました。今回のインシデントについては特定の攻撃者への帰属は確認されておらず、これ以上の推測はしません。防御側が注目すべきパターンではありますが、事実として断定するものではありません。

影響分析

@mastra/coreだけで月間約400万ダウンロード(npmレジストリ)され、数百のプロジェクトが依存しています。mastraはさらに約150万ダウンロードを追加します(npmレジストリ)。スコープ全体で142個のパッケージが再公開されたため、合計月間ダウンロード数は数千万に達し、潜在的な被害範囲は広大です。

ただし、実際に影響を受ける範囲は、この大きな数字が示すものより狭く、正確に把握することが重要です。リスクがあるのは、露出期間中にビルド環境または開発者のマシンで悪意あるバージョンが解決された場合に限られます。npmプロジェクトの依存関係において、ロックファイルが安全性を左右し、再現可能なビルドを実現する鍵となります。

  • コミット済みロックファイルでインシデント前のバージョンを固定:npm ciでは悪意あるリリースは取得されません。問題ない可能性が高いですが、確認してください。

  • ロックファイルがない、範囲指定が緩い、または6月17日以降に新規インストール/ロックファイルを再生成:キャレット範囲により、武装済みのeasy-day-js@1.11.22が解決され、postinstallフックが実行された可能性があります。

ペイロードはインストール時に実行されるため、本番サーバーだけでなく、CIランナー、一時的なビルドエージェント、開発者のノートPCも対象です。これらのホストから認証情報やウォレットが漏えいした可能性があります。

検出:影響を受けていないか確認する

1. easy-day-jsが依存関係ツリーに一度でも含まれていたか確認してください。正規の依存関係として含まれることはありません。

npm ls easy-day-js

grep -r "easy-day-js" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null

2. 解決済みの @mastra バージョンを監査してください。侵害されたリリースは2026年6月17日に公開されており、SLSAの来歴情報がありません。ロックファイルに実際に固定されている内容を確認してください。

npm ls @mastra/core mastra create-mastra

3. Snykでスキャンしてください。Snykは悪意あるパッケージをSNYK-JS-EASYDAYJS-17353313(悪意あるコードの埋め込み)として検出します。

snyk test

snyk monitor

4. 露出期間中にインストールを実行したマシンで、ホスト上の痕跡を調査してください。

#Dropper markers

ls -la ~/.pkg_history ~/.pkg_logs 2>/dev/null

#Persistence

ls -la ~/Library/LaunchAgents/com.nvm.protocal.plist 2>/dev/null      # macOS

ls -la ~/.config/systemd/user/nvmconf.service 2>/dev/null             # Linux

dir "C:\ProgramData\NodePackages"                                      # Windows

5. 送信ログを確認し、23.254.164[.]92:8000、23.254.164[.]123、または23.254.164.0/24内のアドレスへの接続がないか調べてください。

Snykを使って、このようなnpmスコープ全体に及ぶ侵害を実際に調査・修復する手順については、次のデモでワークフローを一通り紹介しています。

Shai-Hulud NPM Attack: Remediation with Snyk

Shai-Hulud NPM Attack: Remediation with Snyk(npmサプライチェーン攻撃で大量再公開されたパッケージを修復する実践的なワークフロー)。

修復

もし easy-day-js が存在せず、ロックファイルでインシデント前の @mastra バージョンが固定されている場合:上記の検出手順で確認し、ロックファイルの固定を維持すれば問題ありません。

悪意あるバージョンを解決していた場合、影響を受けたホストは侵害済みとして扱ってください。

  1. クリーンなバージョンにアップグレードし、単に古いバージョンへ戻すだけでは済ませないでください。Mastraは、公開可能な142個すべてのパッケージをクリーンなリリースへフォワードロールし、侵害バージョンより後のバージョンへlatestディストタグを移動させました(PR #18056、PR #18049)。アンパブリッシュには頼っていません。現行のクリーンなリリース(例:@mastra/core@1.42.0以降)に更新し、ロックファイルをクリーンな状態で再生成して、easy-day-jsの痕跡をすべて削除してください。攻撃者は一部のバージョンを正規のlatestより上に公開しているため、更新先が既知の安全なMastraリリースであり、攻撃者のバージョンが残ったものではないことを必ず確認してください。

  2. ホストからアクセスできたすべての認証情報をローテーションしてください。クラウドキー、CIシークレットとトークン、LLMなどのAPIキー、npmトークン、SSHキーが対象です。Mastraはエージェントフレームワークであるため、LLMプロバイダーのキーが存在する可能性は特に高いでしょう。

  3. 暗号資産ウォレットを移行してください。マシン上のブラウザープロファイルに対象のウォレット拡張機能があった場合、シードとキーが漏えいしたものとみなし、クリーンなデバイスで新しいウォレットに資金を移してください。

  4. 永続化の痕跡を削除してください。LaunchAgent、systemdユニット、またはC:\ProgramData\NodePackages内の配置物を削除し、分離実行されたプロセスを終了して、ドロッパーのマーカーを消去してください。

  5. 可能であればシステムを再構築してください。永続化が確立されたRATに対しては、クリーンな環境から再構築するのが最も安全です。

今後、この種の攻撃によるリスクを減らすには、次の対策が有効です。

  • インストールスクリプトをデフォルトで無効にするには npm config set ignore-scripts trueを設定し、ビルドに本当に必要な場合のみ許可してください。これによりpostinstallドロッパーを無効化できます。Snykのnpmセキュリティのベストプラクティスのひとつです。

  • ロックファイルをコミットし、CIでは npm ciを使って、ビルドの再現性を確保しましょう。latestタグが変更されても、依存関係が気付かないうちに再解決されることを防げます。

  • 来歴を必須にする。 MastraはCIからの公開時にSLSA来歴を生成していましたが、必須ではなかったため、通常のトークンだけで証明書なしに公開できる状態でした。同じ問題により、Nxパッケージの侵害でも悪意あるバージョンが公開されました。利用時に来歴を検証することで、攻撃のハードルを上げられます。

  • ファントム依存関係に注意する。 成熟して広く使われているパッケージに、突然、未使用の依存関係が1つ追加されるのは、まさに今回のような兆候です。リスクに基づく優先順位付けと環境全体の資産検出により、影響を受けたパッケージが実際にどこに導入されたか、また、どのインスタンスが外部から到達可能で認証情報を保持しているかを特定できます。スコープ全体のインストールを一つ残らず追いかけるのではなく、まず露出したホストを修復しましょう。

関連するSnykの解説

これは、2026年に相次いでいるnpmスコープおよびメンテナーアカウントの乗っ取りの最新事例です。侵害されたメンテナーアカウントを使って自動で迅速に再公開するというパターンは、Mini Shai-Huludキャンペーンと同じです。 

Mini Shai-Hulud: The Most Sophisticated NPM Supply Chain Attack of 2026

Mini Shai-Hulud:2026年最も巧妙なNPMサプライチェーン攻撃 (1つの侵害されたメンテナーアカウントを使って、一度に数百のnpmパッケージにトロイの木馬を仕込み、露出を検出・修復する方法を解説します)。

同じ攻撃ファミリーと防御パターンについて詳しくは、SnykによるAxios npmの侵害、AntVを狙ったMini Shai-Hulud攻撃とTanStackへの攻撃、node-gypの自己増殖型ワーム、tinycolorとngx-bootstrapの侵害に関する解説をご覧ください。インストールパイプラインの強化については、NPMセキュリティ:サプライチェーン攻撃を防ぐと、正規パッケージの侵害に関するSnyk Learnのレッスンをご覧ください。

タイムライン

  • 2024年後半~2025年前半:アカウントehinderoが@mastra/coreの正規のアルファ版を公開した後、休眠状態になります。スコープへのアクセス権は取り消されませんでした。

  • 2026年6月16日:dayjsになりすました、問題のないeasy-day-js@1.11.21が偽装用として公開されます。

  • 2026年6月17日、約01:01 UTC:悪意あるeasy-day-js@1.11.22が公開され、latestタグが付けられます。

  • 2026年6月17日、約01:12~02:36 UTC:@mastra/*スコープの大部分が、easy-day-js依存関係を注入された状態で再公開されます。

  • 2026年6月17日:複数のセキュリティベンダーがインシデントを公表し、easy-day-jsはnpmから削除され、悪意あるバージョンにはフラグが付けられます(SnykアドバイザリSNYK-JS-EASYDAYJS-17353313)。

  • 2026年6月17日(同日):Mastraは対応として、不正なオーナーを削除し、緊急のクリーンな公開に向けたchangesetを作成し(PR #18049)、公開可能な142個すべてのパッケージを新しいバージョンに更新して公開し(PR #18056)、攻撃者がlatestを上回るバージョンを公開していたパッケージでは、明示的により高いバージョンを固定しました(PR #18060)。

Snykでサプライチェーンを安全に

回答者の87%がサプライチェーンのセキュリティ問題の影響を受けています。Snykでサプライチェーンを安全に保ちましょう。