研究人员在下载量超700万的Node.js 模块中发现其存在安全漏洞,攻击者利用该漏洞可以发起DoS 攻击或完全获取远程shell 访问权限。
该漏洞CVE编号为CVE-2020-7699,位于express-fileupload npm组件中,该组件从npm处下载量超过730万,其中不含有从GitHub、镜像网站和其他克隆库中下载的。
该漏洞属于Prototype Pollution(原型污染)漏洞类型,这是JS代码中的常见漏洞类型。因为JS是基于原型的语言,语言中的每个对象、函数和数据结构都有Prototype特征,可以通过"_proto__"进行修改。
使用这种设计漏洞的原型攻击通过注入不相适应的对象类型到现有的对象中来引发错误,导致DoS攻击。
利用现有原型的攻击
由于express-fileupload 提供的"parseNested"特征使得现实的攻击成为可能。启用"parseNested"选项后,其负责将上传的JSON数据转化为对象。
安全研究人员Posix称express-fileupload 模块提供了[Node.js] 应用中上传和管理文件的多个选项,其中parseNested负责将参数降维。
'parseNested'选项如下图所示:
有漏洞的express-fileupload配置
在"Content-Disposition" HTTP header中提供一个简单的payload,攻击者就可以提供一个"__proto__.toString" 值来触发攻击。
可以触发原型污染攻击的样本payload
"_proto__" 可以影响JS的原型特征,因为继承了所有JS对象和结构。
如果Object.prototype.toString 可以被污染,就会引发错误,对每个请求,[sic]会返回500错误。
通过逆向shell实现远程代码执行
此外,攻击者还可以在有漏洞的系统上获取shell。该漏洞利用了有漏洞的express-fileupload 版本,使用了模板引擎EJS(嵌入式JS模板)。
假设你的应用使用了EJS 来分析上传的数据,而没有进行额外的检查。那么攻击者就可以发送一个HTTP 请求来覆写EJS的outputFunctionName 选项。
远程代码执行的EJS payload
上面的payload中利用了express-fileupload 中的原型污染,让EJS 来启动Node.js 子进程。新启动的进程可以派生一个逆向shell到攻击者的计算机。
建立连接后,攻击者就可以在被黑的服务器上执行任意代码。
通过EJS payload实现shell 访问
漏洞影响
研究人员称该漏洞并不影响所有用户。只有启动了"parseNested" 选项的应用受到该原型污染漏洞的影响。
此外,为了实现完全的shell访问和远程代码执行,有漏洞的express-fileupload和EJS库是必备条件。但需要注意的是EJS 并不是唯一实现shell 访问的唯一库。在接收到研究人员的报告后,express-fileupload很快就修复了该漏洞,用户可以更新到npm v1.1.9。
本文翻译自:https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/如若转载,请注明原文地址: