灰盒自动化利用生成:语言解释器堆溢出的突破性研究
背景
2009年作者在硕士论文中首次尝试利用混合执行(concolic execution)构建SMT公式来表示导致程序崩溃的输入路径语义,然后将这些公式与表示成功利用的逻辑条件结合,通过SMT求解器推导出所需输入。这种方法在有限保护机制的场景(如IoT设备)中有效,但存在根本性概念缺陷:传统系统将利用生成视为两阶段过程(发现漏洞路径→一次性转换为利用),而实际利用开发往往需要多阶段协作和人工干预。
2016年的开放性问题
回顾DARPA网络大挑战赛及相关研究,发现以下关键问题:
- 所有系统追求全自动化,缺乏人机协同能力
- 忽略"利用原语"概念(手动利用开发的核心)
- 将AEG视为单次转换而非多阶段编程问题
- 未充分运用灰盒输入生成(模糊测试)技术
- 仍专注于栈溢出漏洞
- 未整合信息泄露或应对ASLR
- 缺乏对语言解释器/浏览器的研究
- 缺少内核级研究
研究创新
多阶段分解架构
将利用生成分解为独立阶段,为每个阶段设计专用求解器。关键突破包括:
- 惰性解析机制:允许阶段乱序求解,先模拟昂贵阶段的解决方案,验证有效性后再实际求解
- 堆布局假设验证:先假设特定堆布局,检查可利用性,仅当确认可利用时才实际构造该布局
灰盒优先方法
- 为每个阶段设计纯灰盒解决方案(受模糊测试启发)
- 通过问题分解大幅缩减状态空间,使反馈机制设计成为可能
- 在需要精确推理时有限度使用符号执行
模板驱动协同
设计模板语言实现:
- 多求解器交互和可替换性
- 人工解决方案集成(“人在环路"模式)
- 阶段间解决方案传递和组合
目标选择
- 漏洞类型:选择未被充分研究的堆溢出(而非过度研究的栈溢出)
- 目标软件:针对普及但未被研究的语言解释器(PHP和Python)
实践成果
- 自动堆布局操作(USENIX Security 2018):堆布局问题的灰盒解决方案
- Gollum系统(ACM CCS 2019):完全基于灰盒组件的端到端利用生成架构
未来方向
论文第1.2节明确列出了系统假设和局限性,第6.1节提出了多个有趣的开放性问题,为后续研究提供了丰富的研究方向。