axios 原型链污染读取侧漏洞:可致 HTTP 头注入与同步崩溃 DoS
axios 1.15.2 存在两个读取侧原型链污染漏洞(CVE-2026-44490),可导致 HTTP 头注入与同步崩溃 DoS。攻击者通过上游漏洞污染 Object.prototype 后,axios 会静默读取污染值,注入恶意请求头或抛出 TypeError 崩溃。本文分析漏洞原理、攻击链及缓解措施,建议升级至 1.15.3+。
🔓 Medium 漏洞利用
axios 1.15.2 版本中存在两个读取侧原型链污染(read-side prototype pollution)漏洞(CVE-2026-44490)。攻击者可利用上游依赖(如 lodash 的 CVE-2018-16487)污染 Object.prototype,从而在 axios 发起的请求中注入任意 HTTP 头,或通过污染 get/set 属性导致所有请求同步抛出 TypeError 崩溃。
来源:OSV | 2026-05-29 | 原文链接
🔍 关键发现
- axios 的 merge() 函数使用普通对象字面量作为累加器,导致读取操作会遍历原型链,将污染后的属性值复制到合并后的 headers 中,实现 HTTP 头注入。
- mergeConfig.js 中 Object.defineProperty 的 descriptor 为普通对象,其 get/set 属性会从原型链读取,若被污染为非函数则立即抛出 TypeError,造成所有请求同步崩溃。
- 污染 Object.prototype.common 可影响所有请求方法,污染 delete/head/post/put/patch/query 则影响对应方法;污染 get/set 直接导致崩溃,且崩溃类型为 TypeError 而非 AxiosError,绕过错误处理逻辑。
⚔️ 攻击链分析
1. 攻击者通过上游漏洞(如 lodash.merge)污染 Object.prototype 的特定属性(如 common、get、set)。 2. 当应用使用 axios 发起请求时,axios 内部 merge() 或 mergeConfig() 从原型链读取污染值。 3. 若污染 common 等属性,恶意 HTTP 头(如 Content-Length: 99999、Transfer-Encoding: chunked、If-None-Match: *)被注入请求,导致服务端挂起、CL+TE 冲突或响应抑制。 4. 若污染 get/set,每个 axios 请求立即抛出 TypeError 崩溃,造成拒绝服务。
🚩 失陷指标 (IOC)
异常 HTTP 请求头:Content-Length: 99999、Transfer-Encoding: chunked、If-None-Match: *客户端日志中出现 TypeError: Getter must be a function 或 Setter must be a function 且非 AxiosError
🛡️ 缓解建议
- ✅ 升级 axios 至 1.15.3 及以上版本,修复使用 null-prototype 对象代替普通对象字面量。
- ✅ 修复上游依赖中的原型链污染漏洞,如升级 lodash 至 4.17.11+ 以修复 CVE-2018-16487。
- ✅ 在生产环境中对传入的不可信数据使用 Object.create(null) 或 Map 来避免原型链污染。
涉及漏洞:["CVE-2026-44490"]
⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。
🤖 常见问题解答(FAQ)
❓ 该漏洞是否需要攻击者已拥有代码执行权限?
不需要。攻击者只需通过任意上游依赖的原型链污染漏洞(如 lodash merge)污染 Object.prototype,即可触发 axios 的读取侧漏洞。
❓ 为什么崩溃是 TypeError 而非 AxiosError?
因为崩溃发生在 Object.defineProperty 内部,抛出的是原生 TypeError,而非 axios 封装的 AxiosError。应用若仅通过 error.isAxiosError 判断错误类型,将无法正确处理。
❓ 如何检测是否受影响?
检查 axios 版本是否为 1.15.2 及以下;检查上游依赖是否使用了 lodash <= 4.17.10 等已知原型链污染组件;监控请求中是否出现异常 HTTP 头。