单包攻击技术:将远程竞态条件转化为"本地"攻击

本文深入探讨了单包攻击技术,这是一种通过单个TCP包完成多个HTTP/2请求来触发Web竞态条件的新方法。文章分析了该技术在HTTP/3、HTTP/1.1、WebSocket和SMTP协议上的适用性,并提供了实现指南和协议限制的详细说明。

单包攻击:让远程竞态条件变得"本地化"

单包攻击是一种触发Web竞态条件的新技术。它通过单个TCP包完成多个HTTP/2请求,有效消除了网络抖动,使得这些请求能够极其接近地被处理。这使得远程竞态条件的利用变得与本地条件同样容易。

为什么抖动会隐藏竞态条件

要触发竞态条件,通常需要网站在极短的时间窗口内接收和处理多个HTTP请求。由于网络抖动(数据包传输中不可预测的网络延迟),同时发送到远程系统的请求并不能可靠地同时到达:

这使得在远程系统上检测竞态条件比在本地系统上困难得多。

用单包攻击解决抖动问题

单包攻击通过调整和结合"最后字节同步"和"无时间定时攻击"技术来解决网络抖动:

  1. 通过单个HTTP/2连接发出所有请求,保留每个请求的一小片段,使服务器不开始处理
  2. 等待短暂时间让数据包到达目标服务器
  3. 发出每个请求的最终片段
  4. 操作系统会将这些分组到单个TCP包中

使用单个TCP包完成所有请求意味着它们总是在同一时间被处理,无论网络抖动延迟了多长时间。这种方法可以轻松扩展到20-30个请求,并且实现起来非常容易。

将单包攻击应用于其他协议

HTTP/3

HTTP/3建立在QUIC和UDP之上。要在HTTP/3上应用单包攻击,我们需要用单个UDP数据报完成多个HTTP请求。HTTP/3的多路复用支持使这成为可能,但UDP的最大数据包大小约为1,500字节,而TCP为65,535字节。

HTTP/1.1

HTTP/1.1允许通过单个TCP连接发送多个请求。虽然技术上可以将多个完整HTTP请求塞入单个TCP包,但由于RFC要求服务器必须按接收顺序发送响应,这导致了"队头阻塞"问题。

SMTP

与HTTP/1.1类似,可以使用RFC 2920中定义的流水线扩展将多个SMTP消息塞入单个数据包。但同样,响应必须按顺序发送,因此实现不太可能并行处理这些请求。

WebSocket

WebSocket协议比HTTP/1.1更有前景,因为没有"响应"的概念。这意味着服务器可以并发处理通过单个连接发送的多个消息,而不必担心发送顺序。

不同层的合并

将最终请求片段合并到单个TCP包中并不是唯一可行的选择。也可以将最终片段放在单个TLS记录中。由于TLS分层在TCP之上,即使记录通过多个不同的TCP包传递,这种方法也能工作。

结论

目前,HTTP/2网站上存在大量曾经几乎无法检测和利用的Web竞态条件现在都可以被利用。我们基于RFC的分析评估了其他协议可能支持的单包攻击变体。下一步是为任何这些协议创建概念验证工具,然后在流行的服务器实现上进行探测以查看它们是否兼容。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计