CVE-2026-40561Starlet是Perl语言的一个高性能HTTP服务器实现。在0.31及之前的版本中存在一个安全漏洞,涉及HTTP请求头优先级的错误处理。当请求中同时包含“Content-Length”和“Transfer-Encoding: chunked”这两个头部时,Starlet错误地优先处理了Content-Length。根据RFC 7230第3.3.3节的规定,Transfer-Encoding应当拥有最高优先级。这种不一致性导致攻击者可以通过精心构造恶意请求,绕过前端反向代理的安全检查,将恶意请求“走私”到后端服务器,从而引发潜在的安全风险,如缓存投毒或会话劫持。
该漏洞的根本原因在于Starlet在解析HTTP请求消息体时未能正确遵循RFC 7230标准。标准的HTTP/1.1协议规定,当请求中同时存在Transfer-Encoding和Content-Length时,服务器必须忽略Content-Length,仅根据Transfer-Encoding(通常是chunked)来读取数据。然而,Starlet的旧版本实现逻辑相反,优先使用了Content-Length。攻击者利用这一点,可以向Starlet发送一个包含冲突头部的请求。对于前端反向代理(如Nginx或HAProxy),它们通常遵循RFC标准,优先解析Transfer-Encoding,从而认为请求主体结束;但对于后端的Starlet,它根据Content-Length读取,导致读取到代理认为已结束的数据包中的剩余部分作为下一个请求的开始。这种请求走私攻击可能导致后端应用状态混乱、绕过WAF检测、缓存污染,或在特定条件下导致未授权操作。