复制步骤
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。 易受攻击的目标是
- 网络服务器
- 应用服务器
- 网络浏览器。
学习与预防
有几种方法可以帮助防止此类攻击:
- 冻结原型使用 Object.freeze(Object.prototype)是一种极端的操作,会严重削弱程序的灵活性,但它可以防止此类攻击。
- 要求模式验证。 可以对 JSON 输入进行扫描("消毒"),使其不包含 __proto__ 属性。
- 避免使用不安全的递归合并函数。这一建议虽然有效,但适用性有限,因为问题并不在于递归合并函数的性质--问题在于合并()函数(无论是否递归)盲目地将危险属性复制到 Object.prototype。
- 使用不带原型的对象。可以考虑使用 Object.create(null)、代理对象或自定义类来创建不使用原型的对象。不继承 Object.prototype 的对象不会受到污染。
- 使用数组和 map()。与其使用对象和 merge(),不如使用数组和 map() 函数,以完全避免原型污染的可能性。
结论
1.7.9 中已修复了此漏洞,仍在使用 Angular 1.5 的 HeroDevs AngularJS 永无止境支持客户也可立即使用此漏洞。如果您希望获得支持以避免代价高昂的潜在攻击,请立即联系 HeroDevs。
资源
注册提醒
每当我们支持的开源软件修复了新的漏洞,我们就会发出警报。