Axios 原型污染嵌套对象漏洞:攻击者借 auth 与 paramsSerializer 注入敏感请求

CVE-2026-67319 是 axios 中一款中危原型污染 Gadget 漏洞。当应用的其他组件污染 Object.prototype 后,传入 auth:{} 或 paramsSerializer:{} 空对象会导致攻击者注入 Authorization: Basic 头或篡改查询字符串。本文详解漏洞原理、PoC、影响范围与缓解方案,帮助开发者加固 axios 请求配置安全。

🔓 Medium 漏洞利用

Axios 在合并请求配置时,对嵌套对象(如 auth、paramsSerializer)使用普通对象克隆,导致在 Object.prototype 已被污染的环境下,应用传入空对象占位符时,攻击者可通过继承属性注入 Authorization 头或篡改查询字符串。该漏洞要求进程内已有其他原型污染原语,且仅影响传入受影响嵌套配置的请求。

来源:OSV | 2026-07-20 | 原文链接

🔍 关键发现

  • axios 的 mergeConfig 仅对顶层配置使用 null 原型保护,嵌套对象克隆仍用普通 {},导致继承属性可被读取。
  • 攻击者可通过污染 Object.prototype.username/password 实现 Basic 认证头静默注入,或通过污染 serialize/encode 篡改或替换请求查询字符串。
  • 不受影响的请求包括未提供 auth 或 paramsSerializer 的请求,以及已显式设置自有属性的请求,并非所有 axios 请求均受影响。

⚔️ 攻击链分析

1. 攻击者利用应用中的其他漏洞或依赖原型污染 Object.prototype,注入 username、password、serialize 等属性。 2. 受害者调用 axios.get(..., { auth: {}, paramsSerializer: {} }) 等带空嵌套对象的请求。 3. axios 克隆嵌套对象时保留原型链,下游代码通过点访问读取到污染物。 4. 请求发出时自动携带被污染的 Authorization: Basic 头或序列化为攻击者控制的查询字符串。

🚩 失陷指标 (IOC)

  • Object.prototype.username 被恶意赋值
  • Object.prototype.password 被恶意赋值
  • Object.prototype.serialize 被恶意赋值为函数
  • Object.prototype.encode 被恶意赋值

🛡️ 缓解建议

  • ✅ 升级至已修复的 axios 版本(包含完整嵌套对象 null 原型处理)。
  • ✅ 避免在请求配置中传空占位符对象,如 auth: {} 或 paramsSerializer: {};如果不需认证或自定义序列化,请移除相关配置。
  • ✅ 在应用层加固,使用 Object.freeze(Object.prototype) 或及时修复导致原型污染的其他组件漏洞。

涉及漏洞:["CVE-2026-67319"]


⚠️ 本文仅供安全研究与学习,IOC 信息请勿用于非法目的。

🤖 常见问题解答(FAQ)

❓ 攻击者如何利用该漏洞?

攻击者必须先通过其他方式污染 Object.prototype(如 JSON.parse 漏洞),再诱导应用发送带有空 auth/paramsSerializer 对象的请求,即可注入 Basic 认证头或篡改查询字符串。

❓ 为什么 axios 顶层配置已加固但仍受影响?

mergeConfig 使用 Object.create(null) 创建顶层合并对象,但嵌套对象克隆时仍用 utils.merge({}, source),产生普通对象实例,因此继承自 Object.prototype 的属性会被后续代码读取。

❓ 如何检测是否被该漏洞攻击?

检查请求日志中是否出现非预期的 Authorization 头或查询字符串。同时审计应用代码中是否存在未修复的原型污染源(如 unsafe JSON.parse 合并、递归 merge 未做防护)。

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)