通过操纵 JavaScript 对象原型来攻击 Node.js

来自亥姆霍兹信息安全中心 (CISPA) 和瑞典皇家理工学院的研究人员分析了 JavaScript 原型污染技术的适用性,以对 Node.js 平台和基于该平台的流行应用程序发起攻击,从而导致代码执行。

原型污染方法使用 JavaScript 语言的一项功能,该功能允许您向任何对象的根原型添加新属性。 应用程序可能包含其操作受替换属性影响的代码块(小工具);例如,代码可能包含类似“const cmd = options.cmd ||”的构造。 “/bin/sh”',如果攻击者设法替换根原型中的“cmd”属性,其逻辑将被改变。

成功的攻击要求应用程序可以使用外部数据在对象的根原型中创建新属性,并且执行过程中遇到依赖于修改后的属性的小工具。 更改原型是通过处理 Node.js 中的“__proto__”和“构造函数”服务属性来完成的。 “__proto__”属性返回对象类的原型,“constructor”属性返回用于创建对象的函数。

如果应用程序代码包含赋值“obj[a][b] = value”并且这些值是从外部数据设置的,则攻击者可以将“a”设置为值“__proto__”并实现安装自己的属性对象的根原型中具有名称“b”和值“value”(obj.__proto__.b = value;),并且原型中设置的属性将在所有对象中可见。 同样,如果代码中包含“obj[a][b][c] = value”这样的表达式,通过在所有现有对象中将“a”设置为“构造函数”值,将“b”设置为“原型”,您可以定义一个名为“c”和值“value”的新属性。

更改原型的示例:const o1 = {}; const o2 = new Object(); o1.__proto__.x = 42; // 在根原型中创建属性“x” console.log (o2.x); // 从另一个对象访问属性“x” // 输出将为 42,因为根原型是通过对象 o1 更改的,对象 o2 也使用了该对象

易受攻击的代码示例: function EntryPoint (arg1, arg2, arg3){ const obj = {}; const p = obj[arg1]; p[arg2] = arg3; 返回p; }

如果 EntryPoint 函数参数由输入数据构成,则攻击者可以将值“__proto__”传递给 arg1,并在根原型中创建具有任意名称的属性。 如果向 arg2 传递值“toString”,向 arg3 传递值 1,则可以定义“toString”属性 (Object.prototype.toString=1) 并在调用 toString() 期间使应用程序崩溃。

可能导致攻击者代码执行的情况示例包括创建“main”、“shell”、“exports”、“contextExtensions”和“env”属性。 例如,攻击者可以在对象的根原型中创建“main”属性,在其中写入脚本的路径(Object.prototype.main =“./../../pwned.js”)并如果包含的包没有在 package.json 中显式定义“main”属性(如果未定义该属性,它将从根原型中获得)。 “shell”、“exports”和“env”属性可以类似地替换:let rootProto = Object.prototype; rootProto["exports"] = {".":"./changelog.js"}; rootProto["1"] = "/path/to/npm/scripts/"; // 触发调用 require("./target.js"); Object.prototype.main = "/path/to/npm/scripts/changelog.js"; Object.prototype.shell = "节点"; Object.prototype.env = {}; Object.prototype.env.NODE_OPTIONS = "—inspect-brk=0.0.0.0:1337"; // 触发调用 require("bytes");

研究人员分析了 10 个依赖项最多的 NPM 包,发现其中 1958 个在 package.json 中没有 main 属性,4420 个在 require 语句中使用相对路径,355 个直接使用命令替换 API。

一个可行的示例是用于攻击覆盖 evalFunctions 属性的 Parse Server 后端的漏洞。 为了简化此类漏洞的识别,开发了一个结合静态和动态分析方法的工具包。 在 Node.js 测试期间,发现了 11 个小工具,可用于组织攻击,从而导致攻击者代码的执行。 除了 Parse Server 之外,NPM CLI 中还发现了两个可利用的漏洞。

来源: opennet.ru

添加评论