Mastra npm supply-chain compromise対応:Sapphire SleetでDefender管理者が確認すべきこと

結論から言うと、Mastraまたは@mastra/*系のnpmパッケージを、2026年6月中旬以降に開発端末やCI/CD環境でnpm installまたはnpm updateした可能性がある場合は、アプリで実際にimportしていたかどうかに関係なく確認対象です。今回のMastra npm supply-chain compromiseは、インストール時に動くpostinstallが悪用されたため、ソースコード上で該当パッケージを呼び出していなくても、開発端末・ビルドランナー・CI/CDシークレットが影響を受ける可能性があります。(Microsoft)

Microsoft Security Blogでは、この記事は2026年6月17日に「Research」として公開され、6月19日の更新でMicrosoftはこの活動を北朝鮮系の脅威アクターSapphire Sleetに高い確度で帰属するとしています。対象サービスとしてはMicrosoft Defenderが示されており、Microsoft Defender / Microsoft Threat Intelligenceの管理者は、検知状況の確認だけでなく、権限、監査、IOC登録、CI/CDの復旧、開発者への周知まで一連で対応する必要があります。(Microsoft)

目次

まず押さえるべき判断基準:影響は「使ったコード」ではなく「インストールした環境」で見る

今回の注意点は、通常の脆弱性対応のように「該当ライブラリをアプリが実行時に使っているか」だけでは判断できないことです。Microsoftの分析では、侵害されたMastra関連パッケージにeasy-day-jsという悪意あるtyposquatパッケージが依存関係として追加され、npm install時のpostinstallで難読化されたドロッパーが実行されました。つまり、ビルドや依存関係解決の段階でリスクが発生します。(Microsoft)

確認対象リスク判断まず行う対応
開発端末でmastraまたは@mastra/*をインストールした高Defenderで端末調査、IOC確認、必要に応じて隔離
CI/CDランナーでnpm installまたはnpm updateを実行した高ランナー再作成、CI/CDログ確認、シークレットローテーション
package-lock.jsonやnode_modulesにeasy-day-jsがある高ビルド停止、該当端末・ランナーの調査
リポジトリに依存関係はあるが、該当期間にインストールしていない中ロックファイルとCI履歴を確認
Mastra系パッケージを使っていない低組織内の横断検索だけ実施

管理者が最初にすべきことは、Defenderのアラート画面を眺めることだけではありません。開発チームに「該当期間にどの端末・どのランナーでnpm installが実行されたか」を確認し、セキュリティ側ではMicrosoft Defender XDRのAdvanced Hunting、Threat analytics、IOC登録、ネットワーク遮断、認証情報のローテーションを並行して進めます。

Mastra npm supply-chain compromiseで何が起きたのか

Microsoft Threat Intelligenceの分析によると、攻撃はnpmメンテナーアカウントehinderoの乗っ取りから始まりました。このアカウントはMastraエコシステム全体にpublish権限を持っており、攻撃者はMastraおよび@mastraスコープの140以上のパッケージに、dayjsを装った悪意あるeasy-day-jsを依存関係として注入しました。侵害されたバージョンはlatestとして公開され、通常の依存関係更新で取り込まれる可能性がありました。(Microsoft)

Microsoftが示した流れを管理者向けに整理すると、次のようになります。

段階起きたこと管理者が見るべきポイント
npmアカウント侵害Mastra関連のpublish権限を持つアカウントが悪用されたnpm監査ログ、公開元、CI/CD経由でない手動publishの有無
悪意ある依存関係の追加easy-day-js@^1.11.21が追加されたpackage-lock.json、node_modules、SBOM
weaponized版の取得SemVerにより[email protected]が解決される可能性lockfile、npmキャッシュ、CIログ
postinstall実行setup.cjsが自動実行されるDefenderのプロセスイベント、Node.js実行履歴
C2通信・第2段階ペイロードC2へ通信し、追加ペイロードを取得ネットワークイベント、プロキシログ、FWログ
永続化・防御回避Runキー、PowerShellバックドア、Defender除外、サービス永続化などレジストリ、サービス、Defender設定変更

特に危険なのは、攻撃が単なる「悪意あるnpmパッケージの混入」で終わっていない点です。Microsoftは、C2通信が成立した端末ではPowerShellバックドア、永続化、Defender除外の追加、SYSTEMコンテキストでのサービス型インプラントまで観測したと説明しています。(Microsoft)

Microsoft Defender管理者向けの初動チェックリスト

Microsoft Defender / Microsoft Threat Intelligenceの管理者は、次の順番で確認すると抜け漏れを減らせます。ポイントは、セキュリティ部門だけで完結させず、開発チーム、CI/CD管理者、ID管理者を巻き込むことです。

優先度確認項目具体的な確認先対応判断
高easy-day-jsの存在package-lock.json、node_modules、npmキャッシュ、CI成果物見つかったらインシデント扱いで調査
高npm install実行端末Defender XDR Advanced Hunting、EDR、端末管理台帳該当端末を特定し、必要に応じて隔離
高CI/CDランナーの使用履歴GitHub Actions、Azure Pipelines、自己ホストランナー、ビルドログ該当ランナーは再作成を優先
高C2通信Defenderのネットワークイベント、プロキシ、Firewall、DNSログ通信があれば認証情報侵害を前提に対応
高シークレット露出npm token、GitHub token、Azure資格情報、クラウドAPIキー該当環境のトークンをローテーション
中永続化の痕跡Runキー、サービス、system.bat、scdev.dll見つかった端末は再イメージを検討
中Defender除外の変更Defender設定、変更履歴、管理ポリシー不審な除外は削除し、変更者を確認
中Threat Intelligenceの確認Threat analytics、Intelligence explorer、Intel profilesIOCと関連レポートをSOC手順に反映

Microsoftは軽減策として、影響を受けた@mastraパッケージの直接・推移的依存関係の確認、easy-day-jsの有無の確認、既知の安全なバージョンへの固定、--ignore-scriptsの利用、IOCの確認、資格情報やトークンのローテーション、C2 IPのブロック、CI/CDログの監査、Defender Antivirusのクラウド提供保護の有効化を挙げています。(Microsoft)

開発端末とCI/CDで確認する具体的な場所

影響範囲の洗い出しでは、まずリポジトリ単位ではなく「インストールが実行された場所」単位で確認します。開発端末、自己ホスト型CIランナー、ビルドコンテナ、npmキャッシュ、Dockerイメージ作成環境が対象です。

リポジトリ側では、次のような確認が有効です。

grep -R "\"easy-day-js\"" package-lock.json npm-shrinkwrap.json pnpm-lock.yaml yarn.lock 2>/dev/null
grep -R "\"@mastra/" package.json package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null
npm ls easy-day-js

端末側では、MicrosoftがIOCとして示している$TMPDIR/.pkg_history、$TMPDIR/.pkg_logs、ホームディレクトリ配下のランダム名JavaScriptファイルなどを確認します。(Microsoft)

Windows端末では、PowerShellで次のように一時フォルダーとユーザープロファイルを確認できます。

Get-ChildItem $env:TEMP,$env:USERPROFILE -Force -Recurse -ErrorAction SilentlyContinue |
  Where-Object {
    $_.Name -in ".pkg_history",".pkg_logs","system.bat","scdev.dll","protocal.cjs","protocol.cjs" -or
    $_.Name -match "^[0-9a-fA-F]{8,}\.js$"
  } |
  Select-Object FullName, LastWriteTime, Length

LinuxまたはmacOSでは、次のような確認が実務的です。

find /tmp "$HOME" \
  \( -name ".pkg_history" -o -name ".pkg_logs" -o -name "protocal.cjs" -o -name "protocol.cjs" -o -name "nvmconf.service" \) \
  -print 2>/dev/null

Microsoftのブログ本文では永続化ファイル名としてprotocal.cjsという綴りが説明され、IOC表ではprotocol.cjsという表記も見られます。調査では、どちらか一方だけを検索するのではなく、両方を条件に入れると見落としを減らせます。(Microsoft)

Microsoft Defender XDRで実行したいAdvanced Hunting

Microsoft Defender XDRのAdvanced Huntingは、最大30日分の生データをクエリで探索できる脅威ハンティング機能です。Defender for Endpoint、Defender for Office 365、Defender for Cloud Apps、Defender for Identity、Microsoft Sentinelのデータを横断して確認できます。(Microsoft Learn)

まず、Microsoftが示した観点に沿って、Node.jsによるsetup.cjsやeasy-day-jsの実行を確認します。

DeviceProcessEvents
| where Timestamp >= datetime(2026-06-16T00:00:00Z)
| where FileName in~ ("node.exe", "node")
| where ProcessCommandLine has_any ("setup.cjs", "easy-day-js")
   or (ProcessCommandLine has "--no-warnings" and ProcessCommandLine has ".cjs")
| project Timestamp, DeviceName, AccountName, FileName, ProcessCommandLine, FolderPath, InitiatingProcessFileName, InitiatingProcessCommandLine
| sort by Timestamp desc

C2通信の確認では、MicrosoftがIOCとして示したIP、ドメイン、URLをもとに、Defenderのネットワークイベントを確認します。Microsoftは23.254.164[.]92、23.254.164[.]123、teams[.]onweblive[.]org、maskasd[.]comなどをIOCとして示しています。(Microsoft)

DeviceNetworkEvents
| where Timestamp >= datetime(2026-06-16T00:00:00Z)
| where RemoteIP in ("23.254.164.92", "23.254.164.123")
   or RemoteUrl has_any ("teams.onweblive.org", "maskasd.com", "23.254.164.92")
| project Timestamp, DeviceName, RemoteIP, RemotePort, RemoteUrl, InitiatingProcessFileName, InitiatingProcessCommandLine, ActionType
| sort by Timestamp desc

永続化の痕跡も確認します。特にWindowsでは、Runキー、隠しPowerShell、MicrosoftUpdateを装った値、scdevサービスなどが調査対象になります。

DeviceRegistryEvents
| where Timestamp >= datetime(2026-06-16T00:00:00Z)
| where RegistryKey has @"\Software\Microsoft\Windows\CurrentVersion\Run"
| where RegistryValueName in~ ("NvmProtocal", "MicrosoftUpdate")
   or RegistryValueData has_any ("protocal.cjs", "protocol.cjs", "system.bat", "powershell")
| project Timestamp, DeviceName, ActionType, RegistryKey, RegistryValueName, RegistryValueData, InitiatingProcessFileName, InitiatingProcessCommandLine
| sort by Timestamp desc

ファイルIOCの確認では、Microsoftが示したSHA-256やホスト上の痕跡を条件にします。IOCに該当する場合は、単なるマルウェア検知ではなく、CI/CDシークレットや開発者資格情報が露出した可能性まで見てください。

DeviceFileEvents
| where Timestamp >= datetime(2026-06-16T00:00:00Z)
| where FileName in~ (".pkg_history", ".pkg_logs", "system.bat", "scdev.dll", "protocal.cjs", "protocol.cjs")
   or SHA256 in~ (
      "B122A9873BEDF145AE2A7FD024B5F309007DBB025149F4DC4AC3F7E4F32A36A4",
      "AE70DD4F6BC0D1C8C2848E4E6B51934626C4818DCB5AF99D080DDBD7DC337185",
      "B73DE25C053C3225A077738A1FCBD9CA6966D7B3CD6F5494A30F0AA0EAE55C7E",
      "221c45a790dec2a296af57969e1165a16f8f49733aeab64c0bbd768d9943badf"
   )
| project Timestamp, DeviceName, ActionType, FileName, FolderPath, SHA256, InitiatingProcessFileName, InitiatingProcessCommandLine
| sort by Timestamp desc

IOC登録とブロックで失敗しやすいポイント

Microsoft Defender for Endpointでは、ファイルハッシュ、IPアドレス、URL/ドメイン、証明書などのインジケーターを管理できます。管理画面では、Settings > Endpoints > Indicatorsから種類ごとに追加・更新・削除できます。CSVによる一括インポートも可能ですが、1回のバッチでアップロードできるインジケーター数には制限があるため、大量登録時は分割が必要です。(Microsoft Learn)

ネットワークIOCをブロックする場合は、MicrosoftブラウザーではSmartScreen、Microsoft以外のブラウザーや非ブラウザープロセスではNetwork Protectionの有効化が関係します。また、Custom network indicatorsを使うには、Defenderポータルの高度な機能で有効化しておく必要があります。ブロック反映には最大48時間かかる場合があり、多くの場合は2時間未満とされています。(Microsoft Learn)

IOC種別登録例推奨アクション注意点
IPアドレス23.254.164.92、23.254.164.123Block内部IPは対象外。ネットワーク保護の要件を確認
ドメインteams[.]onweblive[.]org、maskasd[.]comBlock既存のAllowポリシーが優先されていないか確認
URLhttps[:]//23[.]254[.]164[.]92:8000/update/49890878などBlockHTTPSのフルパス制御はブラウザーや方式により差が出る
ファイルハッシュsetup.cjs、easy-day-js-1.11.22.tgzなどのSHA-256Block and remediateハッシュ登録だけでなく実行履歴も調査
ホスト痕跡.pkg_history、.pkg_logs、system.batハンティング条件Indicator登録より調査クエリ向き

特に注意したいのは、Allow、Warn、Blockの競合です。Microsoftのドキュメントでは、同じ対象に複数のアクションが設定された場合、Allow > Warn > Blockの順に優先されます。C2や悪性ハッシュをBlockしたつもりでも、過去のAllow設定が残っていると期待どおりに止まらない可能性があります。(Microsoft Learn)

権限確認:誰が調査・対応できる状態か

インシデント時に詰まりやすいのが、Defenderポータル内の権限です。Advanced Huntingを実行できる人、Threat analyticsを読める人、IOCを登録できる人、端末隔離などの応答操作ができる人が分かれていると、初動が遅れます。

Microsoft Defender XDRのAdvanced Huntingを使うには権限が必要で、Unified RBACではメール・コラボレーション系テーブル、アラート・挙動系テーブルなど、参照できるデータ範囲が権限によって分かれます。Microsoft Entraロールでは、Global Administrator、Security Administrator、Security Reader、Global Readerなどが高度なハンティングデータへの読み取りアクセスに関係します。(Microsoft Learn)

Threat analyticsについては、少なくとも1つのMicrosoft Defender製品ライセンスが必要で、Defender for Endpoint P1だけではThreat analyticsアクセスを付与しない例外があります。さらに、Threat analyticsレポート、関連インシデント、影響資産を見るにはSecurity data basics (read)、露出データや推奨アクションを見るにはVulnerability ManagementやExposure Managementの読み取り権限が関係します。(Microsoft Learn)

作業必要な人権限の考え方
Advanced Huntingの実行SOC、EDR運用担当セキュリティデータの読み取り権限を付与
Threat analyticsの確認SOC、脅威インテリジェンス担当レポート、影響資産、推奨アクションを見られる権限
IOC登録・変更Defender運用責任者誤登録の影響が大きいため少人数に限定
端末隔離・修復EDR対応担当対応アクション権限を付与
RBAC変更セキュリティ管理者Microsoft EntraのSecurity Administrator以上を基準に管理

Microsoft Defender unified RBACの管理には、少なくともMicrosoft Entra IDのSecurity Administratorが必要です。Global Administratorであれば何でも自動的に見える、という前提で運用するのではなく、平時から最小権限で役割を整理しておくことが重要です。(Microsoft Learn)

Microsoft Threat Intelligenceの移行ポイントも同時に確認する

今回のような脅威インテリジェンス起点の調査では、Microsoft Threat Intelligenceをどこで見るかも重要です。Microsoft Learnでは、従来の単独Microsoft Threat IntelligenceポータルとIntel Explorer experienceは2026年8月1日に廃止予定で、Microsoft Threat Intelligence機能はMicrosoft Defenderポータルに統合されると案内されています。(Microsoft Learn)

そのため、今回の対応を機に、次の移行タスクも進めておくと実務上の手戻りを減らせます。

移行対象見直す内容
ブックマーク旧Defender TIポータルではなくDefenderポータルのThreat intelligence導線へ変更
手順書「Threat intelligence > Intelligence explorer / Intel profiles」で探す手順に更新
権限Defender unified RBACでThreat Intelligence、Threat analytics、Advanced Huntingの権限を整理
プロジェクト運用IOC、調査メモ、関係者、判断結果をDefenderポータル側の運用に寄せる
SOC周知「旧ポータルで探す」手順を残さない

Defenderポータルでは、IP、ドメイン、URL、ファイルなどのエンティティページにThreat Intelligence Insightsが表示され、Intelligence explorerやIntel profilesから脅威アクター、ツール、IOC、関連分析にアクセスできます。今回のようにIOCから調査を始めるケースでは、Defenderポータル上でエンティティ、インシデント、アラート、脅威インテリジェンスをつなげて見る運用に寄せるべきです。(Microsoft Learn)

復旧時にやるべきこと:削除だけで終わらせない

easy-day-jsや侵害されたMastraパッケージを削除しただけでは、対応として不十分です。postinstallが実行された可能性がある端末やCI/CDランナーでは、すでにトークン、履歴、環境変数、クラウド認証情報が収集されている前提で動く必要があります。

実務では、次の順序で復旧すると判断しやすくなります。

| 順番 | 作業 | 判断基準 |
| -: | ————- | ——————————————- |
| 1 | ビルド停止 | 該当パッケージを含むCI/CDを一時停止 |
| 2 | 証拠保全 | Defenderイベント、CIログ、ロックファイル、npmキャッシュを保存 |
| 3 | ランナー再作成 | 自己ホスト型ランナーはクリーンイメージから再構築 |
| 4 | シークレットローテーション | CI/CD変数、npm token、GitHub token、クラウドAPIキーを更新 |
| 5 | 安全な依存関係へ固定 | Microsoftが示す既知の安全バージョンを基準にロック |
| 6 | 再ビルド | クリーン環境で再取得・再ビルド |
| 7 | 監視強化 | IOC、KQL、カスタム検出、ネットワーク制御を反映 |

Microsoftは、mastraでは1.13.0以前、@mastra/coreでは1.42.0以前は影響を受けないと説明しています。ただし、他の@mastra/*パッケージや推移的依存関係が関係する場合があるため、単一パッケージ名だけで安全判断しないことが大切です。(Microsoft)

再発防止:npmのサプライチェーン対策を運用に落とす

今回の件は、セキュリティ製品だけで防ぐ問題ではありません。npmパッケージのpublish権限、CI/CDのシークレット管理、ライフサイクルスクリプトの扱い、開発端末の監視がつながって初めてリスクを下げられます。

特に見直したいのは次の点です。

対策実務でのポイント
パッケージバージョン固定latest任せにせず、lockfileとレビューを必須にする
ライフサイクルスクリプト制御初回検証時はnpm ci --ignore-scriptsを使い、必要なスクリプトを明示的に許可
CI/CDの短命化自己ホスト型ランナーは使い回さず、可能ならエフェメラル化
シークレット最小化ビルドジョブごとに必要最小限の権限だけ渡す
egress制御CI/CDランナーから任意の外部IPへ通信できる状態を避ける
npmアカウント保護MFA、publish権限の棚卸し、不要なメンテナー権限の削除
依存関係レビューRenovateやDependabotのPRを自動マージしないルールを設ける
SOC連携開発チームからnpm異常をDefender運用へ連絡する窓口を決める

--ignore-scriptsは有効な防御策ですが、すべてのnpmパッケージで常時使うと正当なビルドやネイティブモジュールのセットアップが壊れる場合があります。現実的には、「未知・新規・緊急更新の検証ジョブではスクリプトを無効化し、承認済みの依存関係だけ本番ビルドで許可する」という段階的な運用が向いています。

開発チームへ周知する文面例

管理者から開発チームへは、技術的な詳細を長く説明するよりも、確認してほしい行動を明確に伝えるのが効果的です。

Mastra / @mastra 系npmパッケージに関するサプライチェーン侵害が確認されています。
2026年6月16日以降に、開発端末またはCI/CD環境で mastra / @mastra/* を含む npm install または npm update を実行した場合は、アプリで実際にimportしていなくても確認対象です。

以下を確認してください。
- package-lock.json、pnpm-lock.yaml、yarn.lock、node_modules に easy-day-js がないか
- CI/CDログに該当期間の npm install / npm update がないか
- 自己ホスト型ランナーで該当ビルドを実行していないか
- npm token、GitHub token、クラウドAPIキーなどが該当環境に存在していなかったか

該当する場合は、該当端末やランナーを使い続けず、セキュリティ管理者へ連絡してください。

この周知では、「アプリで使っていなければ安全」と誤解されないようにすることが重要です。今回の本質は、実行時のライブラリ利用ではなく、インストール時のライフサイクルスクリプト実行です。

まとめ:Defender管理者はIOC確認、権限整理、CI/CD復旧まで一気通貫で対応する

Mastra npm supply-chain compromiseとSapphire Sleetの件で、Microsoft Defender / Microsoft Threat Intelligence管理者が最初に見るべきポイントは、Defenderのアラート有無だけではありません。easy-day-js、setup.cjs、C2通信、永続化、Defender除外、CI/CDシークレット、自己ホストランナーまでを一つの攻撃経路として確認する必要があります。

すぐに取るべき行動は、次の5つです。

  • Mastra / @mastra/* / easy-day-jsの利用有無をロックファイル、CIログ、端末で確認する
  • Microsoft Defender XDRのAdvanced HuntingでNode.js実行、C2通信、永続化の痕跡を探す
  • IOCをDefenderやネットワーク制御に反映し、Allow設定の競合がないか確認する
  • 該当端末・CI/CDランナーに存在したトークンやAPIキーをローテーションする
  • Microsoft Threat Intelligenceの確認手順をDefenderポータル中心の運用へ移行する

今回のようなnpmサプライチェーン攻撃では、開発者だけ、SOCだけ、ID管理者だけでは対応が分断されます。Defender管理者は、検知・調査・復旧・周知・再発防止をつなぐ役割として、該当環境を早期に洗い出し、CI/CDと認証情報の安全性まで確認してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次