axiosがnpmで乗っ取られRATが配布された — サプライチェーン攻撃の全容と対策
はじめに
2026年3月31日、JavaScriptで最も広く使われるHTTPクライアントライブラリ「axios」のnpmパッケージが侵害された。攻撃者はメンテナのnpmアカウントを乗っ取り、リモートアクセストロイの木馬(RAT)を仕込んだバージョンを公開。axiosは週間1億ダウンロードを超え、クラウド環境の約80%に存在するとされるパッケージだ。この記事では、攻撃の全容、技術的な仕組み、そしてエンジニアが今すぐ取るべき対策を解説する。
何が起きたのか — 攻撃のタイムライン
攻撃者はaxiosのリードメンテナ jasonsaayman のnpmアカウントを侵害し、長期間有効だったクラシックnpmアクセストークンを使って悪意あるバージョンを手動で公開した。
| 時刻(UTC) | イベント |
|---|---|
| 3/30 05:57 | plain-crypto-js@4.2.0 を公開(無害なデコイで公開履歴を確立) |
| 3/30 23:59 | plain-crypto-js@4.2.1 を公開(悪意あるsetup.jsを含む) |
| 3/31 00:21 | axios@1.14.1 を公開(1.x系の最新版として配布) |
| 3/31 01:00 | axios@0.30.4 を公開(レガシー0.x系向け) |
| 3/31 ~03:15 | npmが両バージョンを削除(公開から約2〜3時間後) |
| 3/31 04:26 | plain-crypto-js がセキュリティホルダーに置き換え |
注目すべきは、正規のaxiosリリースはすべてGitHub ActionsのOIDC Trusted Publisherメカニズム経由で公開されていた点だ。今回の悪意あるバージョンはnpm CLIからの手動パブリッシュであり、メンテナのメールアドレスも ifstap@proton.me に変更されていた。この不一致が、攻撃を見分ける決定的な証拠となった。
攻撃の技術的な仕組み
巧妙な依存関係の注入
axios本体のソースコードには一切変更が加えられていない。攻撃者は package.json に plain-crypto-js という偽の依存関係を追加しただけだ。この偽パッケージの postinstall フックが、RATのドロッパーとして機能する。
plain-crypto-js@4.2.1 には3つの重要な要素が含まれていた。
- setup.js: 4.2KBの難読化されたドロッパースクリプト
- postinstallフック:
npm install時に自動実行される仕掛け - package.md: クリーンなバージョン4.2.0に見せかけるアンチフォレンジック用スタブ
ドロッパーはXOR暗号(鍵: OrDeR_7077)で文字列を難読化し、モジュール名やC2サーバーのURLを隠蔽していた。
プラットフォーム別のRAT配布
RATは開発者のマシン上で動作し、認証情報やSSH鍵、クラウドトークンを窃取するよう設計されていた。OS別の挙動は以下の通りだ。
| OS | 配置先 | 実行方法 |
|---|---|---|
| macOS | /Library/Caches/com.apple.act.mond | AppleScript経由でバイナリ実行 |
| Windows | %PROGRAMDATA%\wt.exe | PowerShellコピー + VBScriptローダー |
| Linux | /tmp/ld.py | curlでPython RATをダウンロード・実行 |
C2通信先のドメインは sfrclak.com(IP: 142.11.206.73)で、通信時には packages.npm.org/product0~2 という値を送信し、npmの正規トラフィックに偽装していた。RATは60秒間隔のビーコンループを維持し、任意のスクリプト実行やインメモリバイナリインジェクションを含む追加コマンドの受信が可能だった。
さらに巧妙なことに、実行後にドロッパーは自身を削除し、package.jsonをクリーンなバージョンに置き換えるアンチフォレンジック処理を行う。
エンジニアが今すぐ確認・対応すべきこと
影響確認
まず自分のプロジェクトが影響を受けたか確認する。
# 直接・間接依存を確認
npm ls axios
# 悪意あるパッケージの痕跡を確認
ls node_modules/plain-crypto-js/
plain-crypto-js ディレクトリが存在すれば、そのシステムは侵害された可能性がある。ただし自己削除機能があるため、ディレクトリがなくても安全とは限らない。
即座の対応
- 安全なバージョンにダウングレード:
axios@1.14.0(1.x系)またはaxios@0.30.3(0.x系) - クレデンシャルの即時ローテーション: npmトークン、AWSキー、SSH鍵、クラウド認証情報すべて
- C2通信のブロック:
sfrclak.comおよび142.11.206.73をファイアウォールでブロック - CI/CD環境を最優先で対応: GitHub Actionsなどの高権限環境は特に危険
中長期的な防御策
今回の事件を機に、以下の対策を検討すべきだ。
.npmrcにmin-release-age=7を設定: 公開から一定時間経過していないパッケージのインストールをブロックする- CI/CDで
--ignore-scriptsを使用: postinstallフックの自動実行を防止 - pnpmの
trustPolicy: no-downgrade: OIDC認証から手動パブリッシュへの切り替えを検出 - lockfileの厳格な管理:
npm ciを徹底し、lockfileに含まれないバージョンの混入を防ぐ
まとめ
- axiosのnpmメンテナアカウントが侵害され、RATを含む
axios@1.14.1とaxios@0.30.4が約2〜3時間公開された - 攻撃者はaxios本体ではなく偽の依存パッケージ経由でpostinstallフックを悪用した
- macOS/Windows/Linuxすべてに対応するクロスプラットフォームRATが配布された
plain-crypto-jsの痕跡がある環境はクレデンシャルの即時ローテーションが必要
npmエコシステムにおけるサプライチェーン攻撃は、もはや「もし起きたら」ではなく「いつ起きるか」の問題だ。依存関係の監視、公開メカニズムの検証、CI/CDパイプラインの防御を、今一度見直す時が来ている。