コンテンツへスキップ
Guide

Axios がバックドア化: 5 つの npm パッケージを HTTP API に置き換える

| 9 min read

北朝鮮に関連する攻撃者が、axios 1.14.1 内で RAT を毎週 7,000 万のインストーラーに出荷しました。 5 つの単一目的の npm パッケージは、今すぐ削除して HTTP API 呼び出しに置き換えることができます。

Server room with network cables representing supply chain infrastructure
Photo by Taylor Vick on Unsplash

2026 年 3 月 31 日、北朝鮮に関連するオペレーターが 2 つのバックドア バージョンを公開しました。 axios npmに。 バージョン 1.14.1 および 0.30.4 には、という名前のポストインストール依存関係が同梱されています。 plain-crypto-js プラットフォーム固有の RAT インプラントを sfrclak[.]com:8000。 パッケージは 3 時間ライブでした。 アクシオスが7000万を獲得 毎週のダウンロード。 計算してみましょう。

実行されたすべての CI ジョブ npm install その期間中にペイロードがビルドに組み込まれました 環境。 環境変数の秘密が漏洩されました。 プライベート GitHub トークンに慣れてきた 後続リリースのミント。 開発者のラップトップが実行中 npm install ローカルで RAT を入手しました。 メンテナのマシンはすでにセキュリティ侵害を受けていたため、このインシデントは 2FA を回避しました。 ターゲットを絞ったソーシャル エンジニアリング キャンペーン。 npm アカウントの 2FA は、攻撃者が所有している場合には何も行いません。 実行する端末 npm publish

このクラスの攻撃を排除することはできませんが、爆発範囲を縮小することはできます。 すべての npm パッケージ それは 1 つの小さなことを行います。 電子メールの検証、電話番号の解析、HTML の除去、生成 JWT に署名する QR コード。 削除して、API への HTTPS 呼び出しに置き換えることができるパッケージです。 回転キーによる制御。 侵害されたパッケージは、対応する前に実行されます。 侵害された API キー 数秒で動作を停止します。

今週は、同じことを行う HTTP API と置き換えることができる 5 つの npm パッケージを紹介します。 さらに、新しいポストインストール フックがロックファイルに到達するのをブロックする CI ガードも追加されます。

現在の npm 依存関係サーフェスを監査する

何かを削除する前に、何が残っているかを確認してください。 このシェル パスは本番環境の依存関係を明らかにします インストールフックを使用して、毒された axios バージョンがツリー内のどこかにあるかどうかを確認します。

いずれかの axios バージョンがロックファイルに含まれている場合は、影響を受けるマシンまたは CI のすべてのシークレットをローテーションします。 ジョブがアクセスできました。 「ログを確認する」ではありません。 回転させます。 180 分以内に流出が発生したと仮定します 公開と削除の間。 漏洩した秘密は漏洩することはできません。

Google 脅威インテリジェンスは、この操作は UNC1069 によるものであると考えています。UNC1069 は、実行されたのと同じ攻撃者です。 もっと早くに WAVESHAPER キャンペーン。 彼らのプレイブックは、次の方法でメンテナーのラップトップをターゲットにしています。 フィッシングを実行し、メンテナーの資格情報を利用して公開します。 弁護側は次のことを想定しなければなりません 少なくとも 1 つの推移的 dep の少なくとも 1 人のメンテナーは、フィッシング 1 回でインプラントになる可能性があります 配送システム。

置換 1: 電子メール検証ツール → /v1/メール/検証

validatoremail-validatordeep-email-validator、 そして disposable-email-domains サインアップ フローの大きなシェアに表示されます。 一緒に追加します 約 0.5 メガバイトのインストール重量、独自の推移的ツリー、および維持されているリスト 数週間以内に期限切れになる使い捨てドメイン。

API は、1 回の呼び出しで構文、DNS MX レコード、ライブの使い捨てドメイン リストをチェックします。 スワッピング 2 つのパッケージは次のようになります。

オフラインで検証できなくなります。 維持された MX チェック、ライブの使い捨てリスト、 そしてポストインストールフックを備えたパッケージがツリー内に存在することはありません。 サインアップ、チェックアウト、Webhook 用 電子メール フィールドでは、トレードオフとして API が有利になります。

置換 2: libphonenumber-js → /v1/電話

libphonenumber-js Google のポートです libphonenumber。 重さは147KBです 縮小された。 「ミニ」ビルドは 79 KB に減少しますが、ほとんどの国でメタデータが失われます。 完全なメタデータ バンドルにより、開梱時の重量は 2 MB に戻ります。 Cloudflare Workers またはコールド Lambda では、これは次のとおりです。 呼び出しごとに実際に発生するレイテンシー。

1 つの POST で、E.164 形式、国、国内番号、回線タイプ、およびタイムゾーンが返されます。 番号が 無効です、 data.validfalse そして残りはnullです。 サーバー側 サインアップ フローは、「フォームの読み取り」と「データベースへの書き込み」の間にこれを呼び出します。 API ラウンドトリップは 60 ミリ秒です。 既存の DB 書き込みウィンドウ内で。

置換 3: qrコード → /v1/qr/生成

qrcode npm パッケージ自体は問題ありません: 34 KB、ポストインストール フックなし。 良くないのは、 の canvas チュートリアルの半分で推奨されるピア依存関係。 ネイティブ コード、node-gyp をインストールし、ビルド ツールチェーン全体で 10 年間の CVE を備えています。 すべてのネイティブ npm dep はサプライチェーンの継ぎ目です。

応答は生の SVG です。 ファイルにパイプしたり、請求書テンプレートに詰め込んだり、インラインでレンダリングしたりできます React コンポーネント内で dangerouslySetInnerHTML。 ネイティブモジュールもビルドもなし ツールチェーン、推移ツリーなし。

置換 4: jsonwebtoken → /v1/jwt/generate および /v1/jwt/decode

jsonwebtoken Node で最もコピーされている JWT ライブラリの 1 つです。 図書館でもあります ほとんどの人は設定を誤っています。アルゴリズムが間違っている、視聴者の要求が欠落している、有効期限がないなどです。 間違ったアルゴリズム verify 呼び出しと攻撃者が制御するヘッダーにより、2015 年時代の JWT が再導入されます none 脆弱性。 API はアルゴリズムのホワイトリストを適用し、エンドポイントで未署名のトークンを拒否します。

バックエンド サービスによって発行された有効期限の短いトークンにこれを使用します: パスワード リセット リンク、ワンタイム ダウンロード URL、サービス間ベアラー トークン。 ユーザーセッションに外部サービスを使用しないでください すべての認証されたリクエストのホット パス上の JWT。 それらの場合は、検証済みのライブラリを処理中のままにしておきます そしてアルゴリズムをロックします。

置換 5: html からテキストへ → /v1/html-to-text/convert

html-to-textsanitize-htmlnode-html-parser、そして彼らの ユーザーコンテンツを受け入れるすべての API は最終的に HTML を取り除いてプレーンテキストにする必要があるため、友達が存在します。 プレビュー、電子メール ダイジェスト、または検索インデックス作成。 それらを合計した重量は 500 KB ~ 1.2 MB です。 彼らは引っ張る parse5 または htmlparser2 それぞれが持っているドアを通って メンテナーの表面。

より豊かな出力を得るには、 /v1/html-to-markdown GitHub 風味の Markdown を返します。 /v1/html-sanitize 構成可能な許可リストを含むクリーンな HTML を返します。 どれかを選んでください それは、下流の消費者がコンテンツを保存したい方法と一致します。

新しいポストインストールフックをブロックする CI ガードを追加する

パッケージの削除は 1 回限りの作業です。 スリムな状態を継続的に維持します。 この GitHub Actions チェックは失敗します ロックファイルの更新により新しいロックファイルが導入された場合の PR postinstall または preinstall ツリー内の任意の場所にフックします。

このチェックは低コストで、すべての PR で実行され、新しいスクリプト フックが適用される前に人間によるレビューが強制されます。 と組み合わせてください npm config set ignore-scripts true CI と明示的な許可リストについて 必要とわかっているパッケージ esbuild-style ポストインストール (TypeScript、Puppeteer、bcrypt)。

何を諦めたのか、いつ元に戻すのか

検証を HTTP 呼び出しに移行すると、実際のコストがかかります。 より小さな依存関係と引き換えにしているのです 表面:

トレード・オフ npmパッケージ HTTP API
レイテンシー マイクロ秒 エッジから 50 ~ 150 ミリ秒
オフラインでの使用 はい いいえ
インストールのリスク ポストインストールで任意のコードが実行される インストール手順はありません
失効 再構築、再公開、再デプロイ APIキーを数秒でローテーションします
監査証跡 デフォルトではなし 通話ごとのリクエストログ
バージョンドリフト 固定または改修 バージョンヘッダー、安定したコントラクト

正解は「両方、意図を持って」です。 クリティカル パス ライブラリをインプロセスに保持します (セッション JWT) 検証、暗号プリミティブ、認証ミドルウェア)。 単一目的ユーティリティのロングテールを動かす ロックファイルから、取り消すことができる署名付き HTTPS エンドポイントに移動します。

重要なポイント

  • 保守者がインプラントからフィッシング 1 回の距離にあると仮定します。 Axios は毎週 7,000 万ドルを獲得 ダウンロードしても、ソーシャル エンジニアリング攻撃によって npm アカウントが侵害されたままでした。 個人のラップトップ。
  • 今すぐポストインストールフックを監査してください。 実行中に任意のコードを実行するすべてのdep npm install サプライチェーンの継ぎ目です。 それらをインベントリしてから、削除または許可リストに登録します。
  • 最初に単一目的のパッケージを削除します。 電子メール、電話、QR、JWT 署名、HTML 変換; それぞれに、取り消し可能なキーを使用した 1 行の HTTP 置換が含まれています。
  • 露出後は回転し、調査は行わないでください。 毒されたアクシオスがあなたのところに着陸した場合 ツリー、影響を受ける環境が触れるすべての秘密をローテーションします。 窃盗は数分で行われます。
  • CI ガードを追加します。 新規ブロック postinstall フックがあなたのところに着地するのを防ぎます 人間によるレビューなしのロックファイル。 アクシオスの妥協はこのガードをはじいてしまうだろう。

Botoi は、上記の 5 つのパッケージとさらに約 145 の単一目的パッケージの HTTP 代替パッケージを提供します。 ユーティリティ: ハッシュ、UUID 生成、正規表現テスト、タイムスタンプ変換、JSON スキーマ検証、 バーコードの生成、PDF のレンダリングなど。 API キー 1 つ、無料枠では 5 リクエスト/分、なし フックを取り付けます。 閲覧する インタラクティブドキュメント または配線します MCPサーバー あなたの中に AI コーディング エージェントは、エディターを離れることなく、Claude Code または Cursor から同じエンドポイントを呼び出します。

FAQ

2026 年 3 月に axios npm パッケージに何が起こりましたか?
2026 年 3 月 31 日の 00:21 から 03:20 UTC の間、攻撃者は侵害された管理者アカウントを使用して、plain-crypto-js と呼ばれる悪意のあるインストール後の依存関係を持つ axios 1.14.1 および 0.30.4 を公開しました。 この依存関係により、プラットフォーム固有の RAT インプラントが sfrclak[.]com:8000 からダウンロードされました。 Google Threat Intelligence は、この作戦は北朝鮮と関係のある攻撃者である UNC1069 によるものであると考えています。 パッケージは約 3 時間ライブであり、世界中の CI キャッシュと開発者のラップトップに配置されるのに十分な長さでした。
npm パッケージを HTTP API に置き換えるとリスクは軽減されますか?
2 つの方法で攻撃対象領域を縮小します。 まず、ビルド サーバー上で任意のコードを実行するポストインストール フックを削除します。 次に、検証ロジックを開発者のラップトップから、API キーのローテーションを介して制御する署名付きの HTTPS 専用エンドポイントに移動します。 汚染されたパッケージは、ユーザーが反応する前に実行されます。 取り消された API キーは数秒で機能しなくなります。
HTTP 呼び出しはローカルの npm パッケージよりも遅いですか?
コールド リクエストに対する 1 回の呼び出しの場合は、はい。 一般的な botoi API レイテンシは、北米のクライアントから Cloudflare エッジまで 50 ~ 150 ミリ秒です。 すでに行っている DB 呼び出しと重複するほとんどのサーバー側フロー (サインアップ、チェックアウト、Webhook 処理) では、測定可能な追加は何もありません。 高スループット パスの場合は、ローカル パッケージと同じ遅延プロファイルの入力ハッシュによって応答をキャッシュします。
今すぐリポジトリに危険な npm パッケージがないか監査するにはどうすればよいですか?
npm Audit --omit=dev を実行して運用環境の依存関係を明らかにし、npm ls および npm view {name} スクリプトを使用してポストインストールまたはプレインストール フックでパッケージを検査します。 小さなこと (電子メール検証、QR 生成、JWT 署名、電話解析、HTML ストリッピング) を実行するパッケージは、HTTP 呼び出しに移行する有力な候補です。 暗号化を行うパッケージやネットワーク コンテンツをアクティブに取得するパッケージは、最も優先度の高い監査対象です。
npm ではなく HTTP API プロバイダーが侵害された場合はどうなりますか?
爆発範囲が小さくなり、検出が速くなります。 API キーを管理し、1 回の呼び出しでそれを取り消すことができます。 プロバイダーは、ステータス ページ、インシデント RSS、および署名付き応答を HTTPS 経由で公開します。 これを、ビルド内で実行されているパッケージと比較してください。検出には、推移的な依存関係ツリー内のすべてのポストインストール フックを読み取る必要があります。 どちらもリスクがゼロではありません。 1 つはレバーを提供し、もう 1 つはレバーを提供しません。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。