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

Axios CVSS 10.0脆弱性——Prototype PollutionからRCE・クラウド乗っ取りへ

週間1億ダウンロード、年間30億ダウンロード超。JavaScriptエコシステムで最も広く使われているHTTPクライアントライブラリAxiosに、CVSS基本スコア10.0(最高値)の脆弱性が発見された。CVE-2026-40175と採番されたこの脆弱性は、単体では「ヘッダーのサニタイズ不備」に見えるが、他ライブラリのPrototype Pollution脆弱性と組み合わせることでリモートコード実行(RCE)AWSクラウドアカウントの完全掌握にまでエスカレートする「ガジェット型攻撃チェーン」だ。

2026年4月10日にGitHub Security Advisory(GHSA-fvcv-3m26-pcqx)として公開され、修正版Axios 1.15.0が同日リリースされた。しかし、クラウド・エンタープライズ環境の約80%にAxiosが存在するとされる現状では、影響を受けるシステムの数は膨大だ。すでにPoCコード(概念実証)がメンテナのJason Saayman氏自身によりGitHub上で公開されており、悪用までの技術的ハードルは極めて低い。

本記事では、この脆弱性の技術的メカニズムを深掘りし、日本の開発者が今すぐ取るべきアクションを解説する。

Prototype Pollutionとは何か

JavaScriptの「プロトタイプチェーン」を汚染する攻撃

Prototype Pollutionを理解するには、まずJavaScriptのプロトタイプチェーンを知る必要がある。JavaScriptでは、すべてのオブジェクトはObject.prototypeを頂点とするチェーンを持ち、自身に存在しないプロパティを親のプロトタイプから自動的に継承する。

const obj = {};
console.log(obj.toString); // Object.prototypeのtoStringを継承

Prototype Pollutionとは、攻撃者がObject.prototypeに任意のプロパティを注入する攻撃手法だ。一度汚染されると、アプリケーション内のすべてのオブジェクトがその汚染プロパティを継承する。

// 攻撃者がPrototype Pollutionを実行
Object.prototype.isAdmin = true;

// 以降、すべてのオブジェクトがisAdmin = trueを持つ
const user = {};
console.log(user.isAdmin); // true — 認証バイパス!

なぜ発生するのか

Prototype Pollutionは、ユーザー入力をオブジェクトに再帰的にマージする処理で発生する。JSONパース、クエリ文字列パース、設定ファイル読み込みなど、多くの場面で使われるライブラリが脆弱な実装を持っている。

代表的な脆弱なライブラリには以下がある。

  • qs(クエリ文字列パーサー): Express.jsの標準ミドルウェア
  • minimist(CLI引数パーサー): 多数のCLIツールが依存
  • ini(INIファイルパーサー): npm CLIが依存
  • body-parser(HTTPボディパーサー): Express.jsの標準ミドルウェア

これらのライブラリにPrototype Pollution脆弱性がある場合、攻撃者は__proto__キーを含むペイロードを送信するだけでObject.prototypeを汚染できる。

「ガジェット」という概念

ここで重要なのがガジェットという概念だ。Prototype Pollution単体では直接的な被害が限定的なケースが多い。しかし、汚染されたプロパティを危険な方法で使用するコード(=ガジェット)が存在すると、被害は劇的にエスカレートする。

今回のCVE-2026-40175は、まさにこのAxiosがガジェットとして機能する脆弱性だ。他のライブラリでPrototype Pollutionが発生した場合、Axiosのconfig mergeプロセスが汚染されたプロパティをHTTPヘッダーに取り込み、攻撃チェーンが完成する。

CVE-2026-40175の技術的詳細

脆弱性の概要

項目内容
CVE IDCVE-2026-40175
CVSS スコア10.0(Critical)
攻撃ベクターネットワーク
攻撃複雑性
必要な権限なし
ユーザー操作不要
CWECWE-113(HTTP分割)、CWE-444(HTTPスマグリング)、CWE-918(SSRF)
影響バージョンAxios 1.15.0より前の全バージョン
修正バージョンAxios 1.15.0
公開日2026年4月10日
アドバイザリGHSA-fvcv-3m26-pcqx

攻撃チェーンの4ステップ

この脆弱性は、以下の4つのステップで攻撃が成立する。

この図はCVE-2026-40175の攻撃チェーン全体像を示しています。Prototype PollutionからAxiosのconfig merge、CRLFインジェクション、Request Smugglingへと段階的にエスカレートし、最終的にRCE・クラウド乗っ取り・ヘッダーインジェクションの3つの影響に至る流れを図解しています。

CVE-2026-40175 攻撃チェーン全体像:Prototype PollutionからRCE・AWS IMDSv2バイパス・ヘッダーインジェクションに至る4ステップの攻撃フロー

ステップ1: Prototype Pollutionの発生

攻撃者は、アプリケーションの依存関係に存在するPrototype Pollution脆弱性を悪用する。例えば、qsライブラリの脆弱なバージョンを使っているExpress.jsアプリケーションに対して、以下のようなリクエストを送信する。

POST /api/data HTTP/1.1
Content-Type: application/x-www-form-urlencoded

__proto__[malicious-header]=injected-value\r\nX-Smuggled: payload

これにより、Object.prototypemalicious-headerプロパティが設定される。

ステップ2: Axiosのconfig mergeが汚染を継承

Axiosは内部でリクエスト設定を構築する際、デフォルト設定、インスタンス設定、リクエスト固有設定をマージする。問題は、lib/adapters/http.jsでHTTPヘッダーを構築するプロセスにある。

Axiosの設定マージは、Object.prototypeに存在するプロパティを暗黙的に継承してしまう。つまり、ステップ1で汚染されたプロパティが、Axiosが送信するHTTPリクエストのヘッダーに自動的に含まれる

ステップ3: CRLFインジェクション

ここが核心だ。Axios 1.15.0より前のバージョンでは、ヘッダー値に含まれるCRLF文字(\r\n)のサニタイズが欠如していた。攻撃者がPrototype Pollutionで注入した値にCRLF文字を含めると、HTTPヘッダーの途中で改行が発生し、新しいヘッダーや完全に新しいHTTPリクエストを注入できる。

// 汚染されたプロパティの値
"legitimate-value\r\nX-Forwarded-For: 169.254.169.254\r\n\r\nGET /latest/meta-data/iam/security-credentials/ HTTP/1.1\r\nHost: 169.254.169.254"

ステップ4: Request Smuggling → 目的達成

CRLFインジェクションにより、攻撃者は以下の3つの攻撃パターンを実行できる。

パターンA: AWS IMDSv2バイパスによるクラウド完全掌握

AWSのEC2インスタンスメタデータサービス(IMDS)v2は、通常PUTリクエストでセッショントークンを取得してからメタデータにアクセスする2段階認証を要求する。しかし、Request Smugglingを使えば、この制限をバイパスしてメタデータに直接アクセスできる。

取得できる情報には以下が含まれる。

  • IAMロールの一時クレデンシャル(AccessKeyId、SecretAccessKey、SessionToken)
  • EC2インスタンスのユーザーデータ(起動スクリプト内の秘密情報)
  • VPC内のネットワーク情報

これらのクレデンシャルを使えば、S3バケットの読み書き、DynamoDBの操作、Lambda関数の実行など、IAMロールに付与された権限の範囲でAWSリソースを自由に操作できる。

パターンB: Cookie/Authorizationヘッダーインジェクション

CRLFインジェクションでCookieやAuthorizationヘッダーを偽造し、内部管理パネルや認証済みAPIエンドポイントにアクセスする。

パターンC: リモートコード実行(RCE)

サーバーサイドでAxiosを使っているNode.jsアプリケーションにおいて、Request Smugglingを介して内部サービスに悪意あるリクエストを送信し、最終的にコード実行を達成する。

なぜCVSS 10.0なのか

CVSS 10.0(最高スコア)が付与された理由は明確だ。

  • 攻撃ベクターがネットワーク: インターネット経由で攻撃可能
  • 攻撃複雑性が低: Prototype Pollution脆弱性さえあれば自動的にエスカレート
  • 特権不要: 認証なしで攻撃可能
  • ユーザー操作不要: 被害者のアクションは一切不要
  • 機密性・完全性・可用性すべてに最大影響: クラウドクレデンシャル窃取、データ改ざん、サービス停止

特に「直接のユーザー入力を必要としない」という点が重要だ。Prototype Pollutionがどこか別のライブラリで発生するだけで、Axiosがガジェットとして機能して攻撃チェーンが完成する。アプリケーション開発者がAxiosを「安全に」使っているつもりでも、依存関係ツリーのどこかにPrototype Pollution脆弱性があれば危険にさらされる。

影響範囲の深刻さ

Axiosの利用規模

Axiosの影響範囲を数字で確認しよう。

  • 週間ダウンロード数: 約1億回
  • 年間ダウンロード数: 30億回以上
  • 依存パッケージ数: 174,000以上のnpmパッケージがAxiosに依存
  • クラウド環境での存在率: 約80%
  • 露出インスタンス数: Netlasの推定で48,000以上

つまり、Node.jsでHTTPリクエストを行うアプリケーションの大半がAxiosを使っている。サーバーサイドレンダリング(SSR)を行うNext.jsアプリケーション、マイクロサービス間通信、外部API連携など、あらゆる場面でAxiosは使われている。

間接依存の問題

さらに深刻なのは、開発者が直接Axiosを使っていなくても影響を受ける可能性がある点だ。174,000以上のnpmパッケージがAxiosに依存しているため、node_modulesの奥深くに脆弱なバージョンのAxiosが潜んでいるケースがある。

例えば、以下のような人気フレームワーク・ライブラリがAxiosに依存している。

  • 多数のAPI SDKクライアント(Stripe、Twilio、SendGrid等)
  • CMSヘッドレスクライアント
  • 認証ライブラリ
  • テストフレームワークのHTTPモック

この図はAxiosの影響範囲と、主要なnpmパッケージ脆弱性との比較を示しています。週間ダウンロード数の棒グラフと、CVSSスコア・影響範囲・発見年を比較した表で、今回の脆弱性の深刻さを視覚的に把握できます。

Axiosの影響範囲と主要npmパッケージ脆弱性の比較:週間ダウンロード数の棒グラフとCVSSスコア・影響範囲の比較表

類似のサプライチェーン脆弱性との比較

JavaScriptエコシステムでは、近年サプライチェーン攻撃と脆弱性が急増している。今回のCVE-2026-40175を、過去の重大インシデントと比較してみよう。

脆弱性/インシデントCVSS種別週間DL数攻撃の複雑性実害
Axios CVE-2026-40175202610.0PP→RCE/クラウド乗っ取り1億+低(PP脆弱性があれば自動)PoCあり、実害未確認
Axiosサプライチェーン攻撃2026/3N/Anpm乗っ取り→RAT配布1億+低(install時に実行)北朝鮮関与、RAT感染
lodash CVE-2026-295020267.5Prototype Pollution7000万+広範囲だが直接的RCEは困難
chalk サプライチェーン2025/9N/Aアカウント乗っ取り→RAT8600万+2.6B週間DLの18パッケージ侵害
event-stream2018N/A保守者譲渡→暗号通貨窃取200万+暗号通貨ウォレット窃取

注目すべき点がいくつかある。

1. CVSSスコアの異常な高さ: CVE-2026-40175のCVSS 10.0は、npmパッケージの脆弱性としては前例のない高さだ。これはPrototype Pollutionが「トリガー」、Axiosが「ガジェット」として機能する複合的な攻撃チェーンの危険性を反映している。

2. 2026年3月のAxiosサプライチェーン攻撃との違い: わずか2週間前の3月31日、Axiosのnpmパッケージ自体が北朝鮮関連の攻撃者に乗っ取られ、悪意あるバージョンが配布される事件が起きた。CVE-2026-40175はそれとは別の、Axiosのコード自体に存在する脆弱性だ。Axiosは1ヶ月の間に2つの深刻なセキュリティ問題に見舞われたことになる。

3. サプライチェーンリスクの複合化: 2018年のevent-streamが200万DL/週だったのに対し、2025〜2026年の攻撃対象は数千万〜1億DL/週規模に拡大している。npmエコシステムの成長に伴い、1つの脆弱性の影響範囲が指数関数的に拡大している。

Axios 1.15.0での修正内容

修正はPR #10660としてマージされ、主に以下の変更が行われた。

ヘッダー値のCRLFサニタイズ

lib/adapters/http.jsにおいて、HTTPヘッダーの値に含まれるCRLF文字(\r\n)をチェックし、検出した場合はエラーを投げるバリデーションが追加された。

config mergeの安全化

設定オブジェクトのマージプロセスで、Object.prototypeから継承されたプロパティ(hasOwnPropertyチェックを通過しないプロパティ)を除外するロジックが強化された。

これにより、仮にアプリケーション内でPrototype Pollutionが発生しても、Axiosがガジェットとして悪用されることを防ぐ。

日本の開発者への影響と対策

日本でのAxios利用状況

日本のWeb開発市場でもAxiosは広く使われている。特に以下の場面で多い。

  • Next.js / Nuxt.js アプリケーション: SSR時のAPI呼び出しでAxiosを使用するパターンが一般的
  • バックエンドAPIサービス: Express.js / Fastifyベースのマイクロサービスで外部API連携にAxiosを使用
  • AWS上のNode.jsアプリケーション: Lambda、ECS、EC2でAxiosを使うケースが多く、IMDSv2バイパスの影響を直接受ける
  • 社内ツール・管理画面: React + Axiosの組み合わせは日本の開発現場で非常にポピュラー

AWS利用企業への特別な警告

日本はAWSの利用率が高く、東京リージョン(ap-northeast-1)は世界有数のトラフィック量を誇る。今回の脆弱性でAWS IMDSv2バイパスが可能になるため、EC2上でNode.jsアプリケーションを運用している企業は最優先で対応が必要だ。

特に以下の構成はリスクが高い。

  • EC2上のNode.jsアプリケーションがAxiosで外部APIを呼び出している
  • IAMロールに広範な権限(S3フルアクセス等)が付与されている
  • IMDSv2が必須化されていない(デフォルトではIMDSv1も有効)

具体的な対応手順

ステップ1: 影響確認(所要時間: 5分)

# 直接依存の確認
npm list axios
# または
yarn why axios

# 間接依存も含めた確認
npm audit
# 詳細レポート
npm audit --json | jq '.vulnerabilities.axios'

ステップ2: アップデート(所要時間: 10分)

# Axiosを1.15.0にアップデート
npm install axios@1.15.0
# または
yarn add axios@1.15.0

# lockfileの更新を確認
git diff package-lock.json

ステップ3: 間接依存の対応

直接Axiosを使っていない場合でも、依存パッケージ経由で脆弱なバージョンが含まれている可能性がある。

# npm 8.3+のoverridesを使用
# package.jsonに追加
{
  "overrides": {
    "axios": "^1.15.0"
  }
}

# yarnの場合はresolutions
{
  "resolutions": {
    "axios": "^1.15.0"
  }
}

ステップ4: AWS環境の追加対策

# IMDSv2を必須化(IMDSv1を無効化)
aws ec2 modify-instance-metadata-options \
  --instance-id i-xxxxxxxxxxxx \
  --http-tokens required \
  --http-put-response-hop-limit 1

# 既存の全EC2インスタンスに適用するスクリプト
aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId' --output text | \
  xargs -I {} aws ec2 modify-instance-metadata-options --instance-id {} --http-tokens required

AWSを利用している場合、IMDSv2の必須化は今回の脆弱性に限らず、セキュリティのベストプラクティスとして強く推奨される。

この図はCVE-2026-40175への緊急対応チェックリストを3つのフェーズに分けて示しています。即座に確認すべきこと、修正の適用手順、そして再発防止策を一覧にまとめています。

CVE-2026-40175 緊急対応チェックリスト:Phase 1(即座に確認)、Phase 2(修正適用)、Phase 3(再発防止)の3段階対応フロー

Prototype Pollution対策の根本的アプローチ

今回のCVE-2026-40175は、Axiosをアップデートすれば当面の対策にはなる。しかし、Prototype Pollutionそのものを防がない限り、次のガジェットが見つかれば同じことの繰り返しだ

Object.prototypeのフリーズ

最も直接的な対策は、アプリケーション起動時にObject.prototypeをフリーズすることだ。

// アプリケーションのエントリポイントで実行
Object.freeze(Object.prototype);

ただし、一部のライブラリがObject.prototypeの変更に依存している場合、予期しない動作を引き起こす可能性がある。導入前にテストスイートで検証すること。

Object.create(null)の活用

設定オブジェクトや辞書として使うオブジェクトは、プロトタイプチェーンを持たないObject.create(null)で作成する。

// プロトタイプチェーンを持たないオブジェクト
const config = Object.create(null);
config.timeout = 5000;
// Object.prototypeが汚染されていても影響なし

Mapの使用

ES6以降であれば、辞書的なデータ構造にはMapを使うことで、Prototype Pollutionの影響を完全に回避できる。

const headers = new Map();
headers.set('Content-Type', 'application/json');
// Object.prototypeの汚染は影響しない

CI/CDでの自動検出

Snyk、Socket.dev、npm auditなどのツールをCI/CDパイプラインに組み込み、Prototype Pollution脆弱性を持つパッケージを自動検出する仕組みを構築すべきだ。

# GitHub Actionsの例
- name: Security Audit
  run: |
    npm audit --audit-level=critical
    npx socket-security check

筆者の所感

「ガジェット型脆弱性」の恐怖

今回のCVE-2026-40175が特に恐ろしいのは、Axios自体に直接的な入力ベクターがないという点だ。従来のWebアプリケーション脆弱性は、「ユーザー入力をサニタイズせずに使っている」というパターンが多く、攻撃の起点が明確だった。しかしガジェット型脆弱性では、攻撃の起点は別のライブラリにあり、Axiosはその「増幅器」として機能する。

これは、依存関係の深いモダンなJavaScriptアプリケーションにとって、セキュリティの責任分界点が曖昧になることを意味する。自分のコードに問題がなくても、依存関係ツリーの組み合わせによって致命的な脆弱性が生まれうる。

npmエコシステムの構造的問題

2026年のAxiosは、わずか1ヶ月の間に2つの深刻なセキュリティ問題に直面した。3月末の北朝鮮関連サプライチェーン攻撃と、今回のCVE-2026-40175だ。これは偶然ではない。

週間1億ダウンロードというパッケージが、実質的に少数のメンテナによって維持されているというnpmエコシステムの構造的問題を如実に表している。2025年9月にはchalk(週間8600万DL)がアカウント乗っ取りで侵害され、2025年秋にはShai-Huludワームが500以上のパッケージを自己複製で汚染した。

日本の開発チームは、「npmパッケージは便利だから使う」という発想から、「npmパッケージは攻撃対象だからリスク管理する」という発想に転換すべき時期に来ている。

fetchへの移行は解決策になるか

Node.js 18以降で標準搭載されたfetch APIへの移行を検討する声もある。確かに、Axiosを使わなければこの脆弱性の影響は受けない。しかし、fetchはAxiosほどのインターセプター機能やリクエスト/レスポンス変換の柔軟性を持たない。

現実的には、大規模アプリケーションでAxiosからの移行は短期的には困難だ。まずは1.15.0へのアップデートを最優先とし、中長期的にfetchベースのラッパーや軽量代替ライブラリ(ky、got等)への移行を計画するのが賢明だろう。

セキュリティ投資の必要性

1Passwordのようなクレデンシャル管理ツールの導入、AWS IAMポリシーの最小権限化、IMDSv2の必須化——これらは「コスト」ではなく「投資」だ。今回のようなCVSS 10.0脆弱性が発見された場合、適切なセキュリティ対策が取られていれば被害を最小限に抑えられる。特にIMDSv2の必須化は無料で即座に実行でき、今回のようなSSRF系攻撃の影響を大幅に軽減できる。

まとめ——今すぐ取るべき3つのアクション

CVE-2026-40175は、JavaScriptエコシステム史上最高レベルの危険度を持つ脆弱性だ。CVSS 10.0のスコアが示す通り、攻撃の複雑性は低く、PoCも公開されている。実害が確認される前に、今すぐ以下のアクションを実行してほしい。

1. 今すぐ: Axiosのバージョンを確認し、1.15.0にアップデートする

npm list axiosで直接依存と間接依存の両方を確認する。間接依存で脆弱なバージョンが残っている場合は、package.jsonoverrides/resolutionsで強制的に1.15.0以上に固定する。

2. 今週中: AWS環境のIMDSv2を必須化する

aws ec2 modify-instance-metadata-options --http-tokens requiredを全EC2インスタンスに適用する。これにより、今回の脆弱性だけでなく、将来のSSRF系攻撃全般に対する防御力が向上する。

3. 今月中: 依存関係のセキュリティ監査体制を構築する

CI/CDパイプラインにnpm auditやSnyk/Socket.devを組み込み、脆弱な依存関係を自動検出する仕組みを構築する。Prototype Pollution脆弱性を持つパッケージ(古いバージョンのqs、minimist、ini等)がないか棚卸しする。

npmエコシステムのサプライチェーンリスクは、2024年から2026年にかけて急速に深刻化している。「自分のプロジェクトは大丈夫」という過信が最大のリスクだ。npm auditの結果に真剣に向き合い、依存関係をリスク資産として管理する文化を定着させよう。


情報ソース:

この記事をシェア