BLOG
一個請求就能讓你的服務器宕機?為什麼不能放任 Multer 的漏洞
只要你在 Node.js/Express 裡寫過文件上傳,幾乎一定用過 Multer。其實 1.x 系列在 2025〜2026 年間接連公開了 7 個 HIGH 級別漏洞,全部已在 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)**,而不是”數據被偷”型。其中有些只要發一封惡意請求,Node.js 進程就能直接 crash。
③ 影響:比數據洩露更可怕的是”宕機”
“既然不是數據洩露,那也沒什麼大不了的吧?“——也許你會這麼想。但從實務角度看,這種反而更讓人頭大。
- 凌晨兩點服務器掛了 → 監控告警 → 工程師被叫醒
- 服務停擺期間營收為零 → 一小時宕機,電商網站可能直接蒸發數十萬日元
- 恢復後的善後 → 給客戶道歉、追查原因、寫事後覆盤
- 小規模攻擊反覆出現導致內存耗盡 → 慢慢變卡,又找不到鍋是誰的,團隊疲憊不堪
也就是說,“放任漏洞 = 提高你哪天半夜被叫醒的概率”。這不挺可怕的嗎。
④ 已公開的 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)基本可以視作全軍覆沒。
⑤ 對策:拯救你代碼的三步
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仍可繼續使用- 部分被廢棄的回調已經被移除
- 文件過濾器的錯誤處理變得稍嚴格了一些
跑一下簡單的功能測試和已有的測試用例,沒報錯就完事:
npm audit
# 理想是出現 "found 0 vulnerabilities"
如果你在 GitHub 倉庫裡啟用了 Dependabot,遇到這種漏洞公開時它會自動開 PR,還沒啟用的話推薦打開。
收尾
漏洞不是誰的錯。OSS 維護者也是人,攻擊手法也每天在進化。關鍵是把”定期把上游更新吸收進來的運維流程”嵌入到項目裡。這往往就是從初級工程師走向資深工程師的分水嶺。
npm install multer@latest 這一句命令,就能大幅降低你半夜被電話叫醒的概率。現在就打開 package.json 看看吧。
Refs(一手信息):