# 一個請求就能讓你的服務器宕機?為什麼不能放任 Multer 的漏洞 > 只要你在 Node.js/Express 裡寫過文件上傳,幾乎一定用過 Multer。其實 1.x 系列在 2025〜2026 年間接連公開了 7 個 HIGH 級別漏洞,全部已在 2.x 修復。本文用通俗的比喻拆解原理與對策。 Date: 2026-04-28 Tags: Node.js, Express, Multer, 安全, 漏洞 --- 寫圖片上傳時隨手就用的 `multer`,從 2025 年起接連被公開了 **7 個 HIGH severity 漏洞**。"漏洞聽起來好難……"也許你會這樣想,但放著不管,你的服務可能**某一天突然就跑不動了**。 這篇文章面向初級工程師,從 Multer 的角色講起,到這次問題的真面目,再到 5 分鐘就能搞定的對策,掰開揉碎講清楚。 ![分揀上傳文件的事務員與警告標誌](https://img.wiredxeco.com/wiredxeco/multer-vulnerabilities-2025-2026/hero.png) ## ① Multer 究竟做了什麼? 如果你在 Express 裡實現過文件上傳,那一定碰過 `multer`。但被人正面問起"它到底解決了什麼問題?"時,是不是反而答不太上來? 瀏覽器通過 `` 發來的數據,會作為**一大坨文本**塞在 HTTP 請求裡。格式是 `Content-Type: multipart/form-data`——一種特殊格式,把多個文件和表單字段拼接在一起。 這種狀態下 Node.js 沒法把它當成文件來處理。**Multer 就是那位"分揀事務員",從這坨大雜燴裡把圖片、PDF 切出來存到磁盤,再整理成 `req.file` / `req.files` 這種好用的形式交給你。** ![從瀏覽器經過 Multer,到 Express 可以處理的形態的流程](https://img.wiredxeco.com/wiredxeco/multer-vulnerabilities-2025-2026/role.png) ```js 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 毫秒搞定。" 這次的漏洞,本質是發現了**"故意把事務員逼瘋的請求姿勢"**——而且還不止一種。 ![平時處理順利,被攻擊時事務員陷入恐慌、待辦堆積](https://img.wiredxeco.com/wiredxeco/multer-vulnerabilities-2025-2026/attack.png) 具體來說,攻擊者發出下面這樣的請求…… - 包含**空字段名**的怪異文檔 → 事務員崩潰 → 服務器進程整個掛掉 ([CVE-2025-48997](https://github.com/expressjs/multer/security/advisories/GHSA-g5hg-p3ph-g8qg)) - 大量重複**上傳中途斷開連接**的動作 → 事務員處理不掉的文檔堆在桌上 → 內存與 FD 耗盡 ([CVE-2025-47935](https://github.com/expressjs/multer/security/advisories/GHSA-44fp-w29j-9vj5)、[CVE-2026-2359](https://github.com/expressjs/multer/security/advisories/GHSA-v52c-386h-88mc)) - 發送**嵌套異常深**的文檔 → 事務員陷入"翻頁地獄",連桌子都翻飛了(遞歸棧溢出,[CVE-2026-3520](https://github.com/expressjs/multer/security/advisories/GHSA-5528-5vmv-3xc2)) 也就是說,這次主要是**"服務整個停擺"型漏洞 (DoS, Denial of Service)**,而不是"數據被偷"型。其中有些只要發一封惡意請求,Node.js 進程就能直接 crash。 ## ③ 影響:比數據洩露更可怕的是"宕機" "既然不是數據洩露,那也沒什麼大不了的吧?"——也許你會這麼想。但從實務角度看,這種反而更讓人頭大。 - **凌晨兩點服務器掛了** → 監控告警 → 工程師被叫醒 - **服務停擺期間營收為零** → 一小時宕機,電商網站可能直接蒸發數十萬日元 - **恢復後的善後** → 給客戶道歉、追查原因、寫事後覆盤 - **小規模攻擊反覆出現導致內存耗盡** → 慢慢變卡,又找不到鍋是誰的,團隊疲憊不堪 也就是說,"放任漏洞 = 提高你哪天半夜被叫醒的概率"。這不挺可怕的嗎。 ## ④ 已公開的 7 個漏洞(一手信息彙總) 供參考,下面把 2025〜2026 年公開的 Multer HIGH severity 漏洞按時間順序整理一下。鏈接全部指向 GitHub Security Advisory(一手信息源)。 | 公開日 | CVE | 類型 | 受影響版本 | 修復版本 | |---|---|---|---|---| | 2025-05-19 | [CVE-2025-47944](https://github.com/expressjs/multer/security/advisories/GHSA-4pg4-qvpc-4q3h) | 未處理異常導致 crash | <2.0.0 | 2.0.0 | | 2025-05-19 | [CVE-2025-47935](https://github.com/expressjs/multer/security/advisories/GHSA-44fp-w29j-9vj5) | 內存/FD 洩漏 | <2.0.0 | 2.0.0 | | 2025-06-03 | [CVE-2025-48997](https://github.com/expressjs/multer/security/advisories/GHSA-g5hg-p3ph-g8qg) | 空字段名導致 crash | <2.0.1 | 2.0.1 | | 2025-07-17 | [CVE-2025-7338](https://github.com/expressjs/multer/security/advisories/GHSA-fjgf-rc76-4x9p) | 非法請求導致 crash | <2.0.2 | 2.0.2 | | 2026-02-27 | [CVE-2026-2359](https://github.com/expressjs/multer/security/advisories/GHSA-v52c-386h-88mc) | 斷連時資源未釋放 | <2.1.0 | 2.1.0 | | 2026-02-27 | [CVE-2026-3304](https://github.com/expressjs/multer/security/advisories/GHSA-xf7r-hgr6-v32p) | 清理不完全 | <2.1.0 | 2.1.0 | | 2026-03-04 | [CVE-2026-3520](https://github.com/expressjs/multer/security/advisories/GHSA-5528-5vmv-3xc2) | 深度嵌套引發遞歸暴走 | <2.1.1 | 2.1.1 | CVSS 大致集中在 7.5〜8.7 (HIGH)。multer 1.x(包含 `1.4.5-lts.2`)基本可以視作**全軍覆沒**。 ## ⑤ 對策:拯救你代碼的三步 5 分鐘就能搞定。 ### Step 1. 確認當前版本 ```bash npm ls multer # 或者 cat package.json | grep multer ``` 只要是 `1.x` 系列(含 `1.4.x`),就在受影響範圍內。 ### Step 2. 升級到最新的 2.x ```bash 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` 仍可繼續使用 - 部分被廢棄的回調已經被移除 - 文件過濾器的錯誤處理變得稍嚴格了一些 跑一下簡單的功能測試和已有的測試用例,沒報錯就完事: ```bash npm audit # 理想是出現 "found 0 vulnerabilities" ``` 如果你在 GitHub 倉庫裡啟用了 Dependabot,遇到這種漏洞公開時它會自動開 PR,還沒啟用的話推薦打開。 ## 收尾 漏洞不是誰的錯。OSS 維護者也是人,攻擊手法也每天在進化。**關鍵是把"定期把上游更新吸收進來的運維流程"嵌入到項目裡**。這往往就是從初級工程師走向資深工程師的分水嶺。 `npm install multer@latest` 這一句命令,就能大幅降低你半夜被電話叫醒的概率。現在就打開 `package.json` 看看吧。 --- **Refs(一手信息):** - [GitHub Security Advisories — expressjs/multer](https://github.com/expressjs/multer/security/advisories) - [Multer 官方倉庫](https://github.com/expressjs/multer) - [npm package: multer](https://www.npmjs.com/package/multer)