单包攻击:使远程竞态条件变得“本地化”
单包攻击是一种触发Web竞态条件的新技术。它通过单个TCP包完成多个HTTP/2请求,有效消除网络抖动,使请求几乎同时被处理。这使得远程竞态条件的利用变得与本地环境一样简单。
过去两个月里,社区使用单包攻击在发现竞态条件方面取得显著成功,甚至有人用它攻击了我自己搭建的网站。许多人询问该技术是否适用于其他网络协议,本文将从HTTP/3、HTTP/1.1、WebSocket和SMTP等协议角度进行分析,并针对不适用场景提供最佳替代方案指南。
技术原理回顾
在《打破状态机:Web竞态条件的真正潜力》中首次提出单包攻击技术。其核心是通过以下步骤消除网络抖动:
- 在单个HTTP/2连接上发起所有请求,保留每个请求的微小片段以避免服务器开始处理
- 短暂等待数据包到达目标服务器
- 同时发送所有请求的最终片段 操作系统会将最终片段合并到单个TCP包中
这种方法可轻松扩展至20-30个请求,且实现异常简单。Burp Suite Repeater的标签组功能及开源扩展Turbo Intruder均已集成该技术。
多协议适配分析
HTTP/3
HTTP/3基于QUIC和UDP协议,需通过单个UDP数据包完成多个请求。虽然HTTP/3的多路复用支持理论可行,但UDP包大小限制(约1500字节)与TCP实际软限制相同,因此支持单包攻击但开发收益有限。
HTTP/1.1
虽然可通过流水线技术将多个请求塞入单个TCP包,但由于RFC要求响应必须按请求顺序返回(队头阻塞问题),服务器通常会顺序处理请求。建议使用带最后字节同步的并行连接进行竞态条件攻击。
SMTP
虽然RFC 2920定义了流水线扩展,但响应顺序要求导致实现并行处理的可能性极低,尽管SMTP处理器后可能隐藏有趣的竞态条件。
WebSocket
由于没有"响应"概念,服务器可并发处理单连接上的多条消息。虽然消息分段不允许交错(RFC6455),但RFC 8441提出的通过HTTP/2流嵌套WebSocket连接的方案可能实现完整单包攻击。
技术实现关键
- 多路复用:单连接上支持并发消息的能力是核心
- 交错分段:增加单包内可容纳消息数量的关键性能因素
- 底层协议最大包大小:另一重要性能制约因素
分层聚合策略
除TCP层聚合外,还可将最终请求片段放置在单个TLS记录中。即使通过多个TCP包传输,该方案仍可工作,但需要定制TLS实现。
当前HTTP/2网站大量曾近乎无法检测的竞态条件漏洞已进入可利用阶段。下一步需创建概念验证工具并对流行服务器实现进行兼容性测试。新工具可能暴露更多WebSocket漏洞及需要30+同时请求的HTTP漏洞。
原文配图展示了单包攻击的请求时序对比效果,显示传统多包请求存在网络抖动(参差不齐的到达时间),而单包攻击的请求到达时间线完全对齐