REQSMINER 论文阅读笔记
REQSMINER 论文阅读笔记: NDSS 2024
REQSMINER 论文阅读笔记
REQSMINER: Automated Discovery of CDN Forwarding Request Inconsistencies and DoS Attacks with Grammar-based Fuzzing
Abstract
- CDN 是设计用于提升托管网站性能并保护其免受各种攻击的普遍中间件
- CDN 在将客户端请求转发至原始服务器时会修改该请求,转发操作存在不一致性
- 本文提出 REQSMINER,一个基于强化学习技术检测 CDN 转发请求不一致性的模糊测试框架。
Introduction
CDN 缓存内容到边缘服务器,显著提高用户访问内容时的响应速度与可用性
研究发现,CDN在转发请求时的操作不一致可能导致多种安全问题,如拒绝服务和缓存投毒攻击等。然而,现有研究主要依赖手动分析,缺乏系统性方法,且因语法不严、成本高和黑箱操作带来诸多挑战。
Prior research
- CDN 转发请求不一致性会导致诸多攻击:HoT, HRS, DoS, CPDoS
- 大多数先前的研究依赖于手动分析,或集中于单一类型的不一致性
Challenges
- 语法宽松:生成的模板中不受约束的 ABNF 规则使得模糊测试难以提供有效值
- 成本高昂:由于测试用例庞大,研究 CDN 这样的商业服务代价高昂
- 黑箱性:出于商业机密,CDN 的源代码未向公众开放,因此反馈较少
Our Contributions
本研究提出了 REQSMINER 框架,利用强化学习算法并结合字段值和 ABNF 规则,实现了自动化的 CDN 请求不一致性模糊测试
- 从 RFC 文档和实际 HTTP 流量中提取有效值,将其存储为字段值。使用字段值辅助规则融合器,将这些值与 ABNF 规则合并,从而创建 ABNF 语法树作为生成模板
- 采用加权随机化的应用树上置信界 (UCT-Rand) 算法来优化模糊测试
Background
在本节中,我们首先介绍内容分发网络(CDN)的基本概念,简要展示HTTP标准,最后介绍我们采用的技术,包括基于语法的模糊测试和蒙特卡洛树搜索算法。
CDN Overview
内容分发网络(CDN)是一组地理分布的服务器(节点),它们协同工作以实现互联网内容的快速传输,不仅能提升托管网站的性能,还提供安全保护,包括 Web 应用防火墙和 DDoS(分布式拒绝服务)防御。
Request-routing Mechanism
请求路由技术决定了网站管理员如何将网站托管在 CDN 上,以下是两种常见的请求路由技术:
- 将域名重定向至 CDN 的子域名,这些子域名被映射到全球 CDN 边缘服务器网络
- 使用 CDN 的 DNS 服务器作为网站域名的权威名称服务器
Architecture
CDN的架构可以分为两大部分:
- 中心节点负责负载均衡和内容管理
- 边缘节点则负责缓存和分发内容,包括入口和出口节点。入口节点靠近客户端,处理访问请求,而出口节点则靠近源服务器,负责转发请求。
Workflows
- 在接收到客户端请求后,CDN首先检查缓存中是否有对应的数据。
- 如果缓存缺失,CDN会将请求转发至源服务器以获取所需资源,并将响应缓存以供后续请求使用。这些查询通常被称为“回源”请求。
- 通过负载均衡,CDN动态选择入口和出口节点,并尝试利用缓存以减少源服务器的负担。
HTTP Standard
超文本传输协议(HTTP)的标准主要由 RFC 9110 制定,并具有 ABNF 规则定义的标准化协议元素格式。
ABNF Rules
增强的巴科斯-瑙尔范式(ABNF)是一种上下文无关文法(CFG)语法 ,如下图所示:
HTTP Header Fields
HTTP使用字段在内容之前提供特定的头部数据,这些字段称为头字段。头字段的格式为 name 对。HTTP头部,如“Host.com”,由不区分大小写的名称、冒号(“:”)及其值组成。
Grammar-based Fuzzing
语法化模糊测试是识别软件系统中潜在漏洞的最常用测试技术之一。该方法使用一组预定义的规则或“语法”来生成测试输入。
Monte Carlo Tree Search
蒙特卡洛树搜索(MCTS)是一种启发式搜索算法,它通过模拟来探索潜在的行动并选择最有前景的行动。
MCTS的执行过程分为四个阶段:选择(Selection)、扩展(Expansion)、模拟(Simulation)和反向传播(Backpropagation)
UCT
Upper Confidence Bounds Applied to Trees
UCT 是 MCTS 的一种变体,旨在平衡游戏 AI 中的探索和利用。UCT 利用上置信界(UCB)公式,这个公式结合了当前节点的价值估计和探索参数,以选择最有前景的节点进行扩展。
UCB 公式如下:
REQSMINER Design
REQSMINER的设计框架包括以下关键组成部分:
- 规则生成器:该组件用于定义和生成有效的请求规则,以确保生成的请求符合CDN的语法和结构要求。规则生成器能够从已知的有效请求中提取模式和特征,帮助生成新的测试请求。
- 基于语法的模糊测试:利用预定义的语法规则生成多样化的测试输入,系统地覆盖不同的请求参数组合。通过对请求进行有针对性的变异,模糊测试能够有效识别潜在的安全漏洞。
Threat Model
威胁模型如下:
攻击者伪装成合法客户,能够向存在缺陷的 CDN 发送精心构造的请求,CDN随后会修改并转发这些请求。
目标网站作为攻击者的目标托管在 CDN 上,或者在不知情的情况下由攻击者托管。
在这些假设下,攻击者可以利用特定的 CDN 转发请求差异在 CDN 与源服务器之间的连接中操纵请求。通过这些恶意请求,可能会对受害的源服务器执行多种攻击:DoS、CPDoS、FL 和 WCP。
REQSMINER Overview
REQSMINER 的设计框架如下:
Rule Generator
利用字段值限制 ABNF 规则的搜索空间,通过将 ABNF 规则与字段值结合,生成 ABNF 语法树。具体来说,字段值是符合 RFC 的预定义数据,以键值对的形式存储,提取自 RFC 及实际网络流量。关键在于将专家领域知识融入生成规则中,从而提高生成效率。
Grammar-based Fuzzing
UCT 基于请求生成器使用 ABNF 语法树生成 HTTP 测试请求,并通过客户端将其发送到 CDN。这里的客户端和 CDN 后面的服务器均在 REQSMINER 的控制之下。在从服务器获取 CDN 的转发状态后,更新 ABNF 语法树中每个分支的生成算法参数。同时,差异分析器收集客户端和服务器端的日志,包括客户端发送的原始请求和服务器接收到的转发请求,并比较这些日志以发现转发请求的任何变化。
Rule Generator
ABNF 解析器创建三种类型的 ABNF 语法树节点,包括 AND、OR 和 RAND。
- AND节点:作为串联和唯一重复的操作符,AND节点在ABNF语法树中表示串联。访问这些节点时,所有子节点必须递归选择以继续生成。
- OR节点:表示选择,代表替代和有限重复操作符。访问这些节点时,任何子节点都必须递归访问。
- RAND节点:对应于ABNF语法中的无限重复操作符,RAND节点标记为随机,这意味着子节点的访问次数是随机的。
下图展示了一个简单的 ABNF 语法树:
Rule Fusioner
规则融合器通过将字段值解析为非终结符值并将其插入到ABNF语法树中,从而增强了生成有效测试用例的能力。
例如,对于字段值“Accept-Language: en-US,en;q=0.9,en-GB;q=0.8,zh;q=0.7,ja”,该值包含多种语言范围。在使用ABNF规则(见列表1,第6行)解析后,融合器可以提取多个语言范围值(例如,en-US、en、en-GB、zh和ja)。这样做是为了增加模糊测试器生成有效值的可能性,例如en-US、en和zh。
如下图所示:
Grammar-based Fuzzing
REQSMINER 使用请求生成器(Request Generator)来生成更多有效的测试用例,并对CDN进行基于语法的模糊测试,以有效识别请求差异和潜在漏洞。
Request Generator
为了使 REQSMINER 具有优越的有效性和探索能力,受蒙特卡洛树搜索(MCTS)算法启发,我们提出了一种基于 UCT 的加权随机生成算法(UCT-Rand)。与 UCT 不同,UCT-Rand 在选择阶段使用加权随机选择,而不是使用 argmax 函数来选择下一个子节点。
如果当前节点是一个具有未访问子节点的 OR 节点,则随机选择一个子节点进行扩展遍历。
如果当前节点的所有子节点在先前的迭代中都已被探索,表示该节点的搜索已完成,则使用UCB公式来确定所有子节点的权重:
Courier Platform
- 由客户端、服务器和进行测试的目标 CDN 组成。
- 客户端向目标 CDN 发送测试请求,这些请求随后被 CDN 转发到服务器。
- 所有请求都会被记录并发送到差异分析器。
- 此外,服务器从 CDN 接收请求,并针对 CDN 发送与请求无关的 HTTP 响应。
- 服务器会记录来自 CDN 的转发请求,并将其发送给差异分析器。
- 服务器还向请求生成器提供日志,指示 CDN 已成功转发该请求。
Difference Analyzer
差异分析器负责通过进行比较分析来检测 CDN 在转发请求时所做的修改。具体来说,它使用简化的 ABNF 规则提取原始请求和转发请求的请求结构。通过对这些结构的比较,差异分析器揭示了 CDN 对请求所实施的各种修改类型,包括:
- 修改(Alteration):CDN修改了原始请求的头部值。
- 插入(Insertion):CDN添加了原始请求中不存在的头部。
- 删除(Deletion):CDN从原始请求中移除了某个头部。
- 重复头部插入(Duplicate Header Insertion):CDN 添加了原始请求中已经存在的头部。
- 重复头部删除(Duplicate Header Deletion):CDN 移除了原始请求中的重复头部。
最终,这些各种类型的修改会被存档到数据库中,以便在后续研究中使用。