🔰 はじめに
axiosのサプライチェーン攻撃、大丈夫そう?
同僚からこんなメッセージが飛んできました。
なんだろうと思って調べたら、ゾワッとしたので共有します。
axiosは、JavaScriptで最もよく使われるHTTP通信ライブラリの1つで、npmでの週間ダウンロード数は1億回以上。フロントエンドからバックエンドまで、多くのプロジェクトで使われています。
そのaxiosが、サプライチェーン攻撃(ソフトウェアの配布経路を悪用して、正規のパッケージにマルウェアを仕込む攻撃手法)を受けました。詳細は以下の記事にまとまっています。
- axiosのnpmパッケージ乗っ取りについて — Zenn
- axios@1.14.1 and axios@0.30.4 are compromised · Issue #10604 · axios/axios
- axios Compromised on npm — StepSecurity
そして、まさにその日が自分のリリース作業日だったという話です。
📅 何が起きたのか — タイムライン
| 日時 (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 が緊急警告を公開 |
| 同日中 | npm レジストリから該当バージョンが削除される |
攻撃者は、axiosのメンテナーである jasonsaayman 氏のnpmアカウントを乗っ取り、通常のGitHub Actions CI/CDパイプラインをバイパスして、直接npmに不正なバージョンを公開しました。
💀 何が仕込まれていたのか
以降の内容は、上記の参考記事をもとに自分なりに整理したものです。正確な一次情報は参考リンクをご確認ください。
攻撃の仕組み
不正なaxiosのバージョン(1.14.1 / 0.30.4)には、依存パッケージとして plain-crypto-js@4.2.1 が追加されていました。
ポイントは、axios本体のコードには悪意のあるコードが一切ないということです。plain-crypto-js はaxiosのコード内のどこからも import されていません。にもかかわらず、npm install を実行すると、plain-crypto-js の postinstallスクリプト(パッケージのインストール直後に自動実行されるスクリプト)が走り、マルウェアがダウンロード・実行される仕組みでした。
マルウェアの挙動
plain-crypto-js のpostinstallスクリプトは、OSごとに異なるペイロード(悪意のあるプログラム)をダウンロード・実行する RAT(Remote Access Trojan / 遠隔操作ツール)のドロッパー として動作します。
「ドロッパー」とは、それ自体が直接悪さをするわけではなく、本命のマルウェアを対象のマシンに 「落とす(drop)」=ダウンロードして配置・実行する役割に特化したプログラムのことです。今回の場合、plain-crypto-js がドロッパーにあたり、そこからRATが各OS向けに配布されていました。
-
Linux:
/tmp/ld.pyとしてPythonスクリプトをダウンロード・実行 -
Windows:
%PROGRAMDATA%\wt.exeとして実行ファイルをダウンロード・実行 - macOS: 同様にバイナリをダウンロード・実行
このRATは、開発者のマシン上で動作し、認証情報、SSHキー、クラウドトークンなどを窃取する機能を持っていました。さらに、実行後は自分自身を削除し、package.jsonをクリーンな状態に置き換えるという証拠隠滅の仕組みまで備えていたとのことです。
😱 で、うちのプロジェクトは大丈夫?
さて、ここからが本題です。
リリース日だった自分は、同僚からの話でニュース記事を見て血の気が引きました。npmやっていたよ。今日…と。
念のため package.json を確認すると……
axiosいらっしゃった!!
今回のプロジェクトでは、リリース資材をDocker上でビルドしています。そのため、ローカル環境だけでなく、Dockerコンテナ内の node_modules に侵害バージョンが入っていないかを確認する必要がありました。
ということで、Docker上で以下のコマンドを使って確認しました。
確認コマンド
# ----------------------------------------------------------
# 1. axios のバージョン確認
# ----------------------------------------------------------
docker run --rm <イメージ名> npm list axios
# ----------------------------------------------------------
# 2. 不正パッケージ plain-crypto-js の有無確認
# ----------------------------------------------------------
docker run --rm <イメージ名> npm list plain-crypto-js
# ----------------------------------------------------------
# 3. マルウェア痕跡の確認 (Linux 向けペイロード)
# ----------------------------------------------------------
docker run --rm <イメージ名> ls -la /tmp/ld.py
<イメージ名> の部分は、ご自身のDockerイメージ名に置き換えてください。
node_modules がデフォルトの WORKDIR と異なる場合は、以下のようにパスを指定します。
docker run --rm <イメージ名> sh -c "cd /app && npm list axios"
Windowsの場合(ローカル環境)
Docker環境ではなくWindows上で直接確認する場合は、PowerShellで以下を実行します。
Test-Path "$env:PROGRAMDATA\wt.exe"
False が返れば、Windows向けペイロードは存在しません。
✅ 確認結果
axios のバージョン → 1.6.8
plain-crypto-js → empty(存在しない)
/tmp/ld.py → No such file or directory
セーフ! ほっとしました。落ち着いてリリースできます。
※バージョンが古いのは目をつぶってください……
📋 影響の判定基準
自分の環境が影響を受けているかどうかは、以下で判断できます。
| 項目 | 安全 | 危険 |
|---|---|---|
| axios のバージョン |
1.14.0 以下 / 0.30.3 以下 |
1.14.1 / 0.30.4
|
plain-crypto-js |
存在しない | 存在する |
/tmp/ld.py (Linux) |
存在しない | 存在する |
%PROGRAMDATA%\wt.exe (Windows) |
存在しない | 存在する |
🛡️ もし侵害されていたら
以降の対応手順は、参考リンクに掲載されている情報をもとにまとめたものです。実際に侵害が確認された場合のガイドラインとして参考になれば幸いです。
万が一、影響を受けるバージョンがインストールされていた場合は、以下の対応を行ってください。
-
axiosのバージョンを安全なバージョンに固定する
- 1.x系:
1.14.0 - 0.x系:
0.30.3
- 1.x系:
-
package-lock.jsonを削除し、クリーンインストールするrm -rf node_modules package-lock.json npm install -
Dockerイメージを
--no-cacheで再ビルドするdocker build --no-cache -t <イメージ名> . - シークレットのローテーション(重要)
RATが認証情報を窃取している可能性があるため、SSHキー、APIトークン、クラウド認証情報などをすべてローテーション(再発行・変更)してください。
💡 今回の教訓
今回の件で個人的に感じたことをまとめます。
- 同僚の一言に救われた — 「大丈夫そう?」と声をかけてもらえたからこそ、すぐに調査・確認に動けました。日頃からチーム内でセキュリティ情報を共有し合える関係って大事だなと改めて実感しました
- 「自分ごと」としてチェックすることの大切さ — ニュースで流れてくるセキュリティインシデントを「他人事」として流してしまいがちですが、今回は自分のプロジェクトにaxiosが入っていました。「うちは大丈夫だろう」ではなく、手を動かして確認する習慣が重要です
- タイミングの悪さは忘れた頃にやってくる — よりによってリリース当日まさにその時に攻撃を認識するという……。こればかりはコントロールできませんが、だからこそ日頃から「何かあったときにすぐ確認できる手順」を持っておくことが安心につながります
🔗 参考リンク
- axios@1.14.1 and axios@0.30.4 are compromised · Issue #10604 · axios/axios
- axios Compromised on npm — StepSecurity
- axiosのnpmパッケージ乗っ取りについて — Zenn
最後に、GMOコネクトでは研究開発や国際標準化に関する支援や技術検証をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。