2026年3月31日、JavaScript エコシステムで最も人気のあるHTTPクライアントであるaxiosの悪質なバージョン2つ(週間ダウンロード数1億回以上)がnpmに公開されました。両バージョンはそれらをインストールしたすべてのマシンに、クロスプラットフォーム遠隔アクセストロイの木馬(RAT)をデプロイしました。
これはタイポスクワッティングではありませんでした。これは類似パッケージではありませんでした。これは本物のaxiosパッケージで、侵害されたメンテナアカウントによって公開され、最新の1.xとレガシーな0.xリリースブランチの両方を同時に狙ったものでした。
[email protected]または[email protected]をインストールした場合、あなたのシステムは侵害されていると考えてください。

私たちがどのようにして検出したか
私たちのリスク エンジンであるWingsは、両方のリリースが公開されてから数分以内にそれらにフラグを立てました。シグナルは即座で明確でした。これまでのaxiosリリースに一度も出現したことのない新しいランタイム依存関係、難読化されたスクリプトを実行するpostinstallフック、そしてインストール中に未知の外部ドメインへのアウトバウンドネットワーク接続です。
ポリシー実行が有効なKoiの顧客には、両バージョンが自動的にブロックされました。悪質なパッケージが開発者マシンに到達することはありませんでした。
攻撃:ステップバイステップ
ステップ1 – メンテナアカウントハイジャック
攻撃者はaxiosプロジェクトのプリマリメンテナであるjasonsaaymanのnpmアカウントを侵害しました。このアカウントからのすべての以前のリリースは[email protected]の下で公開されていました – メンテナーの既知の長年のメールアドレスです。悪質なリリースでは、アカウントの登録されたメールアドレスが[email protected]に変更されていました。攻撃者が管理するProtonMailアドレスです。そのメールアドレスの変更だけでアカウント乗っ取りの強力な指標であり、それはWingsが自動的にフラグを立てた最初のシグナルの1つでした。アカウントを制御して、攻撃者はnpm経由で中毒パッケージを手動で公開しました。
すべての正規のaxios 1.xリリースはGitHub ActionsとnpmのOIDC Trusted Publisherメカニズムを使用して公開されます – その公開は検証されたワークフローに暗号学的に結合されています。[email protected]はそのパターン全体を完全に破ります。盗まれたnpmアクセストークンで手動で公開され、OIDCバインディングなし、gitHeadなし、対応するGitHubコミットまたはタグなし。リリースはnpm上にのみ存在します。
これは教科書的な法医学シグナルです。自動化された暗号学的に検証されたパブリッシングから手動のトークンベースのパブリッシングにシフトするパッケージは、常にアラームを引き起こすべきです。
ここが重要な詳細です:悪質なバージョンどちらも、axios自体の内部に悪質なコードが1行も含まれていません。代わりに、両バージョンは新しいランタイム依存関係[email protected]を注入します。このパッケージはaxiosソース内のどこにもインポートされていません。その唯一の目的は、クロスプラットフォームRATドロッパーとして機能するpostinstallスクリプトを実行することです。攻撃者はaxiosのコードを変更しませんでした。彼は依存関係ツリーを武器化しました。
ステップ2 – 悪質な依存関係をステージングする
攻撃者は急いでいませんでした。悪質な依存関係であるplain-crypto-jsは、axiosリリースが出ようとしている完全な1日前にすでにnpm上に置かれていました。
それは個別の使い捨てアカウント(nrwise、[email protected] – 侵害されたメンテナと同じProtonMailパターン)の下で公開されました。最初のバージョン4.2.0は完全にクリーンでした。正当なcrypto-jsライブラリの逐語的なコピーです。フックなし、スクリプトなし、疑わしいものは何もありません。パッケージが過去のバージョンがまったくない場合にセキュリティスキャナーがフラグを立てる可能性が高いため、攻撃者は誰も実際に使用されることのないパッケージの信用を構築するために1日を費やしました。
それから、およそ18時間後、バージョン4.2.1が落ちてきました。同じパッケージ名、同じ作成者ですが、今は実在のペイロードを運んでいます:setup.jsという難読化されたドロッパースクリプトを指すpostinstallフック。
その悪質なバージョンがライブになってから22分以内に、[email protected]はplain-crypto-js@^4.2.1を依存関係として注入されたレジストリにヒットしました – 依存関係リストへの唯一の変更。他のすべての依存関係は以前のクリーンバージョンと同じです。その後39分以内に、[email protected]は同じ注入でレガシーブランチを対象にして従いました。両リリースラインが1時間未満で侵害されました。
ウィンドウは短かった – しかし十分に短くはありませんでした。[email protected]は00:21 UTC公開され、約03:15 UTC引き下ろされました – ライブで2時間53分です。[email protected]は01:00 UTC上がり、同じ時間に下りました – ライブで2時間15分。基礎となるペイロードである[email protected]は、前夜の23:59 UTC公開され、セキュリティホルダースタブと交換されなかった04:26 UTC – 利用可能性の4時間27分まで。週間ダウンロード数が1億回のパッケージでは、それは永遠です。
爆発範囲:ダウンストリームパッケージ
axiosはただ直接インストールされるだけではありません – それはnpmエコシステム内で最も一般的な推移的な依存関係の1つです。何千ものパッケージはHTTP通信のための依存関係としてaxiosをリストしています。これらのパッケージがaxiosバージョンを正確なリリースにピンしない場合、攻撃ウィンドウ中に定期的なnpm installまたはnpm publishは侵害された1.14.1に解決されている可能性があります。
つまり、攻撃表面はaxiosを明示的にインストールした開発者をはるかに超えて拡張します。^1.xまたは~1.14のようなセムバー範囲でaxiosに依存しており、これら3時間の間に公開または再構築するたまたま行ったパッケージは、静かに悪質なバージョンを引き込んだ可能性があります – それを彼ら自身のリリースアーティファクトに焼き込んでいます。
すでに現実にこの例を見つけています。[email protected]と[email protected]の両方が、侵害された[email protected]を彼らの依存関係ツリーに固定して公開されました。彼らのメンテナはaxiosを手動でインストールしませんでした – それは彼らのビルド中に推移的な依存関係として自動的に解決されました。
これはサプライチェーン攻撃の乗数効果です。1つの侵害されたパッケージは数十になり、それら数十は直接axiosに接触しなかった何千ものダウンストリームコンシューマに到達します。
RATドロッパー:技術分析
ペイロードは[email protected]のsetup.jsに存在しており、XOR暗号化、文字列配列エンコーディング、カスタム置換を伴うbase64、およびランタイムのみのデコーディングによって重大に難読化された単一のミニ化されたファイルです。機密文字列 – モジュール名、C2 URL、シェルコマンド、ファイルパス – ソースには表示されません。静的分析ツールと人間レビューアーはノイズ以外は何も見えません。
デコードされると、ドロッパーの目的は単純です:オペレーティングシステムを検出し、sfrclak.com:8000でコマンドアンドコントロールサーバーに接続し、プラットフォーム固有のRATをダウンロードし、実行してすべての証拠を消去します。
プラットフォーム固有のペイロード
ドロッパーはos.platform()をチェックし、3つの攻撃パスの1つに分岐します。各プラットフォームは同じC2 URLに異なるPOSTボディを送信し、サーバーがプラットフォーム対応のペイロードで応答できるようにします:
macOS – ドロッパーはAppleScriptファイルを作成して、RATバイナリを/Library/Caches/com.apple.act.mondにダウンロードします – Appleのリバースシェムダイニングネーミング規約を模倣するように設計されたパス。バイナリは実行可能にされ、/bin/zshを介して起動されます。AppleScriptファイルは実行後に削除されます。C2 POSTボディはpackages.npm.org/product0で、ネットワークログの良性npmレジストリトラフィックのように見えるように意図的に作成されています。
Windows – 3段階の攻撃:PowerShellを探し、%PROGRAMDATA%\wt.exeにコピーします(Windows Terminalとして偽装)、その後-ExecutionPolicy Bypassと-WindowStyle Hiddenを使用してPowerShell RATをダウンロードして実行するVBScriptを実行します。C2 POSTボディはpackages.npm.org/product1です。
Linux – 直接シェルコマンドはPython RATスクリプトを/tmp/ld.pyにダウンロードし、nohupを使用してバックグラウンドで実行します。C2 POSTボディはpackages.npm.org/product2です。
私の環境が影響を受けたかどうかを検出する方法:
- プロジェクト内の悪質なaxiosバージョンを確認します:
grep -A1 '"axios"' package-lock.json | grep -e '1\.14\.1' -e '0\.30\.4'npm list axios 2>/dev/null | grep -e '1\.14\.1' -e '0\.30\.4'
- node_modulesでplain-crypto-jsを確認します:
test -d node_modules/plain-crypto-js 2>/dev/null && ls node_modules/plain-crypto-js && echo "INFECTED"
- 影響を受けたシステムでRAT成果物を確認します:
# Windows
dir "%PROGRAMDATA%\wt.exe"2>nul && echo INFECTED
dir "%TEMP%\6202033.vbs"2>nul && echo INFECTED
dir "%TEMP%\6202033.ps1"2>nul && echo INFECTED
# macOS
ls /Library/Caches/com.apple.act.mond 2>/dev/null && echo "INFECTED"# Linux
ls /tmp/ld.py 2>/dev/null && echo "INFECTED"
- C2インフラストラクチャへの接続:
sfrclak.com
142.11.206.73
- POSTリクエストログは次を含みます:
packages.npm.org/product0
packages.npm.org/product1
packages.npm.org/product2
コミュニティの対応
エコシステム全体のセキュリティチームがこのインシデントに迅速に対応しました。Socketの自動スキャナーはplain-crypto-jsにフラグを立て、StepSecurityはドロッパーの完全な静的およびランタイム分析を実行しました。彼らの公開された調査は、コミュニティが侵害の全範囲を理解するために機能したときに貴重な技術的なコンテキストを提供しました。
最終的な考え
この攻撃は運用上の洗練さの傑作です。18時間のステージングウィンドウ。3つのプラットフォーム固有のRATドロッパー。自己破壊的な証拠。本物のパッケージを公開する侵害されたメンテナアカウント – ルックアリクはなく、タイポスクワットはなく、何百万もの開発者が依存している実際のパッケージ。
そしてそれはライブで3時間未満でした。公開から取り下ろしの間のウィンドウは狭かったですが、週間ダウンロード数が1億回のパッケージでは、数千のシステムに到達するには十分です。
私たちはKoiを構築してこの種の攻撃を正確に捕捉するために。静的分析だけではランタイムで文字列をデコードするpostinstallフックを停止できず、実行後に自身を削除します。あなたはビヘイビアル分析が必要です – パッケージが実行時に実際に何をするかを見守るサンドボックス実行。それがWingsが行うことであり、ほとんどのエコシステムが何かが悪いことを知る前に私たちの顧客が両バージョンをブロックされた理由です。
Fortune 50組織と世界最大級の技術企業の一部によって信頼されているKoiは、npm、PyPI、VS Code拡張機能、Chrome拡張機能以上を含むパッケージエコシステム全体にわたってリアルタイムリスクスコアリングとガバナンスを提供します。
デモを予約して、Koiがどのように従来のセキュリティツールをすり抜ける攻撃をキャッチするかを確認します。
そこの安全を保ちましょう。
IOCs
侵害されたパッケージ
C2インフラストラクチャ
ディスク上のRAT成果物
影響を受けたダウンストリームパッケージ
関連するnpmアカウント
翻訳元: https://www.koi.ai/blog/axios-compromised-a-supply-chain-attack-on-npms-most-popular-http-client