CVE-2019-10768

ReDoS 漏洞
影响
AngularJS
<1.7.9
AngularJS
感叹号圆圈图标
补丁可用
HeroDevs 提供的 Never-Ending Support (NES) 版本已修复此漏洞。

复制步骤

AngularJS 中用于将多个对象合并为一个新对象的 merge() 函数存在此高级别漏洞。该命令可用于添加或修改 Object.prototype 的属性。 

Javascript 允许合并对象的所有属性,包括神奇的 __proto__ 属性、构造函数和原型。特别是利用这个漏洞,可以合并 __proto__ 属性,从而改变 Object.prototype 并暴露漏洞。由于 Object.prototype 属性被所有 Javascript 对象继承,因此攻击者有很大的空间来影响代码执行。这可能会导致远程代码执行,甚至通过触发 Javascript 异常来拒绝服务。

GitHub 上阅读更多内容。

解决问题

该漏洞存在于版本 1.7.9 之前的所有 AngularJS 版本中。对于那些无法升级的用户,HeroDevs Never-Ending Support for AngularJS 的客户可以访问与 Angular 1.5 兼容的固定版本 AngularJS。 易受攻击的目标是

  • 网络服务器
  • 应用服务器
  • 网络浏览器。

学习与预防

有几种方法可以帮助防止此类攻击:

  1. 冻结原型使用 Object.freeze(Object.prototype)是一种极端的操作,会严重削弱程序的灵活性,但它可以防止此类攻击。
  2. 要求模式验证。 可以对 JSON 输入进行扫描("消毒"),使其不包含 __proto__ 属性。
  3. 避免使用不安全的递归合并函数。这一建议虽然有效,但适用性有限,因为问题并不在于递归合并函数的性质--问题在于合并()函数(无论是否递归)盲目地将危险属性复制到 Object.prototype。
  4. 使用不带原型的对象。可以考虑使用 Object.create(null)、代理对象或自定义类来创建不使用原型的对象。不继承 Object.prototype 的对象不会受到污染。
  5. 使用数组和 map()。与其使用对象和 merge(),不如使用数组和 map() 函数,以完全避免原型污染的可能性。

结论

1.7.9 中已修复了此漏洞,仍在使用 Angular 1.5 的 HeroDevs AngularJS 永无止境支持客户也可立即使用此漏洞。如果您希望获得支持以避免代价高昂的潜在攻击,请立即联系 HeroDevs

资源

NIST BDSA-2019-10768条目

漏洞详情
身份证
CVE-2019-10768
受影响的项目
AngularJS
受影响的版本
<1.7.9
≈ 固定日期
2019 年 11 月 1 日
固定在
严重性
类别
ReDoS 漏洞