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