axios 脆弱性対応ガイド 2026:影響確認・バージョンアップ・代替手段の判断まで
npm audit の警告を見て「とりあえず後回し」にしていませんか。本記事は、axios を本番利用している開発者・セキュリティ担当者を対象に、既知の脆弱性の実態・影響範囲の確認手順・バージョンアップ時の注意点・fetch への移行判断基準までを実務視点で整理します。検証・運用の現場で実際に直面した問題を踏まえて解説するため、「警告は出ているが何をすればいいかわからない」という状態を解消することを目標とします。
axios の主要脆弱性と対処バージョン比較
| CVE ID | 深刻度 | 影響バージョン | 内容 | 対処バージョン |
|---|---|---|---|---|
| CVE-2023-45857 | High | 0.8.1〜1.5.1 | CSRF:XSRF-TOKEN がクロスオリジンに漏洩 | 1.6.0 以上 |
| CVE-2024-39338 | Medium | 1.0.0〜1.7.3 | SSRF:Node.js 環境で相対 URL がバイパス | 1.7.4 以上 |
| CVE-2020-28168 | Medium | 〜0.21.0 | プロトタイプ汚染:任意プロパティの書き換え | 0.21.1 以上 |
それぞれの詳細は後述します。現在使用中のバージョンを確認し、該当する CVE がないかまず照合してください。
検証環境
- OS : macOS Sequoia 15.3
- Node.js : 20.18.0
- TypeScript : 5.4.5
- 主要パッケージ :
- axios : 1.7.9
- vite : 5.4.0
- 検証日 : 2026年03月31日
axios の脆弱性が問題になる技術的背景
axios は 2014 年から広く使われてきた HTTP クライアントライブラリです。ブラウザと Node.js の両環境で動作し、Promise ベースのインターフェースを提供します。週あたりのダウンロード数は長年にわたって数億件を超えており、実質的に「デファクトスタンダード」として定着してきました。
しかしその普及度ゆえに、脆弱性が発見された際の影響範囲は非常に大きくなります。また、axios は直接依存だけでなく、他のパッケージが間接的に依存していることも多く、自分のコードで使っていなくても npm audit に登場するケースがあります。
以下の図は、axios がリクエストを処理する際の主要フローと、脆弱性が発生しやすい箇所を示しています。
mermaidflowchart LR
A["アプリケーション"] --> B["axios インスタンス"]
B --> C["インターセプター処理"]
C --> D["リクエスト設定の解決"]
D --> E{"環境判定"}
E -- ブラウザ --> F["XMLHttpRequest"]
E -- Node.js --> G["http/https モジュール"]
F --> H["レスポンス"]
G --> H
D -. "CVE-2023-45857<br/>XSRF-TOKEN 付与" .-> F
D -. "CVE-2024-39338<br/>相対URL解決" .-> G
インターセプターとリクエスト設定の解決フェーズで問題が起きやすい構造になっています。ブラウザ向けとNode.js向けの分岐があるため、それぞれ異なる攻撃ベクターが存在します。
現場で起きた課題:放置するとどうなるか
CVE-2023-45857 が引き起こす CSRF リスク
CSRF(Cross-Site Request Forgery)とは、ユーザーが意図しないリクエストを攻撃者が別サイトから送信させる攻撃手法です。
CVE-2023-45857 は、axios が withCredentials: true 設定時に XSRF-TOKEN ヘッダーをオリジンをまたいで送信してしまう問題です。本来 XSRF-TOKEN は同一オリジンのリクエストにのみ付与されるべきですが、この脆弱性が存在するバージョンでは第三者サイトへのリクエストにもトークンが漏洩します。
実際に試したところ、以下の条件が揃うと攻撃が成立することを確認しました。
- サーバーが Cookie ベースの認証を採用している
- フロントエンドが
withCredentials: trueでリクエストを送っている - axios のバージョンが 1.5.1 以下
この条件は、BFF(Backend for Frontend)構成を採用している SPA では珍しくなく、多くのプロダクトが対象になりえました。
CVE-2024-39338 が引き起こす SSRF リスク
SSRF(Server-Side Request Forgery)とは、サーバーが意図しない内部リソースや外部ホストへリクエストを送らされる攻撃手法です。
CVE-2024-39338 は、Node.js 環境で axios が相対 URL を解決する際、file:// スキームを含む URL が意図せず処理されてしまう問題です。ユーザー入力を URL の一部として受け取り axios で fetch するような実装では、内部ネットワークへのプロキシとして悪用されるリスクがあります。
業務で問題になったケースとして、以下のパターンがありました。
- ユーザーが指定した外部サービスの URL を Node.js サーバーが中継するマイクロサービス構成
http://localhost:9200(Elasticsearch)など内部サービスへのアクセスが通ってしまう
npm audit の警告を無視し続けた結果
npm audit は脆弱性を検出しますが、警告を無視し続けると以下の問題が起きます。
つまずきやすい点:
npm auditの出力は severity が高いものと低いものが混在します。「どれを優先すべきか」の基準がないと、全件を後回しにしやすくなります。
- CI が audit チェックを強制していない場合、警告が蓄積する
- 間接依存の脆弱性は
package-lock.jsonを見ないと気づきにくい - バージョンが離れすぎると、一度のアップグレードで破壊的変更が複数重なる
実際に約1年放置したプロジェクトでは、axios の major バージョンをまたぐアップグレードが必要になり、インターセプターの書き直しに数時間を要しました。
解決策と判断:アップグレード・設定変更・移行の選択
選択肢の整理
対応策は大きく3つです。
- axios をアップグレードする(最も現実的)
- ワークアラウンドとして設定を変更する(一時対応)
- fetch / ky に移行する(抜本的)
採用しなかった「設定だけで回避」という案については、CVE-2023-45857 の場合 xsrfCookieName や xsrfHeaderName を空にすることで症状を回避できますが、本質的な修正ではなく他のリクエスト設定と干渉するリスクがあるため、長期的な解決策には採用しませんでした。
アップグレードの判断基準
以下の条件を満たす場合は、まずアップグレードを選択します。
- axios のカスタムインターセプターを多用していない
- プロジェクトの axios 利用箇所が20ファイル未満
- Node.js 18以上 / ブラウザモダン環境のみを対象としている
逆に以下の場合は fetch/ky への移行を検討します。
- axios 固有の機能(自動変換・インスタンス管理)をほとんど使っていない
- バンドルサイズを削減したい(axios は約14KB gzip)
- Node.js 環境のみで使用している(Node 18 以降は fetch が標準搭載)
具体的な対応手順
Step 1:現在の axios バージョンと脆弱性を確認する
まず現状を把握します。
bash# インストール済みバージョンの確認
npm list axios
# 脆弱性の確認
npm audit --audit-level=moderate
間接依存として axios が含まれている場合は以下で確認します。
bashnpm list axios --all
Step 2:package.json でバージョンを更新する
直接依存の場合はそのままアップグレードします。
bashnpm install axios@latest
間接依存(他パッケージが依存している)の場合は overrides を使います。
json{
"overrides": {
"axios": "^1.7.9"
}
}
つまずきやすい点:
overridesは npm 8.3 以上で使用可能です。yarn の場合はresolutionsフィールドを使います。設定後はnpm installを再実行してください。
Step 3:0.x → 1.x のマイグレーション時の注意点
axios 0.x から 1.x へのアップグレードでは、以下の変更が影響することがあります。
typescript// 0.x では AxiosRequestConfig を直接インポートできた
import { AxiosRequestConfig } from 'axios';
// 1.x では InternalAxiosRequestConfig が追加されている
// インターセプター内では InternalAxiosRequestConfig を使う
import { InternalAxiosRequestConfig } from 'axios';
const instance = axios.create();
instance.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
config.headers['X-Custom-Header'] = 'value';
return config;
}
);
検証の結果、インターセプター内で AxiosRequestConfig を型として使っていた箇所がコンパイルエラーになることを確認しました。InternalAxiosRequestConfig への変更が必要です。
Step 4:fetch への移行例(axios を使っていない場合)
もし axios の特定機能に依存していないなら、fetch への移行はシンプルです。
typescript// axios 版
const { data } = await axios.get<User>('/api/users/1');
// fetch 版(同等の処理)
const res = await fetch('/api/users/1');
if (!res.ok) throw new Error(`HTTP error: ${res.status}`);
const data: User = await res.json();
エラーハンドリングの方式が異なる点に注意が必要です。axios は 4xx/5xx で自動的に例外を throw しますが、fetch は res.ok を自分でチェックする必要があります。
axios 脆弱性対策の比較まとめ
対策方法の詳細比較
| 対策方法 | 効果 | 工数 | 向いているケース | 向かないケース |
|---|---|---|---|---|
| axios アップグレード | 根本解決 | 低〜中 | 依存が多いプロジェクト | major バージョン差が大きい場合 |
| overrides / resolutions | 間接依存を強制更新 | 低 | 直接触れないパッケージ経由の脆弱性 | バージョン競合が起きやすい環境 |
| 設定ワークアラウンド | 一時的な症状回避 | 低 | 緊急対応・テスト前の暫定処置 | 長期運用・根本解決が必要な場面 |
| fetch / ky への移行 | axios 依存ごと排除 | 高 | 新規・リファクタリング中のプロジェクト | axios 固有機能を多用している場合 |
向いているケース / 向かないケース
axios アップグレードが向いているケース
- 既存の axios コードが多く、移行コストが高い
- インターセプター・インスタンス管理を活用している
- ブラウザ・Node.js の両環境で動作させている
fetch/ky への移行が向いているケース
- Node.js 18 以降の環境のみ(fetch が標準搭載)
- バンドルサイズの削減が目的にある
- axios 固有機能をほぼ使っていない
overrides が向いているケース
- 間接依存として axios が混入しており、直接バージョン指定できない
- 外部ライブラリのアップデートを待てないが脆弱性だけ塞ぎたい
まとめ
axios の脆弱性対応は「すべてをアップグレードすれば終わり」とは言い切れません。使い方・環境・依存の深さによって、適切な対策は異なります。
- 直接依存なら まず
npm install axios@latestを実行し、1.7.4 以上になっていることを確認する - 間接依存なら overrides / resolutions で強制的にバージョンを固定する
- インターセプターを多用していないプロジェクトなら、fetch 移行も現実的な選択肢になる
重要なのは、npm audit の警告を起点に「現在の axios バージョン」と「CVE の影響範囲」を照合し、放置しないことです。脆弱性は時間が経つほど対応コストが上がります。本記事の手順を参考に、まず影響確認から着手してみてください。
関連リンク
著書
articleaxios 脆弱性対応ガイド 2026:影響確認・バージョンアップ・代替手段の判断まで
articleJavaScript 非同期エラー完全攻略:Unhandled Rejection を根絶する設計パターン
article【早見表】JavaScript MutationObserver & ResizeObserver 徹底活用:DOM 変化を正しく監視する
articleJavaScript Drag & Drop API 完全攻略:ファイルアップロード UI を最速で作る
articleJavaScript structuredClone 徹底検証:JSON 方式や cloneDeep との速度・互換比較
articleJavaScript 時刻の落とし穴大全:タイムゾーン/DST/うるう秒の実務対策
articleaxios 脆弱性対応ガイド 2026:影響確認・バージョンアップ・代替手段の判断まで
articleshadcn/ui × TanStack Table 設計術:仮想化・列リサイズ・アクセシブルなグリッド
articleRemix のデータ境界設計:Loader・Action とクライアントコードの責務分離
articlePreact コンポーネント設計 7 原則:再レンダリング最小化の分割と型付け
articlePHP 8.3 の新機能まとめ:readonly クラス・型強化・性能改善を一気に理解
articleNotebookLM に PDF/Google ドキュメント/URL を取り込む手順と最適化
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来
