繁體中文
AI 版
關於 AI 時代的系統開發 部落格 聯絡 AI 版頁面

BLOG

一個請求就能讓你的服務器宕機?為什麼不能放任 Multer 的漏洞

只要你在 Node.js/Express 裡寫過文件上傳,幾乎一定用過 Multer。其實 1.x 系列在 2025〜2026 年間接連公開了 7 個 HIGH 級別漏洞,全部已在 2.x 修復。本文用通俗的比喻拆解原理與對策。

#Node.js#Express#Multer#安全#漏洞

寫圖片上傳時隨手就用的 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 這種好用的形式交給你。

從瀏覽器經過 Multer,到 Express 可以處理的形態的流程

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-19CVE-2025-47944未處理異常導致 crash<2.0.02.0.0
2025-05-19CVE-2025-47935內存/FD 洩漏<2.0.02.0.0
2025-06-03CVE-2025-48997空字段名導致 crash<2.0.12.0.1
2025-07-17CVE-2025-7338非法請求導致 crash<2.0.22.0.2
2026-02-27CVE-2026-2359斷連時資源未釋放<2.1.02.1.0
2026-02-27CVE-2026-3304清理不完全<2.1.02.1.0
2026-03-04CVE-2026-3520深度嵌套引發遞歸暴走<2.1.12.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(一手信息):

CONTACT

聯絡我們

歡迎來信諮詢。