🚨

【緊急】axios がサプライチェーン攻撃 2026.03.31

に公開
2

TL;DR

2026年3月31日、npm で最も利用されているHTTPクライアントライブラリの一つである axios がサプライチェーン攻撃を受けました。攻撃者はリードメンテナーのアカウントを乗っ取り、マルウェアを含む2つのバージョンを公開しています。

項目 内容
侵害バージョン axios@1.14.1axios@0.30.4
安全なバージョン axios@1.14.0(1.x系)、axios@0.30.3(0.x系)
悪意あるパッケージ plain-crypto-js@4.2.1
マルウェア種別 クロスプラットフォームRAT(Remote Access Trojan)ドロッパー
影響規模 npm 週間ダウンロード数 1億超
検知 StepSecurity、Socket AI

何が起きたのか

攻撃の経緯

StepSecurity の報告によると、攻撃者は axios のリードメンテナーである jasonsaayman の npm アカウント認証情報を窃取しました。通常の GitHub Actions CI/CD パイプラインを完全にバイパスし、以下の手順で攻撃を実行しています。

  1. アカウント乗っ取り — メンテナーのnpmアカウントのメールアドレスを攻撃者管理のProtonMailアドレス(ifstap@proton.me)に変更
  2. 悪意ある依存の事前配置plain-crypto-js@4.2.1 を攻撃の 18時間前 に公開
  3. 両ブランチ同時攻撃axios@1.14.1(1.x系)と axios@0.30.4(0.x系)を 39分以内 にnpm CLIから手動パブリッシュ
  4. 証拠隠滅 — GitHub Issues の削除を含む、現在も進行中のアカウント悪用

依存関係の差分

# axios@1.14.0(正規)
dependencies:
  follow-redirects
  form-data
  proxy-from-env

# axios@1.14.1(侵害済み)
dependencies:
  follow-redirects
  form-data
  proxy-from-env
  plain-crypto-js    ← 本日新規作成された不正パッケージ

axios のソースコード自体には悪意あるコードは一切含まれていません。plain-crypto-js はaxiosのどこからも import / require されておらず、postinstall スクリプトを実行するためだけに存在しています。

マルウェアの技術的詳細

plain-crypto-js@4.2.1postinstall スクリプトは、クロスプラットフォーム対応の RAT ドロッパーとして機能します。

実行フロー

  1. 難読化解除 — 実行時に埋め込みペイロードと操作文字列をデコード
  2. 動的ロードfsosexecSync を動的にロードし、静的解析ツールによる検知を回避
  3. C2通信 — コマンド&コントロールサーバーに接続し、プラットフォーム固有の第2段階ペイロードを取得
  4. ペイロード配置 — OS ごとに異なるパスにペイロードを配置・実行
  5. 自己消去 — 実行後に package.json をクリーンバージョンに差し替え、痕跡を削除

プラットフォーム別のペイロード配置先

OS ファイルパス
macOS /Library/Caches/com.apple.act.mond
Windows %PROGRAMDATA%\wt.exe
Linux /tmp/ld.py

3つのOSそれぞれに対応したペイロードが事前にビルドされていたことから、計画的かつ高度に組織化された攻撃であることがわかります。

IoC(Indicators of Compromise)

悪意あるパッケージ

  • axios@1.14.1
  • axios@0.30.4
  • plain-crypto-js@4.2.1

ネットワーク

種別
C2ドメイン sfrclak.com
C2 IP 142.11.206.73
C2 URL http://sfrclak.com:8000/6202033

攻撃者関連アカウント

アカウント メール
jasonsaayman(侵害済み) ifstap@proton.me(攻撃者が変更)
nrwise nrwise@proton.me

今すぐやること

Step 1 — 影響確認

まず、自分のプロジェクトが影響を受けているか確認してください。

# npm
npm list axios
npm list plain-crypto-js

# yarn
yarn why axios

# pnpm
pnpm list axios

# bun
bun pm ls | grep axios
bun pm ls | grep plain-crypto-js

# Vite+ (vp)
vp why axios
vp pm list plain-crypto-js

また、ファイルシステム上のIoCも確認します。

# macOS
ls -la /Library/Caches/com.apple.act.mond

# Linux
ls -la /tmp/ld.py

# Windows (PowerShell)
Test-Path "$env:PROGRAMDATA\wt.exe"

ネットワークログで sfrclak.com または 142.11.206.73 への通信がないかも確認してください。

Step 2 — 感染していた場合

  • そのマシン/コンテナを侵害済みとして扱い、隔離する
  • npm installnpm runbun installvp install 等を絶対に実行しない(マルウェアが再実行される)
  • すべてのシークレット、APIキー、認証情報をローテーションする
  • ネットワークログで C2 通信の痕跡を確認する
  • node_modules と lockfile(package-lock.json / yarn.lock / pnpm-lock.yaml / bun.lock)を削除し、Step 3 でクリーンインストール

Step 3 — バージョン固定

package.json を修正して安全なバージョンに固定します。

{
  "dependencies": {
    "axios": "1.14.0"
  }
}

クリーンインストール:

# npm
rm -rf node_modules package-lock.json
npm install

# yarn
rm -rf node_modules yarn.lock
yarn install

# pnpm
rm -rf node_modules pnpm-lock.yaml
pnpm install

# bun
rm -rf node_modules bun.lock
bun install

# Vite+ (vp) — 内部のパッケージマネージャに委譲
rm -rf node_modules
vp install

pin 解除の防止策として overrides を設定しておくと安全です。

{
  "overrides": {
    "axios": "1.14.0"
  }
}
パッケージマネージャ 設定キー 設定場所
npm overrides package.json
yarn resolutions package.json
pnpm pnpm.overrides package.json
bun overrides package.json
Vite+ (vp) 内部PMに準拠(デフォルト pnpm) package.json

Step 4 — CI/CD の防御策

# postinstall スクリプトの実行を無効化(追加の保護)
npm install --ignore-scripts
yarn install --ignore-scripts
pnpm install --ignore-scripts
bun install --ignore-scripts
vp install --ignore-scripts
  • デプロイ/CI では既存の lockfile を使用し、最新取得を避ける
    • npm: npm ci
    • yarn: yarn install --frozen-lockfile
    • pnpm: pnpm install --frozen-lockfile
    • bun: bun install --frozen-lockfile
    • Vite+: vp install --frozen-lockfile
  • lockfile を変更する PR は必ず差分をレビューする
  • npm audit を実行する(検知が追いついていない可能性はあるが、基本の衛生管理として)

axios を直接使っていなくても要注意

axios は npm エコシステムで最も依存されているパッケージの一つです。自分の package.json に書いていなくても、以下のような経路で推移的依存(transitive dependency)として含まれている可能性が高いです。

  • フロントエンドフレームワークの HTTP モジュール
  • バックエンドの SDK やクライアントライブラリ
  • テストツールやビルドツールのプラグイン
  • サードパーティの npm パッケージ内部

必ず自分の環境に合ったコマンドで確認してください。

npm list axios        # npm
yarn why axios        # yarn
pnpm list axios       # pnpm
bun pm ls | grep axios  # bun
vp why axios          # Vite+

タイムライン

日時 (UTC) イベント
2026/03/30 23:59 plain-crypto-js@4.2.1 が npm に公開
2026/03/31 00:05 Socket AI が自動検知・フラグ
2026/03/31 ~00:38 axios@1.14.1 + axios@0.30.4 が公開(39分以内に両方)
2026/03/31 数時間内 StepSecurity が緊急警告を公開
現在進行中 メンテナーアカウントは依然として侵害状態、Issue の削除等が発生中

教訓と今後の対策

今回の攻撃は、npm エコシステムにおけるいくつかの構造的な問題を浮き彫りにしています。

メンテナーアカウントの保護が最重要防衛線であるということ。どれだけ CI/CD パイプラインを堅牢にしても、npm のアカウント認証情報が漏洩すれば CLI から直接パブリッシュできてしまいます。npm の OIDC Trusted Publisher 機能はこのリスクを軽減しますが、アカウント自体が乗っ取られた場合の防御にはなりません。

lockfile は防御の最後の砦です。 lockfile を使ったインストール(npm ci / yarn install --frozen-lockfile / pnpm install --frozen-lockfile / bun install --frozen-lockfile / vp install --frozen-lockfile)を徹底していれば、たとえ上流が侵害されても即座には影響を受けません。逆に npm install / bun install 等で常に最新を取得する運用は、こうした攻撃の直撃を受けます。

依存関係の変更を監視する仕組みを入れましょう。 Socket、Snyk、Dependabot などのツールで、新しい依存の追加や postinstall スクリプトの変更を自動検知できます。

参考リンク


【更新】 続き:事件の時系列とNixによるセキュアなインストール環境の構築

今回の事件を受けて、「じゃあ具体的にどうやって今後安全に対策できるのか」
InstallTrust Score やNix のサンドボックスがどう動くかを書きました。
👇
https://x.com/gunta85/status/2039024666363490550

Discussion

ryoppippiryoppippi

bun why/pnpm why コマンドあります!

biztexbiztex

緊急性の高い情報を迅速にまとめて共有していただき、本当にありがとうございます。

今回のサプライチェーン攻撃に関して、特に「lockfileの重要性」や「CI/CDだけでは防げない現実」といった指摘には強く共感しました。現場でも見落とされがちなポイントを、具体的な手順とともに整理されていて非常に実用的だと感じました。

Full-Stack & AI Engineerとして日々開発に関わる立場から見ても、このような実践的かつ即応性のある情報発信はとても価値があります。注意喚起だけでなく、具体的な対処方法まで網羅されている点も素晴らしいです。

有益な記事の投稿、ありがとうございました!