01 背景描述
Lodash 是一个 JavaScript 库,包含简化字符串、数字、数组、函数和对象编程的工具,可以帮助程序员更有效地编写和维护 JavaScript 代码。并且是一个流行的 npm 库,仅在GitHub 上就有超过 400 万个项目使用,Lodash的普及率非常高,每月的下载量超过 8000 万次。近期被爆出一个严重的原型污染漏洞。

02 漏洞列表
CVE ID : CVE-2019-10744
漏洞等级: 高危
CVSS评分: 7.3
影响范围: 4.17.11之前的所有版本

03 漏洞详情
通过构造函数重载的方式,Lodash 库中的函数 defaultsDeep 很有可能会被欺骗添加或修改 Object.prototype 的属性,最终可能导致 Web 应用程序崩溃或改变其行为,具体取决于受影响的用例。

  1. const mergeFn = require('lodash').defaultsDeep;const payload = '{"constructor": {"prototype": {"a0": true}}}'
  2. function check() { mergeFn({}, JSON.parse(payload)); if (({})[`a0`] === true) { console.log(`Vulnerable to Prototype Pollution via ${payload}`); } }
  3. check();

原型污染是一个影响 JavaScript 的漏洞。原型污染是指将属性注入现有 JavaScript 语言构造原型(如对象)的能力。JavaScript 允许所有对象属性被更改,例如如_proto_constructorprototype。攻击者通过注入其它值来操纵这些属性来覆盖或污染基础对象的 JavaScript 应用程序对象原型。这样很可能会影响应用程序通过原型链处理 JavaScript 对象的过程,从而导致拒绝服务或远程代码执行。
原型污染的两种主要方式:

  • 不安全的Object递归合并
  • 按路径定义属性

    不安全的对象递归合并

    易受攻击的递归合并函数的逻辑遵循以下高级模型:
    1. merge (target, source)
    2. foreach property of source
    3. if property exists and is an object on both the target and the source
    4. merge(target[property], source[property])
    5. else
    6. target[property] = source[property]

当源对象包含名为_proto_defined with Object.defineProperty()的属性时,检查属性是否存在并且是目标和源传递上的对象的条件,并且合并将与目标进行递归,作为原型Object和源的Object定义。
然后攻击者在 Object原型上复制属性。
克隆操作是一个特殊的不安全递归合并子类,它发生在对空对象进行递归合并时:merge({},source)
`lodash` 和 `Hoek` 是易受递归合并攻击影响。

按路径定义属性

有一些 JavaScript 库使用 API 根据给定路径定义对象的属性值。通常受影响的函数包含此签名:theFunction(object, path, value)
如果攻击者可以控制“路径”的值,则可以将此值设置为_proto_.myValue
防范措施

  • 冻结 Object.prototype ,使原型不能扩充属性
  • 建立 JSON schema
  • 规避不安全的递归性合并函数
  • 使用无原型对象,打破原型链并防止污染。
  • 采用新的 Map 数据类型,代替 Object 类型

虽然原型污染漏洞影响非常严重,但是攻击者想要利用它并没有那么容易,他们需要深入了解每个 Web 应用的工作原理。

04 修复建议
建议升级lodash到4.17.12

05 参考链接
https://snyk.io/blog/snyk-research-team-discovers-severe-prototype-pollution-security-vulnerabilities-affecting-all-versions-of-lodash/
https://snyk.io/vuln/SNYK-JS-LODASH-450202
https://snyk.io/blog/snyk-research-team-discovers-severe-prototype-pollution-security-vulnerabilities-affecting-all-versions-of-lodash/
https://snyk-rules-pre-repository.s3.amazonaws.com/snapshots/master/patches/npm/lodash/20190702/lodash_20190702_0_0_1f8ea07746963a535385a5befc19fa687a627d2b.patch