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 日发布了修复程序。