直接回答:原型链污染指攻击者通过可控的对象合并或递归赋值,借 __proto__ 键往 Object.prototype 写入属性,污染所有对象。浏览器端可升级为 XSS;Node.js 服务端更危险——污染属性一旦被当作配置使用(如 child_process 选项),就可能升级为 RCE。
展开解析:触发点集中在递归 merge(如 lodash.merge 历史 CVE)、深拷贝、路径赋值三类。解析 {"__proto__": {"isAdmin": true}} 时,若实现不拦截 __proto__、constructor、prototype 三个危险键,写入就落到 Object.prototype 上,之后所有对象都带上该属性。
// k 为 '__proto__' 时污染原型
for (const k in src) dst[k] = src[k];
防御:merge 时跳过危险键;用户键值用 Object.create(null) 或 Map 存放;依赖审计关注 merge/set 类库的 CVE。
追问方向:__proto__ 与 constructor.prototype 两条污染路径的区别?如何在 Node 中寻找可利用的 gadget?
(约 400 字)