博士论文:语言解释器中堆溢出的灰盒自动化利用生成
2020年夏季,我完成了博士论文答辩。论文全文可在此获取。
超简摘要
2016年之前的利用生成研究主要集中于网络守护进程和文件解析器等场景中的栈缓冲区溢出漏洞的单次全自动化利用。此类系统架构难以应对更复杂的漏洞类型、多样化目标软件及缓解机制。受模糊测试在漏洞发现中成功的启发,我将灰盒输入生成技术引入利用生成领域。由于利用生成作为单体问题过于复杂,我将其分解为多个阶段,并为每个阶段设计灰盒解决方案。这些阶段被设计为可组合,并通过模板语言实现阶段间解决方案的通信。可组合的求解器与人工可编写的模板语言为利用生成引擎带来两大新能力:1)“人在循环"机制可自动化当前可自动化部分,同时允许人工解决尚未具备良好求解器的问题;2)若解决方案可组合且任何阶段均可生成模拟方案,则可以实现阶段的无序求解。实践中,我通过假设特定堆布局来验证可利用性,仅当确认可开发利用时才回溯实现该布局。我认为未来利用生成系统将采用模糊测试式输入生成机制处理粒度化任务,并通过模板语言组合解决方案,同时允许必要的人工干预。符号执行将在需要精确推理时发挥有限但关键的作用,其他过近似静态分析技术则用于缩小输入生成和符号执行引擎的搜索空间。
研究背景
我于2009年开始研究利用生成(硕士论文在此),采用的具体方法是使用混合执行构建表示导致程序崩溃的输入路径语义的SMT公式,将这些公式与表达成功利用逻辑条件的语句连接,并通过SMT求解器推导所需输入。这种方法在缺乏保护机制的场景(如IoT设备)中有效,但存在诸多限制,难以成为现实世界自动化利用生成(AEG)的可行路径。除了混合执行在扩展到浏览器等复杂软件时的可扩展性问题外,更核心的概念缺陷在于将利用生成视为两阶段过程:首先通过模糊测试或符号执行找到可 exploitation 的路径(通常指栈返回地址被覆盖),然后将该输入传递给第二阶段转换为完整利用。这种方法的根本缺陷在于假设模糊测试发现的崩溃输入可一步转化为功能化利用,而实际利用开发中,崩溃输入往往只是起点,开发人员会将其作为多阶段利用的组成部分。
2016年的开放性问题
2009至2016年间我从事其他工作,2016年重返学术界攻读博士学位时重新审视该领域。分析DARPA CGC参赛系统及已有研究后,我发现几个明显的开放性问题:
- 所有系统均专注于全自动化利用生成,缺乏人机协同机制
- 尚未有研究关注"利用原语"概念——这是手动构建利用的基础
- 所有系统将AEG视为"发现漏洞路径→单步转换为利用"的两阶段过程,而非多阶段"编程"问题
- 除漏洞发现外,未充分运用灰盒输入生成方法(模糊测试)
- 仍集中于栈溢出漏洞
- 未整合信息泄露或应对ASLR
- 未针对语言解释器/浏览器
- 未涉及内核漏洞
5-8点可能是1-4点的原因。一旦开始解决5-8中任何问题,就必须思考多阶段利用生成、人工辅助、非栈溢出漏洞类别以及使用灰盒方法避免符号执行的可扩展性陷阱。
研究内容
基于以上认识(未涉及第6、8点),我的博士研究目标是探索和验证推动技术发展的理念,为未来AEG工具奠定基础。核心思想包括:
- 多阶段分解:真实利用通常是包含多个阶段的复杂程序。通过将利用过程分解为不同阶段并实现专用求解器,可降低问题复杂度。阶段分解还支持"惰性解析”,允许先模拟早期阶段解决方案,验证其有效性后再实际求解。
- 灰盒解决方案:符号执行性能较差,而模糊测试具有更佳可扩展性。将问题分解后,可为每个阶段设计基于灰盒方法的反馈机制,大幅缩减状态空间。
- 多求解器协作:通过模板语言实现不同求解器的交互与替换,支持人工干预。我设计了模板方法,使每个阶段和开发人员都能通过模板语言编写和更新利用方案(实践示例)。
在漏洞类型选择上,为避免重复研究栈溢出,我专注于无人关注的堆溢出漏洞,并以普及度高但无人研究的语言解释器(PHP和Python)为目标。
结语
这项研究充满乐趣且有望为他人提供价值。我认为将利用分解为多阶段、最大限度使用灰盒方案、通过模板驱动整合多种求解器或人工干预等理念具有实际潜力,很可能出现在未来的实用AEG引擎中。
致谢:感谢同事朋友们的思想碰撞与草稿审阅,以及CCS、USENIX Security和IEEE S&P的匿名评审人。尽管学术评审过程存在诸多讨论,但我个人感谢陌生专家投入时间审阅论文并提供反馈。
延伸阅读
- 论文:包含完整研究内容、背景材料及未来工作设想。第1.2节明确列出了研究假设,第6.1节提出了多个值得探索的开放性问题。
- 《Automatic Heap Layout Manipulation for Exploitation》(USENIX Security 2018):关于堆布局问题及其灰盒解决方案的论文,同时讨论利用模板。
- 《Gollum: Modular and Greybox Exploit Generation for Heap Overflows in Interpreters》(ACM CCS 2019):关于使用全灰盒组件构建端到端利用生成架构的论文。