2026年4月1日、本レポートは更新され、複数の指標において中程度の確度での一致が確認されたことから、本件の侵害は、金銭的動機を持つDPRK(北朝鮮)の国家主体アクター「UNC1069」によって実行された可能性が高いと判断されたことが追記されました。
2026年3月31日、攻撃者はAxiosの主要メンテナーのnpmアカウントを侵害し、パッケージレジストリに2つの不正なバージョンを公開しました。これらの改ざんされたリリースには新たな依存関係が追加されており、その中にクロスプラットフォームで動作するドロッパーが含まれていました。このドロッパーは、npm経由でパッケージをインストールした端末に対して、各プラットフォーム向けのリモートアクセス型トロイの木馬(RAT)を取得・展開します。ドロッパーはハードコードされたコマンド&コントロール(C2)サーバーに接続し、macOS、Windows、Linux向けの不正なペイロードをダウンロードした後、自身およびパッケージ内の悪意あるコンテンツの痕跡をすべて削除し、展開されたRATのみをディスク上に残す設計となっていました。
Axiosとは?
Axiosは、JavaScriptエコシステムにおいて最も広く利用されているHTTPクライアントライブラリです。フロントエンドフレームワーク、バックエンドサービス、CI/CDツール、企業内の業務アプリケーションなど、Node.jsやブラウザでHTTPリクエストを行う仕組みの多くで使用されています。package.jsonに ^1.14.0 のような一般的なキャレット指定を用いているプロジェクトでは、次回のインストール時に不正なバージョンへ自動的に解決されてしまう可能性がありました。Axiosのソースコードに目立った変更はなく、パッケージ名、公開者、バージョン番号から問題を察知することは困難でした。
Axiosは週あたり1億回以上ダウンロードされており、HTTP通信を行うほぼすべてのNode.jsアプリケーションの依存関係に含まれています。このため、本件は非常に大きな影響を及ぼす可能性を持つ事案でした。
どのように発見されたのか?
Socket Securityの自動スキャナーが、不正な依存関係である plain-crypto-js@4.2.1 を公開から6分以内に検知しました。StepSecurityも独自に侵害されたAxiosの両バージョンを特定し、詳細な技術分析を公開しています。この分析により、npm installが開始されてから1.1秒後に、マルウェアが最初のC2通信を行っていたことが、実行時の挙動から確認されました。
Socketの共同創業者であるFeross Aboukhadijeh氏は、次のように警告を公表しています。
「Axiosに対するサプライチェーン攻撃が進行中です。npmで最も多く依存されているパッケージのひとつを狙った、典型的なサプライチェーン型インストーラーマルウェアです。
セキュリティチームは、問題の2つのバージョンを削除し、セキュリティ用のホルダーパッケージに置き換えました。axios@1.14.1は約3時間、axios@0.30.4は約2時間15分公開されていました。その間、正規メンテナーであるJason Saayman氏は自身のアカウントから締め出された状態となっており、Axiosの協力者のひとりは、攻撃者の権限が自身の権限を上回っていたため、アクセスの取り消しができなかったとGitHub上で報告しています。
技術的な詳細
影響を受けたバージョン
侵害されたリリースは axios@1.14.1 と axios@0.30.4 です。最新の1.x系と旧来の0.x系の両方が、39分以内という短時間で連続して改ざんされました。安全と確認されているバージョンは axios@1.14.0 と axios@0.30.3 です。さらにSocketは、同一の不正ペイロードを含む依存関係を配布していた別のパッケージとして、@shadanai/openclaw および @qqbrowser/openclaw-qbot@0.0.130 を特定しています。
攻撃の経緯
攻撃者は、Axiosの主要メンテナーである jasonsaayman のnpmアカウントを侵害し、登録されていたメールアドレスを匿名のProtonMailアドレスに変更しました。その後、npm CLIを用いて直接2つの不正なバージョンを公開し、通常のGitHub Actionsによる公開フローを完全に迂回しました。このため、AxiosのGitHubリポジトリには、該当バージョンに対応するコミット、タグ、リリースは一切存在しません。
Axiosが侵害される18時間前、攻撃者が使用したとみられる使い捨てアカウント(nrwise、こちらもProtonMailを使用)が plain-crypto-js@4.2.0 を公開していました。これは正規の crypto-js ライブラリのクリーンなコピーであり、公開履歴を作ることで、履歴ゼロのパッケージに対する自動検知を回避する目的で用いられていました。
3月30日23時59分(UTC)、攻撃者は難読化されたドロッパーを含む plain-crypto-js@4.2.1 を公開しました。このバージョンには、実行後に証拠を消去するためのクリーンな package.json スタブがあらかじめ用意されていました。
その22分後、axios@1.14.1 が公開されました。追加された依存関係は「plain-crypto-js": "^4.2.1" の1件のみで、このパッケージはAxiosのコード内で一切参照されていませんでした。目的は、npmの postinstall フックを実行させることだけでした。
攻撃の流れ
ドロッパー(setup.js)は二重の難読化を施しており、文字列の反転とBase64化に加え、XOR復号を用いることで、重要な文字列を保存時には読めない形にし、実行時のみ復号する仕組みになっていました。また、child_process、os、fs を動的に読み込むことで、静的解析による検知を回避しています。その後、対象のOSに応じた処理に分岐します。
- npmは、侵害されたAxiosの依存関係として plain-crypto-js@4.2.1 を自動的に解決し、インストールします。
- postinstallフックが実行され、npm installの完了前に node setup.js が起動します。
- ドロッパーは os.platform() によりOSを判別し、プラットフォーム識別情報を含むPOSTリクエストを、npmレジストリURLを装った形式で C2 サーバー(sfrclak[.]com:8000)に送信します。
- プラットフォーム別のRAT展開
- macOS:AppleScriptが /Library/Caches/com.apple.act.mond にバイナリをダウンロードし、実行権限を付与したうえで /bin/zsh から起動します。
- Windows:正規の powershell.exe を %PROGRAMDATA%\wt.exe にコピーし(Windows Terminalを装った名称)、不可視のVBScriptおよびPowerShellのチェーンを通じてRATを取得し、-ExecutionPolicy Bypass を指定して実行します。
- Linux:curlでPython製のRATを /tmp/ld.py に取得し、nohup python3 により、親プロセス終了後も動作を継続させます。
- 自己削除:ドロッパーは setup.js を削除し、postinstallフックを含む package.json を除去したうえで、あらかじめ用意されていたクリーンなスタブをその位置に配置します。そのため、感染後に node_modules/plain-crypto-js/ を確認しても、不審な痕跡は確認できません。
StepSecurityによる詳細な静的・動的解析(復号されたドロッパー文字列やHarden-Runnerのプロセスツリーを含む)は、以下で公開されています。
https://socket.dev/blog/axios-npm-package-compromised.
このRATの重要な特徴として、永続化機能を備えていない点が挙げられます。感染した端末を再起動した場合、バイナリはディスク上に残るものの、自動的に実行されることはありません。これは、永続化を行うことでEDRや防御側に検知されやすくなるため、意図的に省かれた可能性があります。あるいは、C2サーバーに接続後、追加のペイロード取得や永続化指示を受け取る設計だった可能性も考えられます。特定の標的や価値の高い被害者に対してのみ、永続化機能を有効化する意図があった可能性も否定できません。Windows環境で永続化の痕跡が確認されたという報告もありますが、初期感染時の挙動なのか、後続のC2コマンドによるものなのかは、現時点では明らかになっていません。
攻撃者の特定と目的
2026年4月1日更新: 本件の侵害は、金銭的動機を持つDPRK(北朝鮮)国家支援型の脅威アクター「UNC1069」によって実行された可能性が高いと考えられます。この評価は、過去のUNC1069の活動と中程度の確度で一致する複数の要素に基づいています。
マルウェアに関する特徴
- C2のURLがコマンドラインから動的に指定されている
- ビーコン通信において、同一の珍しいユーザーエージェント文字列が使用されている
- macOS上で使用される一時ディレクトリの場所が、過去のUNC1069の事例と一致している
C2インフラに関する特徴
- AxiosのC2アドレスへの通信が、過去にUNC1069で使用されたことのあるAstrill VPNノードから観測されている
- AxiosのC2アドレスと同一ASN内に存在する周辺インフラが、過去にUNC1069と関連付けられていた履歴がある
今回確認されたRATは、初期段階で用いられるRATとして典型的かつ汎用性の高い機能を備えており、以下のコマンドがハードコードされていました。
- 自身の削除
- バイナリのダウンロードおよび実行
- スクリプトやコマンドの実行
- ディレクトリの列挙(指定されていた対象は /home/user/.ssh および /etc/passwd)
これらのRAT機能は特定の攻撃者に限らず、あらゆる攻撃者にとって有用なものです。また、暗号資産のマイニングや認証情報の窃取といった明確な悪意ある機能が含まれていないため、EDRによる検知を受けにくい構成になっています。パッケージの侵害自体は迅速かつ比較的目立たない形で行われましたが、この点だけでは、攻撃者が国家主体であるか、金銭目的の攻撃者であるかを特定するには至りません。メンテナーのアカウントへのアクセスさえ得られれば、同様の攻撃は複数の攻撃者が実行可能です。
DPRK系の攻撃者は、暗号資産関連の開発者を標的としたソフトウェアサプライチェーン攻撃を繰り返し実行してきました。Axiosは暗号資産向けの専用ライブラリではありませんが、利用範囲が非常に広いため、暗号資産関連の開発者コミュニティとも重なる可能性があります。
今回使用されたXORキーには「7」が複数含まれており、中国系攻撃者を示唆する要素とされることもあります。一方で、スター・ウォーズに登場する「Order 66」を想起させる要素も含まれており、これは中国では一般的に知られた作品ではないため、判断を決定づけるものではありません。
今後、npmやGitHubによる侵害されたメンテナーアカウントの操作履歴、あるいはアカウント侵害手法に関するフォレンジック分析を通じて、さらなる帰属情報が明らかになる可能性はあります。ただし、攻撃者を特定できたとしても、本件全体の理解が大きく進むとは限らないと考えられます。
影響を受けているか確認する方法
- lockfileに axios@1.14.1、axios@0.30.4、または plain-crypto-js の記載がないか確認してください。
- いずれかのプロジェクトに node_modules/plain-crypto-js/ が存在する場合、その端末上でドロッパーが実行されています。自己クリーンアップ処理により、内容は無害に見えるスタブに置き換えられています。
- macOSでは /Library/Caches/com.apple.act.mond、Windowsでは %PROGRAMDATA%\wt.exe、Linuxでは /tmp/ld.py にRATの痕跡が残っていないか確認してください。ただし、自己削除により既に消去されている可能性もあります。
- ネットワークログで sfrclak[.]com または 142.11.206.73(ポート8000)への外向き通信がないか確認してください。ファイルの痕跡は消えていても、ネットワークログは残るため、最も信頼性の高い指標となります。
- 3月31日00:21~03:15(UTC)の間に npm install を実行したCI/CDワークフローがないか確認してください。この時間帯に実行されていた場合、注入されたシークレットやデプロイキーにアクセスされていた可能性があります。
影響が疑われる場合の対応
axiosを axios@1.14.0 または axios@0.30.3 にダウングレードし、node_modules/plain-crypto-js を削除したうえで、npm install --ignore-scripts を実行してください。
RATの痕跡が確認された場合は、システム全体が侵害されたものとして扱い、信頼できる初期イメージから再構築してください。
侵害された端末で使用可能だったすべての認証情報(保存されたパスワード、npmやその他のトークン、SSH鍵、クラウドアクセスキー、.envファイル、CI/CDシークレット)をローテーションしてください。
sfrclak[.]com および 142.11.206.73 を、ファイアウォールおよびDNSのレイヤーで遮断してください。
ソフトウェアサプライチェーンの強化策
-
依存関係のバージョンを正確に固定し、lockfileを必ずコミットしてください。キャレット指定は、不正なリリースへの自動解決を許す原因となりました。CI/CDでは npm ci を使用することで、lockfileに基づくインストールを強制できます。
-
自動ビルドでは npm ci --ignore-scripts を使用し、postinstall スクリプトを無効化してください。今回の攻撃は npm の postinstall ライフサイクルフックに全面的に依存しており、多くのパッケージではこのフックは不要です。
-
新規公開パッケージに対しては、一定の最低公開期間を設けることも有効です。たとえば .npmrc に min-release-age=7 を設定することで、公開から7日未満のパッケージの使用を防ぐことができます。AikidoのSafe Chainのようなツールを利用すれば、任意の待機期間を設定したブロックも可能です。今回の plain-crypto-js@4.2.1 は公開から24時間未満であり、48時間の待機期間を設けていれば攻撃を防げた可能性があります。
-
CI/CDランナーからの外向き通信を制御することも重要です。ドロッパーはインストール開始から約1.1秒でC2サーバーへ通信していました。ランナーが外向き通信を無制限に許可している場合、postinstallスクリプトから任意のC2サーバーへ接続される恐れがあります。
繰り返される攻撃の構図
今回のAxios侵害は、過去1年間に発生した主要なnpmサプライチェーン攻撃と同様のパターンに沿っています。メンテナー資格情報の侵害、依存関係マニフェストへのわずかな変更、postinstallフックによる自己削除型ペイロードの実行という流れです。2025年9月には、フィッシングによりChalkとDebugが侵害され、両者で週20億回以上のダウンロードがありました。同じ月には、Shai‑Huludワームがnpm史上初の自己増殖型マルウェアとして確認され、12月には第2世代が約40万件の開発者シークレットを収集しました。
最近、npmはFIDOを用いた二要素認証の義務化、自動化トークンのデフォルト無効化、信頼された公開プロセスの導入といったセキュリティ強化策を発表しています。しかし、現時点ではこれらはまだ開発段階にあります。実装が進むまでは、npmが検知できないリスクを第三者ツールや開発者自身の対策によって補う必要があります。
支援が必要な場合
今回の事案による影響が疑われ、緊急の対応が必要な場合や、次の攻撃に備えてサプライチェーンリスクの状況を評価したい場合は、LRQAが支援できます。
Indicators of Compromise (IOCs)
|
Network |
|
|
C2 domain - hxxp |
//sfrclak[.]com:8000 |
|
C2 IP |
142.11.206.73:8000 |
|
C2 URL |
hxxp:////sfrclak[.]com:8000/6202033 |
|
User-Agent string |
mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0) |
|
Mac C2 payload retrieval POST body |
packages.npm.org/product0 |
|
Windows C2 payload retrieval POST body |
packages.npm.org/product1 |
|
Linux C2 payload retrieval POST body |
packages.npm.org/product2 |
|
Mac Host |
|
|
MacOS temporary file (deleted after use) |
/tmp/6202033 |
|
MacOS RAT binary file |
/Library/Caches/com.apple.act.mond |
|
Injected binaries from RAT activity |
/private/tmp/.[XXXXXX] |
|
Mac RAT SHA256 |
92ff08773995ebc8d55ec4b8e1a225d0d1e51efa4ef88b8849d0071230c9645a |
|
Mac RAT SHA1 |
13ab317c5dcab9af2d1bdb22118b9f09f8a4038e |
|
Mac RAT MD5 |
7a9ddef00f69477b96252ca234fcbeeb |
|
Windows Host |
|
|
Copies powershell.exe to |
%PROGRAMDATA%\wt.exe |
|
VBS wrapper, deleted after use |
%TEMP%\6202033.vbs |
|
Powershell payload, deleted after use |
%TEMP%\6202033.ps1 |
|
Linux Host |
|
|
Linux temporary file |
/tmp/ld.py |
|
NPM Packages |
|
|
axios@1.14.1 shasum |
2553649f232204966871cea80a5d0d6adc700ca |
|
axios@0.30.4 shasum |
d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71 |
|
plain-crypto-js@4.2.1 shasum |
07d889e2dadce6f3910dcbc253317d28ca61c766 |
|
Post compromise activity |
After payload execution, the dropper removes any indication of the malicious code from the package directory by deleting setup.js and package.json, replacing package.json with a legitimate/clean file. |
|
Notable strings |
|
|
XOR key - OrDeR_7077 |
|
|
XOR constant - 333 |
|
|
Campaign id |
6202033 |
|
Plain-crypto-js@4.2.0 publisher |
nrwise@proton.me |
|
Attacker controlled email address used in axios maintainer account hijack |
ifstap@proton.me |
|
Attacker controlled email address used to publish plain-crypto-js |
nrwise@proton.me |
|
Npm audit commands |
|
|
Check for existence of plain-crypto-js |
npm ls plain-crypto-js |
|
Check for existence of plain-crypto-js |
cat package-lock.json | grep -A3 "plain-crypto-js" |
|
Check for existence of malicious axios versions |
grep -E '"axios".*"(1\.14\.1|0\.30\.4)"' package-lock.json |
