今天分享的论文讨论 HTTP/2 与 HTTP/1 转换中的安全问题,由来自东北大学(Northeastern University)的研究人员完成。本文首次系统地探讨了HTTP/2与HTTP/1协议转换中的异常情况及其安全风险,通过设计基于HTTP/2语法的 Fuzzer:FRAMESHIFTER,对 12 种流行的反向代理技术和内容交付网络(Content Delivery Network, CDN)进行了模糊测试实验,并发现了大量的新型网络应用程序攻击方式,可造成请求黑洞、拒绝服务和请求偷渡等多种攻击。该论文发表于网络安全领域顶级会议 USENIX Security 2022(录用率:18.6%)。

【背景介绍】

HTTP/2 自 2015 年推出以来,已经获得了大规模的应用。HTTP Archive 在 2022 年最新的测量报告中显示,互联网中 77% 的 HTTP 请求采用了 HTTP/2 或 HTTP/3(如图表1所示),有 66% 的网站部署了HTTP/2 或HTTP/3 [1](如图表2所示)。

图表1 采用 HTTP/2 及以上版本的 HTTP 请求占比

图表2 应用 HTTP/2 及以上版本的网站占比

然而在实践中,客户端和目标服务器很少通过端到端的 HTTP/2 通道进行通信,而是混合使用 HTTP/2 和 HTTP/1 [4],这是由于内容交付网络(CDN)和反向代理的广泛使用造成的,这些代理服务器在客户端和源服务器之间充当一个流量交换的中介。具体而言,尽管这些代理在面向客户端的连接中支持 HTTP/2;但在面向源服务器的连接中,不论源服务器是否支持 HTTP/2,代理总是使用 HTTP/1 。造成这种现象的原因有很多,比如,有些代理提供商认为 HTTP/2 并没有显著的性能优势;网络应用程序防火墙(Web Application Firewall,WAF)和负载均衡器等代理则出于兼容性的考虑,仅支持处理 HTTP/1 请求。本文对 10 个主流的反向代理进行了测试,发现仅有一个反向代理可以与源服务器建立 HTTP/2 连接。

目前针对 HTTP 协议的研究已经表明, HTTP 协议的复杂性,以及通信路径上服务器行为之间的差异性,引入了大量的网络安全风险。而 HTTP/2 到 HTTP/1 的转换给已经错综复杂的网络协议增加了更多的复杂性,极有可能会引入更多的安全风险,例如有缺陷的 HTTP 处理机制和不符合要求的行为。事实上,由 HTTP/2 到 HTTP/1 转换导致的新攻击面已经可以成功地被利用,对主流代理服务及使用相关服务的源服务器实施请求偷渡 [2,3] 和拒绝服务 [4] 等攻击。然而,已有工作仅针对单个帧在 HTTP/2 到 HTTP/1 转换中可能产生的安全问题进行了研究,没有全面考虑 HTTP/2 流的特性。

本文着眼于一个完整的HTTP/2流,系统地探索了不同帧序列和特殊帧内容对HTTP/2到HTTP/1转换的影响,并对 8 个独立的代理和 4 个CDN厂商进行了测试,发现多种由转换导致的异常情况,并成功在实验环境中利用此类异常情况执行攻击。

【FRAMESHIFTER】

为了对 HTTP/2 到 HTTP/1 的转换进行系统的安全风险评估,本文设计并实现了一个基于语法的 HTTP/2 Fuzzer:FRAMESHIFTER,其名字源于一个叫做“frameshift mutations”的 DNA 变异。FRAMESHIFTER 由两部分组成:1)HTTP/2 帧序列生成;2)HTTP/2 帧序列变异。

HTTP/2帧序列生成

FRAMESHIFTER 使用一个输入语法来生成 HTTP/2 帧序列。输入语法定义了每个帧的内容以及各个帧的组合。对输入语法中的每一个规则,可以指定帧的类型和内容,最后由一个 上下文无关文法(Context-free Grammar,CFG )树来生成实际的帧。图表3显示的是一个 HTTP/2帧帧序列的 CFG示例,由 CFG 树可以生成一个 HEADERS 帧(报头帧,用于打开一个流,也可携带头部数据)或者一个由 HEADERS 帧和 DATA 帧(数据帧,用于传输与流相关的各种数据)组成的序列。

图表3 一个 HTTP/2 帧序列的 CFG 树示例

HTTP/2帧序列变异

基于生成的 HTTP/2 帧序列,FRAMESHIFTER 进行帧序列变异,包括:帧序列变异和帧内容变异。

1. 帧序列变异

在生成的帧序列的随机位置插入、删除或者替换一个帧,如图表4所示, 在一个 HEADERS 和 DATA 组成的 HTTP/2 序列中的一个随机位置插入了 GOAWAY 帧(超时帧,用于启动连接关闭或发出严重错误信号)和 CONTINUATION 帧(延续帧,用于延续单个HEADERS帧无法发送完的报头数据)。

      图表4 帧序列变异示例

2. 帧内容变异

除了进行帧与帧之间的变异,还可以针对某一个帧的内容进行变异。如图表5所示,“content-length”中的破折号(-)被下划线(_)取代,并且最后一个字母(h)被删除,并在值后面添加了一个分号(;)。

图表5 帧内容变异示例

实验设置

图表6显示了FRAMESHIFTER 的流程概述。首先,确定一个输入语法,从中产生一个随机的基础帧序列(generating inputs)。然后对基础帧序列进行随机变异(mutating inputs),将变异生成的帧序列发送至配置了不同代理软件的 HTTP/2 服务器(sending inputs to HTTP/2 servers),服务器将HTTP/2帧序列转换为 HTTP/1 请求并将其转发到一个用来监听的服务器(forwarding HTTP/1 requests),最终保存为一个可供分析的日志文件(Log File)。

图表6 FRAMESHIFTER 的流程概览

【主要发现】

首先,本文定义了判断一个 HTTP/2 到 HTTP/1 的转换异常的两个条件:

1. HTTP/1 请求由相应的 HTTP/2流产生;

2. 生成的 HTTP/1 请求有正文内容,包括两种情况:1) 有一个“content-length”头,其数值等于正文的长度;2) 请求有一个“transfer-encoding:chunked”头,并且正文遵循适当的chunked格式。

若上述两个条件的任意一个不被满足,则认为存在转换异常。

本文共发现了10类 HTTP/2 到 HTTP/1 的转换异常,并总结了导致这些异常的8 种输入,这些输入在不同代理服务中导致的转换异常类型对应关系如图表7所示。以图中右下方的黄色三角形为例,其表示在 Fastly 代理服务中,当一个 HEADERS 帧紧随另一个带有 END_HEADERS标志的 HEADERS 帧时,反向代理就会停止对当前HTTP/2流的处理,并转发原始的帧序列,这会导致请求中存在“transfer-encoding:chunked”时产生内容缺失,丢失最后一个长度为0的分块。

图表7 引起转换异常的输入类别

为了验证找到的HTTP/2到HTTP/1的转换异常是否可以被用于攻击,作者针对每种转换异常可能产生的攻击进行测试,在实验室环境中展开多种攻击实验,发现转换异常可以导致拒绝服务和请求黑洞攻击,具体介绍如下。

拒绝服务(Denial-of-Service)

一个变异的帧序列会导致反向代理发送一个具有不完整正文内容的HTTP/1请求,此时源服务器会挂起并等待剩余数据。此时,攻击者可以发送多个相同的帧序列,每一个都会占用源服务器一个连接通道,若所有的持久性连接都被占用,当一个新的请求到达反向代理时就无法被转发。最终导致新的请求不能被及时处理,从而造成DoS攻击,如图表8-10所示。

图表8 攻击者发送特定序列,使得转换后的请求不完整,源服务器等待剩余数据

图表9 攻击者发送多个同样的序列,每个序列都建立新的连接,直到源服务器的连接池被用尽

图表10 受害者的正常请求无法被处理

请求黑洞(Request Blackholing)

首先,一个变异的帧序列导致反向代理发送一个具有不完整正文内容的HTTP/1请求,但与DoS攻击不同的是,此时若有新的请求到来,并不会在代理服务器与源服务器之间建立新的连接,而是继续使用之前的连接,因为上一个HTTP/1请求并不完整,因此,受害者后续发送的请求就被解释为上一个请求正文内容的一部分,而无法被源服务器正确处理。这些未被正确处理的请求被认为是“黑洞”,可能会造成DoS或者信息泄露等问题,如图表11-13所示。

图表11 攻击者发送特定的序列,使得转换后的请求不完整,源服务器收到不完整请求

图表12 受害者新的请求使用相同的连接,该请求被源服务器解析为上一个连接的正文内容的一部分

图表13 剩下的内容不是一个完整的请求,服务器返回400

【结论】

本文对HTTP/2到HTTP/1转换过程中可能存在的安全风险进行了系统研究,设计实现了一个基于语法的 HTTP/2 Fuzzer:FRAMESHIFTER。通过对几个主流的代理服务进行测试,发现了许多转换过程中存在转换异常,并分析了转换异常可能导致的实际攻击问题。本文对复杂的协议转换过程中存在的安全风险进行了初步探索,文中还有很多可以进一步深入研究的问题,例如,本文测试用例的生成方法非常简单,只考虑了协议转换过程中的两个头部字段,这显然是不够完整的。正如作者在文中所说,受限于模糊测试方法本身,本文所发现的结果较为初步,并没有针对所有可能的安全风险进行详尽的分析,而且变异方法也比较简单朴素,无法覆盖所有的异常请求。

总而言之,本文较为系统地研究了HTTP/2与HTTP/1转换过程中的安全风险,为后续研究做出了积极的引导。

原文链接:

https://www.usenix.org/system/files/sec22-jabiyev.pdf

开源工具

https://github.com/bahruzjabiyev/frameshifter

参考文献

[1] Vaspol Ruamviboonsuk and Barry Pollard. HTTP, 2022. https://almanac.httparchive.org/en/2022/http .

[2] James Kettle. HTTP/2: The Sequel is Always Worse. PortSwigger Web Security Blog, 2021. https://portswigger.net/research/http2

[3] Emil Lerner. http2smugl: HTTP2 request smuggling security testing tool, 2021. https://lab.wallarm.com/http2smugl-http2-request-smuggling-security-testing-tool/

[4] Run Guo, Weizhong Li, Baojun Liu, Shuang Hao, Jia Zhang, Haixin Duan, Kaiwen Sheng, Jianjun Chen, and Ying Liu. CDN Judo: Breaking the CDN DoS Protection with Itself. In The Network and Distributed System Security Symposium, 2020.

梁越嘉,编辑&审校|刘明烜、张一铭、刘保君

声明:本文来自NISL实验室,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。