Node.js 易受新型 HTTP 請求夾帶技術攻擊
PortSwigger 網站近日報道了 Node.js 存在兩個HTTP 請求夾帶(HTTP request smuggling,簡稱 HRS)攻擊漏洞,并指出其中一個漏洞似乎使用了新的 HRS 技術。
HTTP 請求夾帶技術是由一個或多個用戶同時對目標網站服務器發起大量請求,通過構造特殊結構請求,干擾網站服務器對請求的處理(主要是干擾 HTTP 請求序列),從而實現攻擊目標。
據介紹,這些漏洞由 Mattias Grenfeldt 和 Asta Olofsson 在瑞典 KTH 皇家理工學院計算機科學學士學位論文研究中發現。Grenfeldt 稱,剛開始他們在六個開源 Web 服務器和六個開源代理中尋找 HTTP 請求夾帶漏洞。Node.js 就是其中被調查的項目之一,但他們當時沒有發現任何問題。經過一段時間后,在報告項目中發現的其他問題時,他們偶然發現了 Node.js 的這兩個漏洞。
漏洞之一 CVE-2021-22959 使用了常見的 HRS 技術,它通過利用 HTTP 請求中 header 允許存在空格的特性,從而進行 HTTP 請求夾帶攻擊。因為 HTTP 解析器接受在 header 名稱之后和冒號之前帶有空格的請求。
Grenfeldt 解釋道,這種 HRS 技術十分常見,在這種情況下,Node.js 會將 ‘Content-Length : 5’ 解釋為 ‘Content-Length: 5’,如果與忽略此類 header 且未經修改地轉發它們的代理結合使用,則有可能會被用于 HRS 攻擊。
而另一個漏洞 CVE-2021-22960 似乎使用了新的 HRS 技術,其通過結合代理中的錯誤行終止和 Node.js 中塊擴展的錯誤解析,從而進行 HTTP 請求夾帶攻擊。
Grenfeldt 和 Olofsson 發現易受攻擊的代理往往會查找單個換行符 (LF) 來終止包含塊大小的行,但沒有像往常一樣檢查 LF 之前是否有回車。
“就在此行終止之前是很少使用的塊擴展功能的地方。在塊擴展中,開發者可以在塊大小之后指定額外的參數,例如‘a=b’。然而,很少在系統中實現對此的解析,而許多情況會允許該區域中的任何字節“,Grenfeldt 繼續解釋道。
最后,Grenfeldt 和 Olofsson 于 6 月 19 日至 20 日反饋了這些問題,Node.js 于 10 月 12 日發布了修復程序。