BLOG
1通のリクエストであなたのサーバーが止まる?Multerの脆弱性を放置してはいけない理由
Node.js/Express でファイルアップロードを書いたなら、ほぼ全員が使ってる Multer。実は 1.x 系には 2025〜2026 年に立て続けに HIGH 脆弱性が 7 件公開され、すべて 2.x で修正されました。仕組みと対策を身近な例えで。
いつも画像アップロードで使っている multer。実は 2025 年以降、立て続けに 7 件の HIGH severity 脆弱性 が公開されました。「脆弱性って難しそう…」と思うかもしれませんが、放置するとあなたのサービスがある日突然動かなくなるかもしれません。
この記事ではジュニアエンジニア向けに、Multer の役割から、今回の問題の正体、そして 5 分で終わる対策まで噛み砕いて解説します。

① Multer ってそもそも何をしているの?
Express でファイルアップロードを実装したことがあるなら、multer は必ず触っているはず。でも改めて聞かれると「何を解決してくれているのか」答えにくくありません?
ブラウザから <input type="file"> で送られたデータは、HTTP リクエストの中に 巨大なテキストの塊 として乗ってきます。Content-Type: multipart/form-data という、独特なフォーマットで複数のファイルやフォームフィールドが連結された状態。
このままでは Node.js でファイルとして扱えません。Multer は、その「塊」から画像や PDF を切り分けて、ディスクに保存し、req.file / req.files という使いやすい形に整えてくれる「仕分け担当の事務員さん」 です。

import multer from "multer";
const upload = multer({ dest: "uploads/" });
app.post("/upload", upload.single("photo"), (req, res) => {
// req.file に保存先のパスやファイル情報がもう入ってる
res.json({ saved: req.file.path });
});
たった数行でファイルアップロードが書ける。それは、事務員さんが裏で頑張って書類を仕分けてくれているから。
② 今回の脆弱性を身近な例えで
通常はこうです:
あなた「この multipart リクエスト、画像とテキストに仕分けて保存しといて」
事務員(Multer)「了解、3 ミリ秒で済みます」
今回の脆弱性は、「事務員さんを意図的にパニックにさせるリクエストの送り方」 が複数発見されたという話です。

具体的には、攻撃者が次のようなリクエストを送ると…
- 空のフィールド名を含む変な書類 → 事務員パニック → サーバプロセスごと落ちる (CVE-2025-48997)
- アップロードの途中で接続を切る動作を大量に繰り返す → 事務員が片付けられない書類が机の上に積み上がる → メモリと FD が枯渇 (CVE-2025-47935、CVE-2026-2359)
- 入れ子が異常に深い書類を送る → 事務員が「ページめくり地獄」に陥って机ごと吹っ飛ぶ (再帰スタックオーバーフロー、CVE-2026-3520)
つまり、「データを盗まれる」より「サービスがまるごと止まる」タイプの脆弱性 (DoS, Denial of Service) が中心。1 通の悪意あるリクエストを送るだけで Node.js プロセスがクラッシュするようなものもあります。
③ 影響:データ漏洩より怖い「停止」
「データが漏れるわけじゃないなら、別にいいんじゃない?」と思うかもしれません。でも実務的にはこちらの方がしんどいんですわ。
- 深夜 2 時にサーバが落ちる → 監視アラート → エンジニアが叩き起こされる
- サービスが落ちている間の売上ゼロ → 1 時間落ちたら EC サイトなら数十万円消える
- 復旧後の事後対応 → 顧客への謝罪、原因究明、ポストモーテム書き
- 小さな攻撃の繰り返しでメモリ枯渇 → ジワジワ重くなって誰のせいか分からないまま現場が疲弊
つまり「脆弱性を放置する=ある日突然、夜に起きる確率を上げる」ということ。これは怖いですよね。
④ 公開された 7 件の脆弱性 (一次情報まとめ)
参考までに、2025〜2026 年に公開された Multer の HIGH severity 脆弱性を時系列でまとめておきます。リンクはすべて GitHub Security Advisory (一次情報源) です。
| 公開日 | CVE | 種別 | 影響バージョン | 修正 |
|---|---|---|---|---|
| 2025-05-19 | CVE-2025-47944 | 未処理例外で crash | <2.0.0 | 2.0.0 |
| 2025-05-19 | CVE-2025-47935 | メモリ/FD リーク | <2.0.0 | 2.0.0 |
| 2025-06-03 | CVE-2025-48997 | 空フィールド名で crash | <2.0.1 | 2.0.1 |
| 2025-07-17 | CVE-2025-7338 | 不正リクエストで crash | <2.0.2 | 2.0.2 |
| 2026-02-27 | CVE-2026-2359 | 切断時のリソース未解放 | <2.1.0 | 2.1.0 |
| 2026-02-27 | CVE-2026-3304 | クリーンアップ不全 | <2.1.0 | 2.1.0 |
| 2026-03-04 | CVE-2026-3520 | 深いネストで再帰暴走 | <2.1.1 | 2.1.1 |
CVSS は概ね 7.5〜8.7 (HIGH) の範囲。multer 1.x (1.4.5-lts.2 を含む) は 全滅 と思っていい状況です。
⑤ 対策:あなたのコードを救う 3 ステップ
5 分で終わります。
Step 1. 今のバージョンを確認
npm ls multer
# または
cat package.json | grep multer
1.x 系 (1.4.x も含む) なら脆弱性対象です。
Step 2. 最新の 2.x にアップデート
npm install multer@latest
# pnpm なら
pnpm add multer@latest
# yarn なら
yarn add multer@latest
これで multer@2.1.1 以上が入ります (執筆時点)。
Step 3. アップデート後に動作確認
Multer 1.x → 2.x の API は 基本互換 ですが、いくつか変更点があります:
multer.diskStorage/multer.memoryStorageはそのまま使える- 一部の deprecated コールバックが削除された
- ファイルフィルタのエラーハンドリングが少し厳しくなった
簡単な動作確認とテストを実行して、エラーが出なければ完了:
npm audit
# "found 0 vulnerabilities" が理想
GitHub のリポジトリで Dependabot を有効化していれば、こういう脆弱性公開時に自動で PR を立ててくれるので、まだなら設定をおすすめします。
締め
脆弱性は誰のせいでもありません。OSS のメンテナも人間で、攻撃手法も日々進化しています。重要なのは「定期的にアップデートを取り込み続けるオペレーション」をプロジェクトに組み込むこと。これが、ジュニアからプロのエンジニアになる分かれ道だったりします。
npm install multer@latest の 1 コマンドで、夜中に叩き起こされる確率がぐっと下がります。今すぐ package.json を開いてみてください。
Refs (一次情報):