同一份 139 字节的 HTTP/1.1 内存输入,头部在 offset 92 结束。两种刻意缩小且不完整的教学定界策略读取它时,一种停在 97,另一种停在 102。在这份 HTTP/1.1 输入中,两条边界只差 5 字节,留在缓冲区里的后续数据却从不同位置开始。
这不是一次真实漏洞复现。实验只处理 Python bytes,没有 socket、服务器或外部目标;两种策略也不是代理和后端产品。它只把一个事实变得可见:持久 HTTP/1.1 连接给接收者的是连续字节,不会额外附送“这一条请求到此结束”的边框。
同一字节流产生两个停止位置
可以把两种教学策略想成两把尺子。它们都从头部结束位置 92 开始:Transfer-Encoding-first 读到本夹具的零长度终止块;在这条 Transfer-Encoding 教学路径里,一个大小字符、两组 CRLF 共占 5 个 wire bytes,所以停在 92 + 5 = 97。Content-Length-first 不解释这段结构,只按夹具声明的十进制长度 10 向后计数,所以停在 92 + 10 = 102。这两条 HTTP/1.1 教学计算只差 5 字节,前者留下完整的后续起点,后者看到的残余数据已经缺少开头 5 字节。这里给出的只是抽象偏移运算,不含可发送报文或连接编排。
TE-first: [头部 92][消费 5] | [剩余 42]
CL-first: [头部 92][消费 10] | [剩余 37]
竖线就是各自计算出的消息边界;方块只表示长度,不包含任何真实字段行或载荷。

差异不是三个教学函数在所有输入上随意产生的。仅保留 Content-Length 或仅保留 Transfer-Encoding 的两个控制样本中,三种策略在各自样本内都接受输入并停在相同位置;只有冲突组产生 97 与 102 两个边界。遇到双重定界信号就拒绝的教学对照,则不再解释边界和残余数据。公开正文给出了上面的最小长度布局;完整夹具、源码与逐项断言目前只保留在内部研究记录中,因此本文不把结果表述为读者可独立复跑的公开实验。
控制组与冲突组放在一起,工程判断便不再依赖某个字段“看起来可疑”:请求走私的关键不是某一行看起来多可疑,而是同一串字节经过每一跳时有没有被切在同一个位置。 边界分歧可能形成请求走私的条件,但它本身不等于已经成功利用。
规范处理要求先消除定界歧义
两支教学游标不是 RFC 同时认可的两个答案。RFC 9112 规定,当 Transfer-Encoding 与 Content-Length 同时出现时,前者覆盖后者,这类消息应按错误处理。只按 Content-Length 停下不符合该优先级;只演示优先级的教学策略也缺少完整语法、转发和连接管理,不能叫作合规实现。
服务器可以拒绝请求,也可以只按 Transfer-Encoding 处理;无论选择哪条允许路径,响应后都必须关闭连接。中间层若继续转发,必须先移除收到的 Content-Length,再处理 Transfer-Encoding,让下游只收到无歧义的表示。实验中的“遇歧义即拒绝”只是其中一条教学化对照,不是规范唯一允许的方案。

回归测试必须包含连接动作
只断言“解析器接受了输入”或只看状态码,无法证明整条链路对边界达成一致。更有用的回归记录是一个四元组:处理决定 / 消费偏移 / 下游表示摘要 / 连接动作。它同时回答节点接受还是拒绝、消费到哪里、转发后是否仍保留歧义,以及冲突处理后连接是否关闭。
三条 RFC 路径可以直接写成不含报文的期望记录:
服务器拒绝:reject / no-boundary / no-downstream / close-after-response
服务器按 TE:te-only / te-boundary / no-downstream / close-after-response
中间层转发:normalize / parsed-boundary / digest(unambiguous-output) / close-inbound-after-response
中间层在入站侧仍承担 server 角色;它还要断言输出不再同时保留两种定界信号,并把输出摘要与下一跳收到的输入摘要对应起来。任一服务器路径在响应后继续复用入站连接,或拒绝路径仍出现下游摘要,用例都应失败。这里没有包含可发送的测试报文,只定义验收终态。
中间层可能重写消息,因此不同表示下的绝对 offset 不必机械相等。验收重点是每一跳的消费位置与其输出摘要、连接动作能够相互解释,并且歧义没有被原样传给下一跳。这也能区分“单个节点通过测试”与“整条链路没有歧义”两个结论。测试应只在自有或明确授权的反向代理、API 网关、服务网格与协议桥接隔离环境中运行,不需要扫描公网。
规范依据为 RFC 9112 §6.1、§6.3、§9.3 与 §11.2,开放测试语境来自 OWASP WSTG v5 开发稿固定版本。实验源码、结果与完整哈希继续保留在内部研究回执中;在没有稳定公开地址前,不用一串读者无法取得原文件的哈希冒充公开可复现性。
