灰盒自动漏洞利用生成:解释器堆溢出漏洞研究
概述
2020年夏季,我完成了博士论文答辩。这篇论文主要研究如何将灰盒输入生成技术应用于漏洞利用生成领域。
与2016年前主要关注网络守护进程和文件解析器中基于栈的缓冲区溢出的单次全自动利用生成不同,我认为这些系统的架构难以应对更复杂的漏洞类型、不同目标软件以及存在缓解措施的情况。受到模糊测试在漏洞发现中成功的启发,我希望将灰盒输入生成技术引入漏洞利用生成领域。
核心创新
分阶段漏洞利用生成
我将漏洞利用生成分解为多个阶段,并为每个阶段实现灰盒解决方案。这些阶段被设计为可组合的,并使用模板语言实现阶段间解决方案的通信。这种可组合的求解器和人工可编写的模板语言为漏洞利用生成引擎提供了两个强大的新能力:
- 人机协作:自动化当前可自动化的任务,同时允许人工解决尚无良好求解器的问题
- 乱序求解:如果解决方案可组合,且可以为任何阶段生成模拟解决方案,则可以乱序解决各个阶段
实际应用
在实践中,我利用这种方法假设特定的堆布局,检查是否可以从该点创建漏洞利用,只有在确认可利用时才返回并尝试实现该堆布局。
背景与技术演进
我最初在2009年研究漏洞利用生成,使用符号执行构建表示导致程序崩溃的输入路径语义的SMT公式,然后将这些公式与表示成功利用的逻辑条件结合,要求SMT求解器找出产生所需输出的输入。
早期的研究(包括我的工作)基本上将漏洞利用生成视为两阶段过程:
- 使用普通模糊测试或符号执行工具找到被认为可利用的位置路径
- 通过重写原始输入中破坏函数指针或返回地址的字节,将其转换为漏洞利用
这种方法的概念缺陷在于认为模糊测试器发现的崩溃输入可以一步转换为正常工作的漏洞利用。实际上,来自模糊测试器的崩溃输入通常只是生成漏洞利用旅程的起点。
2016年的开放问题
回顾参与DARPA CGC的系统以及先前的工作,存在几个明显的开放问题和机会:
- 所有系统都专注于完全自动化的漏洞利用生成,没有人在环协同生成的能力
- 没有研究涉及"利用原语"的概念
- 所有系统都将AEG视为简单的两步过程
- 没有人广泛利用灰盒输入生成方法(模糊测试)
- 几乎所有系统仍专注于基于栈的溢出
- 没有人整合信息泄露或处理ASLR
- 没有人研究语言解释器/浏览器
- 没有人研究内核
研究方法与目标
我的博士研究主要目标是探索和验证能够推动技术发展并构成未来AEG工具基础的想法:
- 分解利用过程:将利用过程分解为不同阶段,为每个阶段实现不同的求解器
- 灰盒解决方案:为利用流水线的每个阶段设计纯灰盒、受模糊测试启发的解决方案
- 多求解器交互:实现多个求解器交互、可交换,并允许人在环
技术实现
我选择了堆基溢出作为漏洞类别,目标是语言解释器(实际为PHP和Python),因为它们是普遍存在的,且当时没有漏洞生成研究关注它们。
最终,我认为将利用分解为多个阶段、尽可能使用灰盒解决方案以及使用模板驱动的利用来集成各种求解器或可选的人工参与,这些想法具有真正的潜力,并可能出现在未来的实用AEG引擎中。
延伸阅读
- 论文:包含我所有的研究,以及大量介绍性和背景材料,以及未来工作的想法
- 自动堆布局操作(USENIX Security 2018):关于堆布局问题及其灰盒解决方案的论文
- Gollum(ACM CCS 2019):关于使用完全灰盒组件的端到端漏洞利用生成架构的论文