CVE-2026-39806Bandit是一个Elixir HTTP服务器库,存在无限循环漏洞。由于其HTTP/1.1分块传输解析器未正确处理RFC规范允许的尾部字段,导致处理特定请求时进入死循环。未经认证的远程攻击者可利用此漏洞发送少量特制连接,耗尽服务器工作进程池,从而造成服务完全拒绝响应。
漏洞根源位于`lib/bandit/http1/socket.ex`文件的`do_read_chunked_data!/5`函数中。该函数在解析分块编码数据时,错误地假设最后一个分块标记`0\r\n`必须紧接空行`\r\n`。然而,根据RFC 9112 §7.1.2规范,两者之间允许存在零个或多个trailer字段。当存在trailer时,代码无法匹配任何处理分支,进入catch-all分支。此时计算出的`to_read`数值为负,导致`read_available!/2`超时并返回空数据。函数随后带着未改变的状态进行尾递归调用,形成无限循环。由于Elixir进程在处理此循环时无法被抢占,攻击者只需维持若干并发连接即可耗尽Bandit的工作进程池,使服务器无法处理新请求。