Gollum:面向解释器堆溢出的模块化灰盒漏洞利用生成技术

本文介绍了Gollum系统,一种针对PHP和Python等解释器中堆溢出漏洞的自动利用生成技术。该系统采用模块化灰盒方法,通过轻量级插桩和类模糊测试技术,实现了堆布局操作、利用原语发现及完整漏洞利用链的自动构建,并在10个真实漏洞测试中验证了有效性。

Gollum:面向解释器堆溢出的模块化灰盒漏洞利用生成技术

在即将举行的ACM计算机与通信安全会议(CCS)上,我将发表一篇关于自动漏洞利用生成(AEG)的论文。论文中讨论了一个针对解释器中堆溢出漏洞的自动化原语发现与漏洞利用构建系统。该方法与大多数其他AEG解决方案的不同之处在于其完全采用灰盒方法,依赖轻量级插桩和多种类模糊测试输入生成技术。下图展示了系统的工作流程,论文中对每个阶段进行了详细说明。

在评估方面,我使用PHP和Python解释器中的10个漏洞作为测试案例,将其作为Gollum的输入以搜索原语并构建漏洞利用。

论文中有三个主要亮点值得强调(详见论文):

1. 多阶段灰盒驱动方法

AEG是一个多阶段过程,通过将问题分解为不同阶段,可以使用轻量级插桩和相对简单的输入生成的类模糊测试组合来攻击多个阶段。传统AEG系统主要使用符号执行,虽然有其优势,但也面临可扩展性问题。在去年USENIX Security的论文中,我展示了如何通过轻量级插桩结合应用现有测试和模糊器,来发现可用于堆布局操作的语言片段及待破坏的关键对象。在CCS论文中,我进一步展示了如何使用类似方法发现利用原语,并在特定情况下构建完整漏洞利用。值得注意的是,Wu等人的FUZE论文也采用了类似思路。预计未来几年,模糊测试驱动的漏洞利用生成将成为主流,而符号执行将主要用于需要位精确推理且状态空间可控的场景。

2. 延迟任务解析策略

针对堆溢出的自动漏洞利用构建需要解决堆布局实现和后续利用链构建两个问题。论文提出了漏洞利用生成中的延迟任务解析理念,即逆向顺序解决堆布局操作和利用生成问题。这样做的原因很直观:当堆布局实现过程远长于利用构建时(如Gollum),应先验证在假设堆布局可行的前提下是否能够生成利用,再实际解决布局问题。具体实现中,我构建了一个允许请求特定布局的堆分配器,先假设布局成立尝试生成利用,确认有效后再实际实现该布局。

这种思路可能适用于其他漏洞类型的利用生成,例如针对竞争条件的系统可先假设特定调度方案成立,验证利用可行性后再实际寻找实现该调度的输入。该方法还支持人工与自动结合的混合模式:当堆布局问题的前置条件不满足时,系统仍可自动生成假设布局成立时的利用链,最后由开发人员手动解决布局问题。

3. 遗传算法优化堆布局

在去年USENIX Security论文中讨论的随机搜索算法基础上,采用遗传算法优化两个需要相邻内存块的间距,可显著提升堆布局操作效率,但代价是实现更复杂且耗时。


扩展阅读

本文首次发布于2019年10月30日,于2019年11月1日更新

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计