いえらぶGROUPの開発部で執行役員を務めています、和田です。わだけんです。
axiosサプライチェーン攻撃に関して、GitHub IssueにPostmortem(事後報告)上がっていましたね。
特に注目したのが、攻撃された流れのところ。「これ、ルパン三世?」。
変装して近づき、信頼を勝ち取り、自然な流れで金庫の鍵を開けさせる。技術的なハッキングじゃなく、人間を騙して、人間に鍵を開けさせた。
これはエンジニアなら読んでおいたほうがいいなと思ったので、Postmortemの内容をセクションごとに紹介します。
事案
2026年3月31日、axiosのリードメンテナーのnpmアカウントが乗っ取られ、悪意のあるバージョンが公開されました。
| 日時 (UTC) | イベント |
|---|---|
| 3月17日頃 | メンテナーへのソーシャルエンジニアリング開始 |
| 3月30日 05:57 | 偽パッケージ plain-crypto-js@4.2.0 がnpmに公開 |
| 3月31日 00:21 |
axios@1.14.1 公開(latestタグ) |
| 3月31日 約01:00 |
axios@0.30.4 公開(legacyタグ) |
| 3月31日 01:38 | 協力者が侵害バージョンを非推奨化、npm連絡 |
| 3月31日 03:15 | 悪意あるバージョンがnpmから削除 |
- 影響バージョン:axios@1.14.1 と axios@0.30.4
- axios本体のコードは一切変更なし。
package.jsonに偽の依存パッケージを1行追加しただけ - その偽パッケージの
postinstallスクリプトがRAT(遠隔操作マルウェア)を展開する仕組み - 検知から削除まで約3時間
3時間で対応できたのはコミュニティの力ですが、逆にいえば3時間は世界中でnpm installが走っていたわけです。
侵入方法
ここがルパン三世だなと思ったところ。
① 2週間かけて仮面をつくる
- 実在する会社の創業者を完全に偽装(顔写真・ロゴ・LinkedIn投稿をコピー)
- 本物そっくりのSlackワークスペースを作成(CI/CDツール名までブランド化)
- ワークスペース内に偽のチームメンバーを配置(他のOSSメンテナーの偽プロフィールまで用意)
メンテナー本人の証言:
they reached out masquerading as the founder of a company they had cloned the companys founders likeness as well as the company itself.
(彼らは、会社の創設者の容姿と会社自体をクローンした会社の創設者になりすまして接触してきた。)
② Microsoft Teamsの偽グループ会議
- 「複数人での議論」としてTeams会議をスケジュール
- 会議中、UIやチャットで攻撃者が「あなたのシステムで何か古いものがある。足りないものをインストールしてくれ」と自然に誘導
- メンテナーは「Teamsの更新か何かだろう」と思って実行
i installed the missing item as i presumed it was something to do with teams, and this was the RAT.(チーム関連の何かだろうと思い、不足していたアイテムをインストールしたところ、これがRATだった。)
③ RAT感染 → npm publish
- RATはクロスプラットフォーム対応(macOS / Windows / Linux)
- 60秒ごとにC2サーバーと通信、完全遠隔操作
- 永続化機能あり、実行後は自己削除で痕跡隠蔽
RATが入った時点で、PC上のすべてが攻撃者のものです。npmアカウントにログインし、ローカルPCから直接npm publishを実行。
Once the RAT is on your machine they have full unilateral control of everything on your machine... Game over.(一度RATがあなたのマシンに侵入すると、マシン上のあらゆるものを完全に一方的に制御できるようになります…ゲームオーバーです。)
なぜ防げなかったか
| 弱点 | 内容 |
|---|---|
| ローカルPCからの直接公開 | 特にv0.x系はCI/CDを経由しない公開が可能だった |
| ソフトウェア2FAの限界 | 2FA有効だったが、RATがTOTPコードを画面から読み取って突破 |
| npmレジストリの設定不足 | OIDC強制やローカルpublishブロックが未設定 |
| 自動検知機構の欠如 | 不正公開の検知はコミュニティ報告頼み |
Postmortemで明言されていたのは:
the only mitigation on Axios's end that could have actually prevented this would have been using hardware FIDO2 keys for maintainer's npm auth, which can't be hijacked by a RAT.(Axios側で実際にこれを防ぐことができた唯一の対策は、メンテナーのnpm認証にハードウェアFIDO2キーを使用することだったでしょう。これはRATによって乗っ取られることはありません。)
ソフトウェアの2FA(TOTPアプリ)では、RATに画面を読まれたら終わりです。ハードウェアキー(YubiKey等)なら物理的に手元にないと認証できないので、RATでは突破できない。唯一防げた可能性があるのはそこだけだったと。
自分たちはどうするか
まず影響確認。以下をプロジェクトルートで叩いてください。
grep -E "axios@(1\.14\.1|0\.30\.4)|plain-crypto-js" package-lock.json yarn.lock 2>/dev/null
ヒットした場合の対応:
-
axios@1.14.0または0.30.3へダウングレード -
node_modules/plain-crypto-js/を削除 - マシン上のシークレット・トークン・認証情報をすべてローテーション
-
sfrclak[.]com/142.11.206.73:8000へのネットワーク接続をログで確認
今後の予防策として挙げられていたもの:
- CIからのリリース(ローカルPCから
npm publishしない) - ハードウェアキー(FIDO2)による2FA
- OIDCベースの公開(長命な認証情報を廃止)
-
npx実行時はロックファイル事前生成 +--offlineオプション
おわりに
「技術的に正しいことをやっていても、人間が騙されたら全部持っていかれる」
2FAも設定していた。パスワードも管理していた。でも、2週間かけて仮面を築かれて、Teamsの会議で「これインストールして」と言われたら、「絶対入れません」って断言できる人がどのくらいいるんだろうか。
そしたらもう、「人間が騙されること」を前提にした仕組みを作るしかない。ローカルPCから直接publishしない。ハードウェアキーを使う。CIを通さないと公開できないようにする。人間の弱さを仕組みでカバーする。
あと、このPostmortemを公開してくれたメンテナーの透明性には敬意を持ちたい。axiosみたいなパッケージを個人の善意で維持してくれている人たちがいて、その人たちが国家レベルのAPTに狙われている(手口がGoogleが報告した北朝鮮系グループと酷似)という現実は、エコシステムに依存している自分たちも知っておくべきだと思います。
まあ、まずは自分のpackage-lock.jsonをgrepするところからですね。
おわり。

