研究人員在下載量超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對象和結構。
通過逆向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/