# 一个请求就能让你的服务器宕机?为什么不能放任 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)