【漏洞预警】jQuery 前端库出现罕见的原型污染漏洞,影响范围广泛(含技术分析)
字数 1499 2025-08-18 11:38:28
jQuery 原型污染漏洞 (CVE-2019-11358) 技术分析与防御指南
一、漏洞概述
CVE编号:CVE-2019-11358
漏洞类型:原型污染(Prototype Pollution)
影响范围:jQuery 3.4.0之前的所有版本
披露时间:2019年3月26日
严重性:高危
影响面:全球约70%的网站使用jQuery,其中许多仍在使用易受攻击的旧版本
二、技术背景
1. jQuery简介
jQuery是一个快速、小巧且功能丰富的JavaScript库,它简化了HTML文档遍历、事件处理、动画和Ajax操作。其特点包括:
- 跨浏览器兼容性
- 链式语法
- 丰富的插件生态系统
- 广泛应用于前端开发
2. 原型污染概念
原型污染是一种JavaScript特有的安全漏洞,攻击者通过修改JavaScript对象的原型(prototype)来实现恶意目的。其核心原理:
- JavaScript对象通过原型链继承属性和方法
- 当访问对象属性时,若对象本身没有该属性,会沿原型链向上查找
- 攻击者可通过特殊属性名
__proto__直接修改原型对象 - 污染后,所有继承该原型的对象都会受到影响
三、漏洞详细分析
1. 漏洞触发条件
漏洞主要出现在使用jQuery.extend()进行深度对象合并时:
// 危险用法
var newObject = jQuery.extend(true, {}, JSON.parse(maliciousObject));
2. 攻击向量示例
示例1:权限提升
var payload = '{ "myProperty": "a", "__proto__": { "isAdmin": true } }';
var newObject = jQuery.extend(true, {}, JSON.parse(payload));
// 污染后效果
console.log({}.isAdmin); // 返回true
示例2:函数劫持
let payload = `[
{ "cool-package": { "license": "MIT" } },
{ "__proto__": { "toString": "malicious code" } }
]`;
let packages = JSON.parse(payload);
// 处理逻辑会污染原型
console.log({}.toString()); // 执行恶意代码
3. 漏洞原理
JSON.parse()会将__proto__视为普通属性而非原型引用jQuery.extend()在深度合并时,会将__proto__属性值复制到目标对象的原型上- 导致所有后续创建的对象都继承被污染的属性
四、影响范围评估
1. 直接影响
- 使用jQuery进行复杂前端逻辑处理的网站
- 依赖jQuery处理用户提供的JSON数据的应用
- 使用jQuery进行深度对象合并的操作
2. 潜在风险
- 权限提升:如示例中的
isAdmin篡改 - 敏感信息泄露:通过污染原型访问敏感数据
- 拒绝服务:覆盖关键函数导致应用崩溃
- 远程代码执行:在特定条件下可能实现
3. 现实限制
- 需要针对每个目标定制攻击载荷
- 需要了解目标应用的原型使用方式
- 仅用于简单UI操作的jQuery不受此漏洞影响
五、防御措施
1. 立即措施
- 升级jQuery:更新至3.4.0或更高版本
- 检查依赖:确保所有依赖的jQuery插件也更新
2. 编码实践
安全的对象合并:
// 使用Object.create(null)创建无原型的对象
var safeObj = Object.create(null);
jQuery.extend(true, safeObj, userInput);
// 或使用现代JavaScript的展开运算符
const merged = {...defaults, ...userInput};
输入验证:
function sanitizeInput(obj) {
if (obj.hasOwnProperty('__proto__')) {
throw new Error('Prototype pollution attempt detected');
}
// 其他验证逻辑
}
3. 长期策略
- 使用
Map代替普通对象存储键值对 - 避免使用方括号表示法访问不确定属性
- 对用户提供的JSON数据进行严格过滤
- 考虑迁移到现代前端框架(Vue/React等)
六、漏洞修复方案
1. jQuery官方修复
jQuery 3.4.0中修复了此漏洞,主要修改:
- 在
jQuery.extend()中添加原型污染检查 - 特殊处理
__proto__属性
2. 向后兼容方案
对于无法立即升级的项目,可应用以下补丁:
// 重写jQuery.extend方法
var originalExtend = jQuery.extend;
jQuery.extend = function() {
if (arguments[0] === true) {
for (var i = 2; i < arguments.length; i++) {
if (arguments[i] && arguments[i].hasOwnProperty('__proto__')) {
throw new Error('Prototype pollution attempt detected');
}
}
}
return originalExtend.apply(this, arguments);
};
七、相关资源
八、总结
jQuery原型污染漏洞(CVE-2019-11358)是一个影响广泛的前端安全漏洞,攻击者可通过精心构造的JSON数据污染JavaScript原型链,导致各种安全问题。虽然修复方案已发布,但由于jQuery的广泛使用和升级惰性,许多网站仍面临风险。开发者应当:
- 立即评估应用风险
- 优先升级jQuery版本
- 实施防御性编码实践
- 长期考虑技术栈现代化
通过综合应用技术升级和编码规范,可有效防范此类原型污染攻击。