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(一手信息):