最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何识别 原型污染Prototype Pollution 安全漏洞及其防御措施
时间:2026-06-04 10:12:27 编辑:袖梨 来源:一聚教程网
原型污染漏洞源于JavaScript原型继承机制被恶意篡改,攻击者通过不安全的对象合并、深拷贝或动态赋值将__proto__等敏感键注入Object.prototype,影响所有对象行为;典型场景包括lodash.merge处理用户输入、手动递归赋值未过滤敏感键、JSON.parse后直接合并及动态路径赋值。
识别原型污染漏洞,关键在于发现代码中是否允许用户输入直接影响对象原型链。它不依赖复杂利用链,往往一个合并操作、一次反序列化或一段动态赋值就可能触发。
哪些代码行为容易暴露原型污染风险
以下几类操作是典型高危入口,需逐行审查:
- 使用
_.merge、_.set、_.defaultsDeep(lodash ≤4.17.20)等函数处理用户提交的 JSON、查询参数或表单数据 - 手动实现递归赋值逻辑,例如
for (let key in source) target[key] = source[key],且未过滤__proto__、constructor、prototype - 对
JSON.parse()结果不做清洗,直接合并进配置对象或路由参数容器 - 用点号或方括号动态设置属性,如
obj[path] = value,其中path来自 URL 或请求体(例如"a.__proto__.b")
快速验证是否存在污染(本地检测方法)
在开发或测试环境运行以下检查,能直观确认系统是否已受污染:
- 执行
JSON.parse('{"__proto__":{"polluted":true}}'),再检查({ }).polluted === true是否成立 - 尝试
JSON.parse('{"constructor":{"prototype":{"xss":1}}}'),随后验证({}).xss === 1 - 若返回
true,说明原型已被写入,当前环境存在可利用漏洞
防御措施要落在具体动作上
防护不是加一层“安全中间件”,而是贯穿输入解析、对象操作、运行时环境三个环节:
-
输入层强制清洗:所有外部数据进入业务逻辑前,递归遍历并删除含
__proto__、constructor、prototype的键路径,正则推荐/b(__proto__|constructor|prototype)b/i -
对象创建改用安全基底:需要纯键值容器时(如缓存、参数映射),统一用
Object.create(null)替代{},避免继承污染源头 -
合并/拷贝操作降级或加固:优先用
Object.assign({}, input)(浅拷贝);必须深拷贝时,选用structuredClone()(现代环境)或自研函数跳过敏感键 -
依赖版本锁定:lodash 必须 ≥4.17.21;deepmerge 确认启用默认防护;禁用
--disable-proto=delete类 Node.js 启动参数
上线后仍需持续监控
防御不能止于代码修复,真实攻击常绕过静态检查:
- 在日志中对所有
JSON.parse、req.body、fs.readFileSync入口添加字段扫描,命中敏感键立即告警 - 预发环境定期注入 payload(如
{"__proto__":{"isAdmin":true}}),验证是否被静默接受 - ESLint 集成
eslint-plugin-security,标记_.merge、JSON.parse后无清洗的调用位置
相关文章
- 谷歌邮箱账号格式怎么写 06-04
- 阿里巴巴国际站入驻费用详解 - 2026年最新收费标准 06-04
- llama.cpp 修复 Gemma 4 统一 FPE 问题 06-04
- 扩散大语言模型遭结构感知自适应攻击MaskForge越狱 06-04
- 小米8透明探索版手机 - 经典旗舰机型回顾 06-04
- DeepSeek-V4 初始化兼容性修复:解决 CUTLASS fmin 问题 06-04