IPBUF安全漏洞报告
English
CVE-2026-34831 CVSS 4.8 中危

CVE-2026-34831 Rack Content-Length计算错误致响应去同步

披露日期: 2026-04-02

漏洞信息

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

相关标签

RackRubyHTTP响应走私CVE-2026-34831响应去同步UTF-8

漏洞概述

Rack 是 Ruby 模块化 Web 服务器接口。在特定版本前,Rack::Files#fail 方法设置 Content-Length 时错误使用了 String#size 而非 String#bytesize。当响应体含多字节 UTF-8 字符时,声明长度小于实际字节数,导致 HTTP 响应帧错误,可能引发响应去同步。

技术细节

该漏洞的核心在于 Ruby 中字符串字符数与字节数的混淆。String#size 返回字符数,String#bytesize 返回实际网络传输字节数。对于多字节 UTF-8 字符,两者存在差异。攻击者可请求不存在的路径并注入百分比编码的多字节字符,触发 Rack 返回 404 响应。由于路径被反射到响应体中,且 Content-Length 基于字符数计算(偏小),而实际传输基于字节数,导致 HTTP 响应截断。这会使得后续连接中的数据被错误解析,从而实现 HTTP 请求走私或缓存投毒。

攻击链分析

STEP 1
侦察
识别目标应用使用的 Ruby Rack 版本是否在受影响范围内(< 2.2.23, < 3.1.21, < 3.2.6)。
STEP 2
构造载荷
构造一个包含百分比编码多字节 UTF-8 字符的 URL 路径(如 %E2%9C%93),确保该路径不存在以触发 404 响应。
STEP 3
发送请求
向目标服务器发送精心设计的 HTTP 请求,诱导服务器在错误页面中反射请求路径。
STEP 4
触发漏洞
服务器计算 Content-Length 时使用字符数而非字节数,导致响应头长度声明与实际发送的数据体长度不一致。
STEP 5
利用后果
前端代理或客户端因长度不匹配导致解析错误,可能将后续请求的响应内容解析为当前请求的一部分,造成响应走私或数据泄露。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target URL vulnerable to CVE-2026-34831 # The character '✓' is represented by 3 bytes (%E2%9C%93) but has a size of 1 character. url = "http://localhost:9292/%E2%9C%93" try: response = requests.get(url) declared_len = response.headers.get('Content-Length') actual_bytes = len(response.content) print(f"[+] Request sent to: {url}") print(f"[+] Declared Content-Length: {declared_len}") print(f"[+] Actual Response Bytes: {actual_bytes}") if declared_len and int(declared_len) < actual_bytes: print("[!] Vulnerability confirmed: Content-Length mismatch detected.") else: print("[-] Vulnerability not detected or patched.") except Exception as e: print(f"Error: {e}")

影响范围

Rack < 2.2.23
Rack < 3.1.21
Rack < 3.2.6

防御指南

临时缓解措施
如果无法立即升级,建议在 Web 应用防火墙(WAF)或反向代理层面配置规则,拦截或规范化包含异常百分比编码(特别是非 ASCII 多字节字符)的请求路径,以防止触发该漏洞。

参考链接

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