javascript中不存在独立的“数组原型污染”漏洞,真正风险源于非法修改array.prototype,它属于原生对象原型污染,但因所有数组实例共享该原型,修改会全局生效,危害路径与object.prototype不同且更易被忽略。

数组的原型污染本身不直接存在——JavaScript中没有“数组原型污染”这一独立漏洞类型。真正风险来自对 Array.prototype 的非法修改,它属于更广义的原生对象原型污染,但危害路径和表现与 Object.prototype 污染不同,也更容易被忽略。
为什么 Array.prototype 被动修改会引发全局风险
所有数组实例(如 []、new Array()、Array.from() 返回值)都共享 Array.prototype。一旦该原型被注入或覆盖方法,所有数组行为将统一改变:
- 攻击者添加
Array.prototype.exec = function() { /* 恶意代码 */ },后续任意数组调用[].exec()都会触发 - 覆盖
Array.prototype.push或map,可能劫持数据处理逻辑、窃取参数、注入副作用 - 重写
toString或join,影响日志输出、序列化、模板渲染,甚至绕过内容安全策略(CSP)
典型触发场景:看似无害的操作实则危险
以下代码模式常在业务中出现,却可能成为污染入口:
-
动态扩展 Array.prototype:如插件系统允许用户传入方法名并绑定到
Array.prototype,且未校验方法名是否为内置属性(length、constructor、__proto__) - 不加过滤的对象合并波及数组原型:使用存在缺陷的工具函数(如旧版 lodash)将用户输入合并进全局配置对象,而该配置又被用于批量修改原型链
-
JSON 解析后误赋值到 Array.prototype:例如解析用户提交的配置
{"push": "malicious"},再执行Object.assign(Array.prototype, config) -
eval 或 Function 构造器执行用户字符串:若字符串含
Array.prototype.xxx = ...,可直接写入
快速识别是否已被污染的验证方式
在浏览器控制台或 Node.js REPL 中运行以下检查,能立即暴露异常:
-
Array.prototype.hasOwnProperty('isAdmin')→ 若返回true,说明已被注入非标准属性 -
typeof Array.prototype.map === 'function'→ 若为'string'或undefined,说明关键方法被覆盖 -
console.log([1,2,3].toString())→ 对比预期输出("1,2,3"),异常结果暗示toString被篡改 -
Object.getOwnPropertyNames(Array.prototype).length→ 与标准值(现代 Chrome 约 35–38 个)明显偏差,提示有额外属性
防御要点:比 Object.prototype 更需主动拦截
Array.prototype 比 Object.prototype 更“敏感”,因为它的方法常被框架/库高频调用,污染后更易触发连锁故障:
- 禁止任何运行时对
Array.prototype的增、删、改操作,尤其避免Object.assign(Array.prototype, ...)或Array.prototype[key] = value - 对所有动态方法注册逻辑做白名单校验,只允许明确声明的扩展名(如
chunk、compact),拒绝push、map、constructor等关键词 - 在应用启动时冻结:
Object.freeze(Array.prototype)(注意:部分老环境不支持,需降级兼容) - 使用 ESLint 规则
no-extend-native强制拦截Array.prototype.xxx =类写法










