セキュリティ21分で読める

Axiosが北朝鮮ハッカーに乗っ取られた——npm史上最大級のサプライチェーン攻撃

週間ダウンロード数1億回超、JavaScriptエコシステムで最も使われるHTTPクライアントライブラリ「Axios」が、北朝鮮の国家支援ハッカーに乗っ取られた。 2026年3月31日、メンテナーのnpmアカウントが侵害され、悪意あるバージョンが約3時間にわたりnpmレジストリに公開された。この間に12,000以上のプロジェクトがC2(コマンド&コントロール)サーバーへの接触を記録し、数十万件のシークレット(APIキー・認証情報・環境変数)が流出した可能性がある。

Googleはこの攻撃を脅威アクター「UNC1069」に、Microsoftは「Sapphire Sleet」にそれぞれ帰属させている。いずれも北朝鮮の情報機関と関連づけられたグループであり、暗号資産の窃取やソフトウェアサプライチェーンへの攻撃を繰り返してきた実績がある。

npmサプライチェーン攻撃とは何か

npmサプライチェーン攻撃とは、Node.jsのパッケージマネージャーであるnpmのエコシステムを悪用し、正規のライブラリに悪意あるコードを混入させる攻撃手法である。開発者が npm install を実行するだけでマルウェアがインストールされるため、従来のフィッシングやエクスプロイトとは異なり、被害者が何の操作もしなくても感染が成立するのが特徴だ。

今回のAxios攻撃では、以下の3段階で攻撃が実行された。

  1. アカウント侵害: メンテナー@jasonsaayman のnpmアカウントを乗っ取り、正規パッケージの公開権限を奪取
  2. 隠し依存パッケージの挿入: plain-crypto-js@4.2.1 という一見無害なパッケージを依存関係に追加し、その中にRAT(リモートアクセス型トロイの木馬)を仕込む
  3. OS別ペイロード配信: postinstall スクリプトでOSを判定し、macOS・Windows・Linuxそれぞれに最適化されたマルウェアをダウンロード・実行

この図は、npm install から始まり、隠し依存パッケージを経由してOS別のRATが配信され、C2サーバーと通信するまでの攻撃フロー全体を示しています。

Axiosサプライチェーン攻撃フロー — npm installから隠し依存パッケージ経由でOS別RAT配信、C2通信に至る流れ

この手法が特に危険なのは、Axiosのような「誰もが使う」ライブラリを狙っている点だ。Axiosはフロントエンド・バックエンド問わずHTTP通信の標準ライブラリとして採用されており、依存関係のツリーを辿ると数百万のプロジェクトに影響が及ぶ。package-lock.json でバージョンを固定していても、npm installnpm ci ではなく)を使っていた場合は latest タグのバージョンが自動的にインストールされる可能性があった。

攻撃タイムライン——わずか3時間の攻防

今回の攻撃は極めて短時間で実行された。以下に、UTC基準での詳細なタイムラインを示す。

時刻(UTC)イベント
3/30 05:57デコイパッケージ plain-crypto-js@4.2.0 がnpmに公開(無害な内容で信頼性を偽装)
3/30 23:59悪意あるペイロードを含む plain-crypto-js@4.2.1 が公開
3/31 00:05セキュリティ企業Socket社が異常を検出(公開からわずか6分後
3/31 00:21侵害された axios@1.14.1latest タグで公開
3/31 01:00axios@0.30.4legacy タグで公開(v0系ユーザーも標的に)
3/31 03:15-03:29npm運営により悪意あるバージョンがすべて削除完了

注目すべきは2つのポイントだ。第一に、攻撃者は前日に無害な @4.2.0 を先行公開することで、パッケージとしての「実績」を作っていた。npmのセキュリティスキャンは新規パッケージに対して厳しくチェックするが、バージョンアップ(4.2.0 → 4.2.1)であれば監視が緩くなることを攻撃者は理解していたと考えられる。

第二に、Socket社の検出速度だ。悪意あるバージョンの公開からわずか6分でアラートが発せられたことは、近年のサプライチェーン監視ツールの進化を物語っている。しかし、それでもAxiosの公開(00:21)から削除完了(03:29)までの約3時間で12,000以上のプロジェクトが影響を受けたことは、npmエコシステムのダウンロード規模の巨大さを改めて示している。

WAVESHAPER.V2 RAT の技術的詳細

今回仕込まれたマルウェア「WAVESHAPER.V2」は、OS別に異なる実装を持つクロスプラットフォームRATである。各OS向けの実装は言語もバイナリ形式も異なり、検出を困難にするために最大限の偽装が施されている。

この図は、macOS・Windows・Linuxの3つのOSにおけるWAVESHAPER.V2 RATの実装言語、配置パス、永続化方法、偽装手法を比較したものです。

WAVESHAPER.V2 RAT OS別動作比較 — macOS/Windows/Linuxそれぞれの実装言語・配置パス・永続化・偽装手法

macOS版

macOS向けのペイロードはC++で記述されたMach-Oバイナリとして配信される。配置先は /Library/Caches/com.apple.act.mond で、Appleの正規デーモンプロセスに偽装したファイル名が使われている。macOSユーザーがActivity Monitorでプロセス一覧を確認しても、一見するとシステムプロセスと区別がつかない。

永続化にはLaunchDaemonのplistファイルを利用し、システム起動時に自動で実行されるよう設定する。/Library/LaunchDaemons/com.apple.act.mond.plist として登録されるため、管理者権限がなければ検出・削除が困難だ。

Windows版

Windows向けはPowerShellスクリプトとして初期実行され、%PROGRAMDATA%\wt.exe にバイナリをドロップする。ファイル名の wt.exe はWindows Terminal(wt.exe)と同名であり、タスクマネージャーで見ても正規のWindows Terminalプロセスと混同しやすい。

永続化にはレジストリの Run キーを使用する。具体的には HKCU\Software\Microsoft\Windows\CurrentVersion\Run にエントリを追加し、ユーザーログイン時に自動起動する仕組みだ。この手法はWindowsマルウェアとしては古典的だが、プロセス名の偽装と組み合わせることで検出率を下げている。

Linux版

Linux向けはPythonスクリプト(/tmp/ld.py)として配信される。ファイル名の ld はGNUリンカー(ld)を連想させるもので、開発環境に詳しいLinuxユーザーでも見過ごす可能性がある。/tmp ディレクトリに配置されるため再起動で消えるが、crontabに定期実行エントリを登録することで永続化を確保する。

共通のC2通信

3つのOS版すべてが同一のC2サーバー sfrclak[.]com:8000 と通信する。60秒間隔でビーコン(接続確認信号)を送信し、以下の情報を窃取・送信する。

  • 環境変数: AWS_ACCESS_KEY_IDGITHUB_TOKENDATABASE_URL など
  • SSHキー: ~/.ssh/ 配下の秘密鍵
  • ブラウザ認証情報: Chromeのクッキー・保存パスワード
  • クラウド認証情報: AWS CLI、GCP、Azure CLIの設定ファイル

さらにC2サーバーからの追加コマンドにより、スクリーンショットの取得、任意のファイルのアップロード、追加マルウェアのダウンロードも可能だ。

過去のnpmサプライチェーン攻撃との比較

今回のAxios攻撃は、npmエコシステムを狙ったサプライチェーン攻撃の中でも最大級の規模だ。過去の主要な事例と比較すると、その影響範囲の大きさがわかる。

事件名時期対象パッケージ週間DL数影響範囲攻撃者
Axios攻撃(今回)2026年3月axios1億超12,000+プロジェクト北朝鮮(UNC1069/Sapphire Sleet)
event-stream事件2018年11月event-stream200万Copayウォレット個人
ua-parser-js事件2021年10月ua-parser-js800万暗号通貨マイナー混入不明
colors/faker事件2022年1月colors, faker2,000万無限ループ(抗議行動)メンテナー自身
Glassworm攻撃2026年3月150+リポジトリ不明Unicode不可視文字悪用不明

Axiosは週間ダウンロード数が桁違いに大きく、かつ悪意あるバージョンが latest タグで公開されたため、CI/CDパイプラインで自動的にインストールされたケースも多いと推測される。event-stream 事件が単一のウォレットアプリを標的にしたのに対し、今回は無差別攻撃であった点も深刻だ。

影響を受けたかどうかの確認方法

自分のプロジェクトが影響を受けたかどうかを確認するための手順を以下に示す。

1. インストール済みバージョンの確認

# package-lock.jsonを確認
grep -A 5 '"axios"' package-lock.json

# node_modules内の実際のバージョンを確認
cat node_modules/axios/package.json | grep version

# 悪意ある依存パッケージの存在確認
ls node_modules/plain-crypto-js 2>/dev/null && echo "影響あり!" || echo "影響なし"

影響を受けるバージョンは axios@1.14.1axios@0.30.4 のみ。axios@1.14.0 以前は安全だ。

2. ネットワークログの確認

C2サーバーへの通信があったかを確認する。

# DNS解決ログで確認(macOS)
log show --predicate 'process == "mDNSResponder"' --last 7d | grep "sfrclak"

# ファイアウォールログで確認(Linux)
grep "sfrclak" /var/log/syslog /var/log/messages 2>/dev/null

3. マルウェアファイルの存在確認

# macOS
ls -la /Library/Caches/com.apple.act.mond 2>/dev/null

# Windows(PowerShellで実行)
Test-Path "$env:PROGRAMDATA\wt.exe"

# Linux
ls -la /tmp/ld.py 2>/dev/null
crontab -l | grep "ld.py"

4. 即時対策

影響を受けた場合は、以下を即座に実行する。

# 安全なバージョンにダウングレード
npm install axios@1.14.0

# lockfileを使った厳密なインストール(今後のデフォルトに)
npm ci

# postinstallスクリプトを無効化して再インストール
npm install --ignore-scripts

加えて、環境変数に設定していた**すべてのシークレットをローテーション(再発行)**すべきだ。AWSキー、GitHubトークン、データベース接続文字列、SSHキーなど、マシン上に存在したすべての認証情報が漏洩した前提で対応する必要がある。

npm全体のセキュリティ対策

今回の事件を受けて、npmエコシステム全体で見直すべきセキュリティ対策を整理する。

npm cinpm install の違い

多くの開発者が npm install を使っているが、CI/CD環境やデプロイ時には npm ci を使うべきだ。

項目npm installnpm ci
lockfileの扱いlockfileを更新するlockfileに厳密に従う
latest タグの影響受ける場合がある受けない
node_modules差分更新完全に削除してから再インストール
速度やや遅い高速
推奨シーン開発時CI/CD、デプロイ時

npm cipackage-lock.json に記録されたバージョンを厳密にインストールするため、仮に latest タグが汚染されていても影響を受けない。今回のような攻撃への最も基本的な防御策だ。

npmアカウントの保護

メンテナーのアカウント侵害が今回の攻撃の起点となった。npmでは2023年から全パッケージ公開者に2要素認証(2FA)が義務化されているが、TOTPベースの2FAはフィッシング耐性が低い。ハードウェアセキュリティキー(YubiKeyなど)やパスキーの導入が推奨される。

1Passwordのようなパスワードマネージャーを使えば、npmアカウントの認証情報管理に加え、TOTPコードの管理やパスキーへの対応も一元化できる。開発チーム全体でのセキュリティポリシー統一にも有効だ。

サプライチェーン監視ツールの導入

Socket社が今回の攻撃をわずか6分で検出できたのは、npmパッケージの挙動を継続的に監視するツールを運用していたためだ。開発チームレベルでも、以下のようなツールを導入することでリスクを低減できる。

  • Socket: パッケージの挙動変化をリアルタイム監視
  • Snyk: 既知の脆弱性データベースとの照合
  • npm audit: npm標準の脆弱性チェック
  • Dependabot(GitHub標準): 依存パッケージの自動アップデートPR生成

GitHub Copilotを含むGitHub Enterpriseプランでは、Dependabotに加えてSecret Scanningが利用でき、リポジトリ内のシークレット漏洩も自動検出できる。今回のようなサプライチェーン攻撃でシークレットが窃取された場合も、早期発見と対応が可能だ。

北朝鮮によるサイバー攻撃の背景

今回の攻撃を実行したとされるUNC1069(Google命名)/ Sapphire Sleet(Microsoft命名)は、北朝鮮の偵察総局(RGB)傘下のサイバー部隊と関連づけられている。北朝鮮は国連安保理決議による経済制裁の影響で外貨獲得が困難であり、サイバー攻撃による暗号資産の窃取や、IT労働者の偽装就労が主要な外貨獲得手段となっている。

2023年だけで北朝鮮のサイバー攻撃による暗号資産の窃取額は約6億ドルに達したとされ、2024年以降はソフトウェアサプライチェーンへの攻撃が急増している。npmやPyPI(Python)のパッケージレジストリを標的にするケースが増えており、今回のAxios攻撃はその延長線上にある。

攻撃者が「plain-crypto-js」という名前を選んだのも偶然ではない。JavaScriptの暗号化ライブラリ「crypto-js」(週間DL数600万超)に似せた名前で、開発者が依存関係一覧を見ても違和感を抱きにくい。このような「タイポスクワッティング」に近い命名戦略は、北朝鮮グループの過去の攻撃でも頻繁に確認されている。

日本への影響と対策

日本の開発現場への直接的影響

Axiosは日本でも極めて広く使われているHTTPクライアントライブラリだ。React・Vue.js・Next.jsなどのフロントエンドフレームワークと組み合わせて使用されるケースが多く、日本国内の商用Webアプリケーションの大半が直接的または間接的にAxiosに依存していると考えられる。

今回の攻撃は日本時間で3月31日の午前9時頃(UTC 00:00)に発生しており、ちょうど年度末の最終営業日にあたる。多くの日本企業でデプロイ作業やシステム更新が行われるタイミングであり、CI/CDパイプラインが自動的に npm install を実行して悪意あるバージョンをインストールした可能性がある。

加えて、3月末は人事異動や退職に伴うシステム引き継ぎのタイミングでもあり、セキュリティ監視の体制が手薄になりがちだ。攻撃者がこのタイミングを意図的に選んだかどうかは不明だが、結果として日本企業への影響が大きくなった可能性は否定できない。

日本企業がとるべき対策

日本では2024年に経済産業省が「ソフトウェア管理に向けたSBOM(Software Bill of Materials)の導入に関する手引」を公開しており、ソフトウェアサプライチェーンの可視化が政策レベルで推進されている。今回の事件は、SBOMの重要性を改めて裏づけるものだ。

具体的には以下の対策が推奨される。

  • SBOM(ソフトウェア部品表)の導入: 依存パッケージの一覧を機械可読形式で管理し、脆弱性が発見された際に影響範囲を即座に特定できるようにする
  • npm ci の標準化: CI/CDパイプラインでは npm install ではなく npm ci をデフォルトに設定する
  • 依存パッケージの監査自動化: npm audit をCIに組み込み、脆弱性が検出されたらビルドを停止する
  • シークレット管理の徹底: 環境変数に直接APIキーを設定するのではなく、HashiCorp VaultやAWS Secrets Managerなどのシークレット管理ツールを使用する

まとめ——開発者が今すぐやるべき3つのこと

今回のAxiosサプライチェーン攻撃は、npmエコシステムの規模と速度がいかに諸刃の剣であるかを改めて示した。週間1億ダウンロードのライブラリが乗っ取られれば、わずか3時間で12,000以上のプロジェクトに影響が及ぶ。

開発者が今すぐ実行すべき具体的なアクションステップは以下の通りだ。

  1. 影響確認とシークレットローテーション: axios@1.14.1 または axios@0.30.4 がインストールされていないか確認する。該当する場合は即座に axios@1.14.0 にダウングレードし、マシン上のすべてのシークレット(APIキー、SSHキー、データベース接続情報)を再発行する

  2. npm ci への移行と postinstall の制御: CI/CDパイプラインでは npm installnpm ci に置き換える。また、.npmrcignore-scripts=true を設定し、信頼できるパッケージのみ postinstall スクリプトの実行を許可する

  3. サプライチェーン監視ツールの導入: Socket、Snyk、Dependabotなどのツールを導入し、依存パッケージの挙動変化をリアルタイムで監視する。npmアカウントにはハードウェアセキュリティキーでの2FAを設定し、1Passwordなどのパスワードマネージャーで認証情報を一元管理する

オープンソースの恩恵を受けながら開発を続けるために、「信頼するが検証する」(Trust but Verify)の姿勢がこれまで以上に求められている。依存パッケージは便利だが、その一つひとつが攻撃ベクトルになり得ることを忘れてはならない。

この記事をシェア