2026年3月31日、JavaScriptの定番HTTPクライアント「axios」のnpm配布が短時間ながら侵害され、インストールした環境へクロスプラットフォームのRAT(遠隔操作型マルウェア)が配布されるサプライチェーン攻撃が発生しました。Google脅威情報グループ(GTIG)は本攻撃を北朝鮮系アクターUNC1069に帰属させています。本記事では「侵害された日(いつ起きたのか)」を起点に、何が起きたのか、攻撃の技術的詳細、影響範囲、確認方法、そして再発防止の実務までを整理します。 最終更新:2026年4月1日(帰属情報・IOC・技術分析の追加) axiosは週間1億ダウンロード、クラウド・コード環境の約80%に存在するライブラリです。直接 そのaxiosが、2026年3月31日に侵害されました。 北朝鮮系アクターUNC1069がnpmメンテナ「jasonsaayman」のアカウントを乗っ取り、axios@1.14.1(00:21 UTC)とaxios@0.30.4(01:00 UTC)を公開。日本時間では3月31日の午前9時〜12時半頃――ちょうど業務時間のど真ん中です。悪性バージョンは約3時間で削除されましたが、その間にCIが回っていたら、 「もう消えたから大丈夫」ではありません。マルウェアは実行後に自分自身を削除し、 この記事では、何が起きたのか、自分が影響を受けたかの確認方法、そして今すぐ取るべき対応までを整理します。まず下記のコマンドを1つ叩いてみてください。axiosが侵害された日:npmサプライチェーン攻撃の全貌
結論:あなたのプロジェクトは安全ですか?
npm install axiosを打った覚えがなくても、あなたのプロジェクトの依存ツリーにはほぼ確実にaxiosが含まれています。npm installを叩いていたら、もうアウトです。package.jsonをクリーンなファイルに差し替えます。事後にnode_modulesを調べても、npm auditを走らせても、痕跡は見つかりません。Wizの調査では、影響環境の約3%で悪性バージョンの実行が確認されています。あなたの環境が残り97%に入っているかどうか、確認しない限り分かりません。
npm ls plain-crypto-js --all 2>/dev/null && echo "⚠ 影響の可能性あり" || echo "✓ この依存は見つかりません"
何が起きたか
攻撃の要点
- 攻撃者がaxiosの主要メンテナ「jasonsaayman」のnpmアカウント(および恐らくGitHubアカウント)を侵害。長期間有効なクラシックnpmアクセストークンが悪用されたと推定されている
- アカウントの登録メールアドレスが攻撃者管理下のProtonMailアドレス(
ifstap@proton.me)に変更された - 悪性バージョンはaxios本体のソースコードを改変せず、package.jsonに新規の依存パッケージ(
plain-crypto-js@4.2.1)を1行追加してマルウェアを実行する手法を採った - インストール時に走るpostinstallスクリプト経由でRATを配布し、Windows/macOS/Linuxすべてを標的とした
- 悪性バージョンはGitHubの公式タグやリリースには存在せず、CI/CDパイプラインとSLSA来歴証明をバイパスして直接npmに公開された
侵害されたバージョン
侵害バージョンは axios@1.14.1(latestタグ)と axios@0.30.4(legacyタグ)です。安全なバージョンは1.14.0または0.30.3以前です。
セキュリティアドバイザリ追跡番号:GHSA-fw8c-xr5c-95f9、MAL-2026-2306
攻撃者の帰属
Google脅威情報グループ(GTIG)は、本攻撃を北朝鮮系の金銭目的アクターUNC1069に帰属させました。UNC1069は2018年から活動が確認されており、暗号通貨取引所やソフトウェア開発者、金融機関を標的としてきたグループです。帰属の根拠として、macOS向けに配布されたバイナリがUNC1069が過去に使用したWAVESHAPERバックドアの進化版(WAVESHAPER.V2)と技術的に重複していること、C2インフラストラクチャに同グループが以前使用したAstrillVPNノードとの接続が確認されたことが挙げられています。また、macOS向けRATの内部プロジェクト名「macWebT」は、北朝鮮系グループBlueNoroffのRustBucketキャンペーンで使用された「webT」モジュールとの直接的な関連が指摘されています。
GTIGの主席アナリスト、John Hultquist氏は「本インシデントの全容はまだ不明だが、侵害されたパッケージの人気を考えると、広範囲に影響を及ぼすだろう」と述べています。
関連する悪性パッケージ
Socketの分析により、axiosの侵害バージョンを経由して同一マルウェアを配布する追加パッケージが発見されています。
- @shadanai/openclaw(複数バージョン):悪性の
plain-crypto-jsペイロードを直接内包 - @qqbrowser/openclaw-qbot@0.0.130:改竄済みの
axios@1.14.1をnode_modules内に同梱し、推移的依存としてplain-crypto-jsを実行
いつ侵害されたか:詳細タイムライン
| 日時(UTC) | イベント |
|---|---|
| 2026-03-27 19:01 | 正規のaxios@1.14.0がGitHub Actions OIDC経由で公開 |
| 2026-03-30 05:57 | 攻撃者がplain-crypto-js@4.2.0を公開(クリーンなデコイ版。レジストリ履歴を構築する目的) |
| 2026-03-30 〜 | plain-crypto-js@4.2.1(悪性版)を公開。「brand-new package」アラームを回避するための事前仕込み |
| 2026-03-31 00:21 | 侵害したjasonsaayman アカウントでaxios@1.14.1(latestタグ)を直接公開 → 侵害開始 |
| 2026-03-31 01:00 | axios@0.30.4(legacyタグ)を公開。1.x系と0.x系の両ブランチを同時に汚染 |
| 2026-03-31 〜03:29 | 悪性バージョンがnpmレジストリから削除 → 侵害ウィンドウ終了 |
攻撃は約18時間前から準備されており、悪性依存を事前にnpmへ公開してセキュリティスキャナの「新規パッケージ」警告を回避する周到な仕込みが行われました。日本時間(JST = UTC+9)では3月31日 09:21〜12:29頃に相当し、国内の午前中のCI/ビルドが該当する可能性があります。社内のビルド履歴はUTC基準で突合するのが安全です。
攻撃の技術的詳細
攻撃チェーンの流れ
npm install → plain-crypto-js@4.2.1が依存解決で取得 → postinstallフックによりsetup.jsが実行 → OS判定 → C2サーバ(sfrclak[.]com:8000)からOS別の第2段階ペイロードをダウンロード → RAT実行 → setup.jsを自己削除しpackage.jsonをクリーンなデコイに差し替え。OpenSourceMalwareの分析によれば、インストールから完全な侵害まで約15秒とされています。
難読化手法
ドロッパー(setup.js)は静的解析を回避するため2層の難読化を使用しています。まずBase64のパディング文字をアンダースコアに置換した上で文字列を反転させ、次に鍵文字列OrDeR_7077と定数333を用いたXOR暗号で復号する仕組みです。
OS別のRAT挙動
| OS | 第2段階ペイロード | 永続化パス | 特徴 |
|---|---|---|---|
| macOS | C++製ネイティブバイナリ(Mach-O) WAVESHAPER.V2 |
/Library/Caches/com.apple.act.mond(Appleシステムデーモンに偽装) |
AppleScript経由でダウンロード・実行。RustBucketキャンペーンの「webT」モジュールとの技術的重複 |
| Windows | PowerShell RAT | %PROGRAMDATA%\wt.exe(コピーされたPowerShellバイナリ)一時ファイル: %TEMP%\6202033.vbs / .ps1 |
任意のDLLをメモリ内で実行可能。cscript経由でVBSを起動 |
| Linux | Python RAT(/tmp/ld.py) |
/tmp/.<ランダム>(ドットプレフィックスで隠しファイル化) |
明示的な永続化メカニズムなし(再起動で消滅)。nohupでPID 1に孤立化 |
3つのRAT変種はすべて同一のC2プロトコル・コマンドセット・ビーコン間隔(60秒ごと)を共有しており、共通機能としてリモートシェル実行、バイナリインジェクション、ディレクトリ列挙、プロセス一覧取得、システム偵察を備えています。Elasticの分析では、3変種すべてにIE8/Windows XPのUser-Agent文字列がハードコードされている点が検知の有力な指標として指摘されています。
自己削除による痕跡消去
RATの実行後、ドロッパーはsetup.jsを削除し、元のpackage.jsonを事前に用意されたクリーンなpackage.mdで置き換えます。そのため、事後にnode_modules/plain-crypto-js/を調査しても完全にクリーンなマニフェストが表示され、npm auditでも検出できません。ただし、plain-crypto-jsディレクトリ自体が存在することが侵害の証拠となります(正規のaxiosはこの依存を持ちません)。
IOC(侵害指標)
ネットワーク指標
| 種別 | 値 | 備考 |
|---|---|---|
| C2ドメイン | sfrclak[.]com |
ポート8000。Express.jsサーバ。GETは500を返し、POSTのみ応答 |
| C2 IPアドレス | 142.11.206.73 |
過去にUNC1069が使用したASNと重複 |
| C2ビーコン | 60秒間隔のHTTP POST | ボディにpackages.npm.org/product{0,1,2}(0=macOS, 1=Windows, 2=Linux)を含む |
| User-Agent | IE8/Windows XPの文字列 | 全OS変種で共通。モダンネットワークでは即座に異常として検出可能 |
パッケージ指標
| パッケージ | SHA256 |
|---|---|
axios@1.14.1 |
5bb67e88846096f1f8d42a0f0350c9c46260591567612ff9af46f98d1b7571cd |
axios@0.30.4 |
59336a964f110c25c112bcc5adca7090296b54ab33fa95c0744b94f8a0d80c0f |
plain-crypto-js@4.2.1 |
悪性postinstallフック含む |
ファイルシステム指標
| OS | 確認すべきパス |
|---|---|
| macOS | /Library/Caches/com.apple.act.mond |
| Linux | /tmp/ld.py、/tmp/.<ランダム>(ドットプレフィックス付き隠しファイル) |
| Windows | %PROGRAMDATA%\wt、%TEMP%\6202033.vbs / 6202033.ps1(実行中のみ一時的に存在) |
プロセス指標
- macOS:
$TMPDIRからのosascript実行 - Windows:
%TEMP%の.vbsをcscriptで実行 - Linux:バックグラウンドで
python3 /tmp/ld.pyが実行
アカウント指標
- 侵害されたnpmアカウント:
jasonsaayman(メール変更先:ifstap@proton.me) - 悪性パッケージの公開者:
nrwise(メール:nrwise@proton.me)
影響範囲
影響を受けうる条件
- 2026年3月31日 00:21〜03:29 UTC(JST 09:21〜12:29頃)のウィンドウ中に
npm install/npm ci/yarn/pnpm/bun等で依存解決が走った - 直接依存としてaxiosを入れていなくても、間接依存で取り込まれる(例:CLIツール、SDK、ビルドツールなど)。Mandiant CTOのCharles Carmakal氏は「axiosに依存する他の人気パッケージにも影響が広がる」と指摘
- CI/CD、Dockerビルド、キャッシュ更新(lockfile更新)など自動処理が該当時間に走った
- IDE拡張機能にも注意:例えばVSCodeのNX Console拡張は、プロジェクトを開いた際にlockfileの指定バージョンに関係なく最新版をレジストリから取得する場合がある
- caret範囲指定(
^1.14.0や^0.30.0)を使用していた場合、自動的に侵害バージョンへアップグレードされる
影響の規模感
- axiosの週間ダウンロード数は約1億回。月間では約4億ダウンロード
- Wizの調査では、クラウド・コード環境の約80%にaxiosが存在
- 侵害ウィンドウが短かったにもかかわらず、影響環境の約3%で悪性バージョンの実行が観測された
典型的な事故パターン
| パターン | 起きること | 見落としポイント |
|---|---|---|
| CIでの自動ビルド | 悪性依存を含むイメージが生成される | lockfileを直しても「稼働中のイメージ」は残る |
| 開発端末での更新 | postinstall等で端末上にRATが落ちる | ドロッパーが自己削除するためnode_modulesの目視検査では検出不可 |
| 範囲指定(^や~) | 意図せず悪性パッチ版に追従 | 「勝手に上がる」設計が攻撃と相性が悪い |
| キャッシュ・プロキシレジストリ | 悪性バージョンがローカルキャッシュやArtifactory等に残存 | npmレジストリから削除されてもキャッシュ経由で再感染 |
| IDE拡張機能 | プロジェクト読み込み時に自動でパッケージ取得 | lockfileのバージョン指定と無関係にlatestを取得する場合がある |
確認方法
まずはlockfile確認
最初に見るべきは、リポジトリ内の package-lock.json / yarn.lock / pnpm-lock.yaml です。侵害バージョンが記録されていれば、その時点で「影響を受けた可能性」が高いと判断できます。
# 影響バージョンや不審依存の文字列があるかを確認
# (Linux/macOS)
rg -n "axios@1\.14\.1|axios@0\.30\.4|plain-crypto-js" package-lock.json yarn.lock pnpm-lock.yaml || true
# npmの依存ツリーから確認
npm ls axios --all
npm ls plain-crypto-js --all
# plain-crypto-jsディレクトリの存在確認(存在自体が侵害の証拠)
ls -la node_modules/plain-crypto-js/ 2>/dev/nullSHA256ハッシュでの照合
# npmキャッシュ内のtarballを確認
find ~/.npm/_cacache -name "*.tgz" -exec sha256sum {} \; | \
grep -E "5bb67e88846096f1f8d42a0f0350c9c46260591567612ff9af46f98d1b7571cd|59336a964f110c25c112bcc5adca7090296b54ab33fa95c0744b94f8a0d80c0f"CIビルド時刻の突合
侵害ウィンドウ(00:21〜03:29 UTC)にビルドが走っていないか、GitHub ActionsやCIのログ、コンテナレジストリの作成時刻、SBOM生成ログなどを突合します。
ネットワーク・プロセス調査
# C2通信の確認
# macOS/Linux
lsof -i -nP | grep sfrclak
lsof -i -nP | grep "142.11.206.73"
# Windows (PowerShell)
netstat -ano | findstr "142.11.206.73"
# RAT残存ファイルの確認
# macOS
ls -la /Library/Caches/com.apple.act.mond
# Linux
ls -la /tmp/ld.py
ls -la /tmp/.* # ドットプレフィックス付き隠しファイル
# Windows (PowerShell)
Test-Path "$env:PROGRAMDATA\wt"キャッシュ・プライベートレジストリの確認
npmレジストリからは悪性バージョンが削除済みですが、ローカルキャッシュやプライベートレジストリ(JFrog Artifactory、Sonatype Nexus、Verdaccio、AWS CodeArtifact、GitHub Packages等)に残存している可能性があります。
# ローカルキャッシュのクリア
npm cache clean --force
yarn cache clean
pnpm store prune
「現時点で依存ツリーがクリーン」でも安心しないでください。ドロッパーは実行後に自己削除し、package.jsonをクリーンなデコイに差し替えます。事後のnpm auditやnode_modulesの目視では侵害を検出できません。EDR/監査ログ/プロセス実行履歴/ネットワークログでの調査が必要です。
取るべき対応
緊急対応チェック
- 影響判定:侵害バージョン(axios@1.14.1 / 0.30.4)またはplain-crypto-jsがインストールされた環境を特定。該当した場合、そのシステムは完全に侵害されたと仮定して対応する
- 隔離:侵害バージョンを含むビルド成果物(コンテナ/アーティファクト)および該当端末をネットワークから隔離
- 認証情報の全ローテーション:環境変数、APIキー、トークン、SSH鍵、クラウド鍵、npmトークン、CIシークレットなどすべて。RATは認証情報・SSH鍵・クラウドトークンの窃取を行う
- C2通信のブロック:
sfrclak[.]comおよび142.11.206.73への外向き通信をファイアウォール等で遮断 - 環境の再構築:侵害されたシステムのクリーンアップではなく、既知のクリーンなスナップショットまたはベースイメージからの再構築を推奨
- lockfileの修正:axiosを安全なバージョン(1.14.0 または 0.30.3)に固定し、overrides/resolutionsブロックを追加
- キャッシュの完全クリア:npm/yarn/pnpmのローカルキャッシュ、CIキャッシュ(侵害ウィンドウ中に作成されたnode_modulesキャッシュキー)、プライベートレジストリのキャッシュ、該当期間にビルドされたDockerイメージ
- 再現ビルド:
npm ci --ignore-scriptsでクリーンインストールし、依存ツリーにplain-crypto-jsが含まれないことを確認。SBOM再生成 - 横展開の調査:EDR/監査ログで不審な外部通信・プロセス実行・ビーコン挙動を確認
依存の固定例
{
"dependencies": {
"axios": "1.14.0"
},
"overrides": {
"axios": "1.14.0"
}
}
ポイントは「^」や「~」を外し、意図しないパッチ追従を避けることです。運用上は、Dependabot等で更新を可視化し、レビュー付きで上げる流れが現実的です。また、plain-crypto-jsをパッケージマネージャやセキュリティツールのブロックリストに追加することを推奨します。
再発防止の要点
技術的ガードレール
- lockfileの必須化:CIでは原則
npm ciを使用し、lockfileとの整合性を強制する - インストールスクリプトの制御:ビルド環境で
--ignore-scriptsの使用を検討。本攻撃はpostinstallフックに完全に依存しており、スクリプト無効化で遮断できた - SCA(依存関係スキャン)とSBOMの継続運用
- リリース直後のパッケージ遅延取り込み:pnpmの
minimum release ageやStepSecurityのcooldown windowなど、新規公開パッケージの即時インストールを抑制する設定 - 来歴(provenance)検証:SLSA来歴証明の有無をチェックし、CLIからの直接公開と正規のCI/CD経由の公開を区別する
- ネットワーク監視:ビルド環境からの不審な外向き通信(予期しないドメイン・ポート)を検知するランタイム監視
- セキュリティツール:npq(インストール前のセキュリティ・ヘルスチェック)、Snyk、Socket等の導入を検討
運用・組織の要点
- 「侵害ウィンドウにビルドした成果物」を追跡できるよう、ビルドメタデータ(タイムスタンプ・依存ハッシュ)を保存する
- 重要依存(広く使われるライブラリ)は、更新ルールと例外手順を定義する
- メンテナのアカウント侵害を前提に、影響を局所化する設計(ネットワーク分離、最小権限、シークレット短命化)を採用する
- npmアクセストークンの管理を見直す。長期間有効なクラシックトークンではなく、短命トークンやOIDCベースのtrusted publishingへの移行を検討する
エンドユーザーへの注記
axiosを組み込んだWebアプリやモバイルアプリの利用者には直接的なリスクはありません。感染経路はインストール・ビルド工程であり、アプリ実行時ではありません。影響を受けるのはaxiosを依存として使用する開発者・ビルド環境・CI/CDパイプラインです。
背景:npm供給網攻撃の潮流
本攻撃はnpmエコシステムに対するサプライチェーン攻撃の中でも特筆すべき事例です。StepSecurityは「トップ10 npmパッケージに対する、最も作戦的に洗練されたサプライチェーン攻撃」と評しています。
注目すべきは、本件の数日前にも別のアクター(TeamPCP / UNC6780)がAqua Trivyセキュリティスキャナ、CheckMarxのVSCode拡張、LiteLLM、TelnyxのPyPIパッケージを侵害する連鎖的なサプライチェーン攻撃を実行していたことです。GTIGはaxiosの攻撃をTeamPCPとは無関係の独立した事案としていますが、Mandiant CTOのCarmakal氏は「ここ2週間の一連のサプライチェーン攻撃で窃取された秘密情報は、今後数日〜数ヶ月にわたってさらなるサプライチェーン攻撃、SaaS環境の侵害、ランサムウェア・恐喝、暗号資産窃取を可能にする」と警告しています。
まとめ
- axiosが侵害された日は2026年3月31日(00:21〜03:29 UTC)で、侵害バージョンはaxios@1.14.1とaxios@0.30.4
- 攻撃はGoogleにより北朝鮮系アクターUNC1069(BlueNoroff関連)に帰属。過去のWAVESHAPERバックドアの進化版が使用された
- 侵害ウィンドウ中にインストール/ビルドが走った環境は、完全に侵害されたと仮定して対応する
- ドロッパーは自己削除するため事後の
npm auditや目視では検出不可。ネットワークログ・EDR・IOCベースの調査が必要 - 対応は「隔離→認証情報全ローテーション→C2ブロック→環境再構築→キャッシュクリア→lockfile修正」をセットで実施
- 再発防止には「依存固定」「
--ignore-scripts」「リリース直後の遅延取り込み」「来歴検証」「ランタイム監視」「短命トークン」が効く
参考リンク
- Google Cloud Blog: North Korea-Nexus Threat Actor Compromises Widely Used Axios NPM Package
- Datadog Security Labs: Compromised axios npm package delivers cross-platform RAT
- Elastic Security Labs: Inside the Axios supply chain compromise
- StepSecurity: axios Compromised on npm
- Snyk: Axios npm Package Compromised
- Socket: Supply Chain Attack on Axios
- Wiz: Axios NPM Distribution Compromised
- SafeDep: axios Compromised – npm Supply Chain Attack via Dependency Injection
- Semgrep: Axios Supply Chain Incident – Indicators of Compromise
- Huntress: Supply Chain Compromise of axios npm Package
- Malwarebytes: Axios supply chain attack chops away at npm trust
- GitHub Issue: axios@1.14.1/0.30.4 – axios/axios#10604
- GitHub Security Advisories: axios/axios