サイバー熊攻撃

セキュリティ

axios@1.14.1/0.30.4は危険|RAT配布の仕組みと感染確認

2026年3月31日

axiosの特定バージョンをnpmから取得しただけで、開発端末やCIランナーにRATが展開される事例が確認されました。

問題があったバージョンは公開から約3時間で削除されましたが、インストール済み環境では自己削除と偽装によって痕跡が見えにくくなります。

node_modulesを目視しても異常に気づけない構造です。macOS、Windows、Linuxそれぞれに異なる常駐ファイルが残ります。

該当バージョンを使用したかどうかで、確認内容と対応手順が変わります。環境が安全かどうかを自分で判断できる具体的なコマンドと復旧条件を整理します。

何が起きたか

JavaScriptライブラリ「axios」に、ウイルス入りの偽バージョンが混入しました。

ウイルスはaxios本体ではなく、axiosをインストールしたときに自動で一緒に入る別パッケージ plain-crypto-js に仕込まれていました。

「ライブラリを最新版に更新した」だけで感染する可能性があり、開発者側の操作ミスや不注意が原因ではありません。なお、latestを自動取得する運用は、この種の事故に遭遇しやすい側面があります。

参考:なぜlatestタグでの運用は危険なのか|バージョン固定の重要性

インストールした瞬間、裏側でこっそり外部サーバーに接続し、パソコンの中にマルウェアを仕込みます。しかもインストール後には証拠を自動で消すため、後から見ても「何もなかった」ように見えます。

感染したまま開発を続けると、パスワードやAPIキーなどの機密情報が盗まれる可能性があります。「自分は大丈夫」と判断する前に、インストール履歴を確認してください。

改ざんされたaxiosのバージョンと公開時間

2026年3月31日、npmに公開された axios 1.14.1 と 0.30.4 に、実行時依存として不正パッケージが追加されました。

公開から約2時間〜3時間で削除されていますが、インストール済み環境では影響が残ります。安全な直前バージョンは 1.14.0 と 0.30.3 です。

※一般的な市場データに基づくaxiosは、週1億回以上ダウンロードされるHTTPクライアントです。

アカウント乗っ取りによる手動publish

攻撃者はaxiosの主要メンテナー(jasonsaayman)のnpmアカウントに登録されたメールアドレスを攻撃者管理のProtonMailアドレスに書き換え、長期有効なクラシックトークンを使って悪意あるバージョンを手動でpublishしました。

正規のaxiosリリースはGitHub ActionsのOIDCトークンで発行されるため、npmレジストリのメタデータに trustedPublisher フィールドが存在します。

axios@1.14.1 にはこのフィールドがなく、対応するGitHubコミットもタグも存在しません。

パッケージ名と公開者名が正規と同一でも、OIDC署名の有無で侵害リリースを識別できます。

ソースコードに不審点が無い理由

改ざんはaxiosのソースコード内部では発生していません。

package.jsonに未使用の依存パッケージが1行追加されただけです。axiosのコード内部を読んでも異常は発見できませんが、package.jsonの依存差分を確認すれば検出できます

plain-crypto-jsはaxiosのソースコード86ファイルのどこにも importrequire() もされておらず、依存に追加されているにもかかわらずコード内で一切使われていないことが高確度の異常シグナルです。

npmの依存解決とpostinstallの自動実行が悪用されました。

攻撃の仕組み

サイバー攻撃

使われた偽依存パッケージplain-crypto-js

依存に追加された plain-crypto-js@4.2.1 は、axiosのコード内で一切読み込まれません。

存在目的は postinstall スクリプトの実行のみです。インストール直後に setup.js が起動します。

postinstallでRATが実行される流れ

npm install 実行時、依存解決により plain-crypto-js が取得されます。

postinstall により setup.js が自動実行され、外部C2サーバーへ接続し、OS別の2段階目ペイロードを取得します。

macOS・Windows・Linuxで異なるファイルが作成され、バックグラウンドで起動します。

実行後に証拠が消える仕組み

setup.js は実行後に自分自身と package.json を削除し、事前に用意されたクリーンな package.json に置き換えます。

node_modules/plain-crypto-js を後から確認しても、不審なpostinstallは見つかりません。

ディレクトリの存在自体が実行済みの証拠になります。

自分の環境が該当するかの判定手順

axiosバージョンの確認コマンド

  • npm list axios 2>/dev/null | grep -E "1\.14\.1|0\.30\.4"
  • grep -A1 '"axios"' package-lock.json | grep -E "1\.14\.1|0\.30\.4"

node_modules内のディレクトリ確認

  • ls node_modules/plain-crypto-js 2>/dev/null && echo "POTENTIALLY AFFECTED"

OS別の感染痕跡ファイル確認

  • macOS:ls -la /Library/Caches/com.apple.act.mond 2>/dev/null && echo "COMPROMISED"
  • Linux:ls -la /tmp/ld.py 2>/dev/null && echo "COMPROMISED"
  • Windows:dir "%PROGRAMDATA%\wt.exe" 2>nul && echo COMPROMISED

CI/CDと開発端末で確認するポイント

CIログの確認観点

該当時間帯に npm install を実行しているジョブが存在する場合、影響対象になります。

インストールログに axios 1.14.1 または 0.30.4 が含まれているかを確認します。該当するジョブでは、投入されたシークレットの漏洩を前提に扱います。

開発端末で確認する理由

postinstallはローカル端末でも実行されます。CIのみ安全でも、開発者がローカルで npm install を実行している場合は影響対象になります。

SSH鍵、クラウド資格情報、.env の内容が取得対象になります。

該当した場合の復旧条件

クリーンなバージョンへの固定

  • npm install axios@1.14.0
  • npm install axios@0.30.3

資格情報ローテーション対象

npmトークン、AWS/GCP/Azureキー、SSH秘密鍵、CIシークレット、.envに含まれる値をすべてローテーションします。

該当環境はクリーン再構築を前提に扱います。

再発防止としての--ignore-scripts

  • npm ci --ignore-scripts

CI環境ではpostinstallを実行させない運用に切り替えます。

同日発生の関連セキュリティ事案

同日Claude Codeソース流出も起きているので合わせて注意が必要です。

参考:Claude Codeソース流出事件|事故か無能さかそれともAI史上最高のPRか?

  • この記事を書いた人

九十九惣次郎

キーを叩いていないときは、都会や田舎の風景を探検しています。

よく読まれている記事

条件の0=0は全てが正であるを意味するSQL 1

SQLの条件に0=0のような記述を見かけます。 変わった書き方の条件ですが、これは「全てが正である」事を意味しており、結合条件の場合はCROSS JOINと同じです。 下記の例で言えば、結合するsub ...

DISTINCTを使わないで重複排除を考えるSQL 2

SQLのDISTINCTはEXISTSとかGROUP BYでなんとかする事もできます。 DISTINCTは暗黙的なソートがされますが、何のDBを使うにせよ過去のバージョンならともかく、最近のバージョン ...

RFC 5322に準拠させた正規表現言語別 3

RFC5322で定義されている正規表現を、各言語の正規表現に変化させた形になります。 完全な電子メール正規表現は存在しないので、結局のところ何かの公式基準に従っていたとしても、自分が携わるサービスのル ...

-セキュリティ