博士论文:语言解释器中堆溢出的灰盒自动利用生成
今年夏天我完成了博士论文答辩。论文可在此处获取。
快速总结如下(在详细说明之前): 2016年之前的利用生成主要专注于针对网络守护进程和文件解析器等场景中基于栈的缓冲区溢出的单次、完全自动化利用。我认为这类系统的架构不太可能支持更复杂漏洞类别、不同目标软件及存在防护机制场景下的利用生成。受模糊测试在漏洞发现方面成功的启发,我希望将灰盒输入生成应用于利用生成领域。作为一个整体性问题,利用生成对这种方法来说过于复杂,因此我开始将利用生成分解为多个阶段,并为每个阶段实现灰盒解决方案。
我设计的这些阶段具有可组合性,并使用模板语言实现阶段间解决方案的通信。可组合的求解器解决方案和人工可编写的模板语言为利用生成引擎提供了两个新的强大能力:1)“人在回路"意味着我们可以自动化当前可自动化的任务,同时允许人类解决我们尚无良好求解器的问题;2)如果解决方案可组合,且可以为任何阶段生成模拟解决方案,那么我们可以乱序解决各个阶段。这在实践中使我能够假设特定的堆布局,检查是否可以从该点创建利用,只有在确认可被利用时才返回并尝试实现该堆布局。
我相信利用生成系统的未来架构将是:类似模糊测试的输入生成机制应用于利用生成中的细粒度任务,这些问题的解决方案通过允许必要时由人类提供解决方案的模板语言进行组合。符号执行将在需要精确推理时发挥有限但重要的作用,而其他过度近似的静态分析可能用于缩小输入生成和符号执行引擎必须考虑的搜索问题范围。
背景
我最初在2009年研究利用生成(硕士论文在此),当时开发的方法是使用混合执行构建表示导致程序崩溃输入路径语义的SMT公式,然后将这些公式与表达成功利用应满足条件的逻辑条件结合,要求SMT求解器找出产生期望输出所需的输入。这在防护机制有限的某些场景中有效(例如物联网设备),但存在许多限制,使其无法成为现实世界自动利用生成(AEG)解决方案的合理路径。
2016年左右未解决的问题
从2009年到2016年我从事其他工作,但在2016年决定回到学术界攻读博士学位并重新拾起该主题。回顾参与DARPA CGC的系统以及先前工作,有几个明显的未解决问题和机会:
- 所有系统都专注于完全自动化利用生成,没有与人类协同利用生成的能力
- 尚无研究关注"利用原语"概念
- 所有系统将AEG视为两步过程
- 没有人广泛利用灰盒输入生成方法(模糊测试)
- 几乎所有系统仍专注于基于栈的溢出
- 没有人在其利用生成系统中集成信息泄漏或处理ASLR
- 没有人研究语言解释器/浏览器
- 没有人研究内核
研究
基于以上考虑(我没有涉及第6和第8点),我博士研究的主要目标是探索和验证一些我认为能推动技术发展并构成未来AEG工具基础的想法。这些想法是:
- 将利用过程分解为不同阶段,为每个阶段实现不同的求解器
- 实现阶段的"惰性"解析和乱序解决
- 设计纯粹的灰盒、受模糊测试启发的解决方案
- 实现多个求解器的交互、可替换性和人在回路能力
除了这些目标,我还必须确定要研究的漏洞类别和目标软件类型。基于栈的溢出已被充分研究,因此我决定选择尚未受到关注的基于堆的溢出。我还决定以语言解释器(实际为PHP和Python)为目标,因为它们无处不在且当时尚无利用生成研究关注它们。
最终这项研究非常有趣,并希望对他人有用。我认为将利用分解为多个阶段、尽可能使用灰盒解决方案以及使用模板驱动的利用来集成各种求解器或可选的人类参与,这些想法具有真正的潜力,并可能出现在未来的实用AEG引擎中。
延伸阅读
论文 - 包含我所有的研究,以及大量介绍性和背景材料,以及未来工作的想法。
自动堆布局操作利用(USENIX Security 2018) - 关于堆布局问题的论文,及其灰盒解决方案。还讨论了利用模板。
Gollum:解释器中堆溢出的模块化灰盒利用生成(ACM CCS 2019) - 关于使用完全灰盒组件的端到端利用生成架构的论文。