利用模板实现漏洞利用生成的自动化
在去年的USENIX安全会议上,我发表了一篇题为《自动堆布局操纵用于漏洞利用》的论文[论文][演讲][代码]。论文的主要思想是,我们可以将堆布局操纵与漏洞利用制作中的其他大部分工作分离开来,并使用黑盒搜索自动解决它。然而,论文中还有另一个想法,即利用模板,我认为它在将自动漏洞利用生成系统扩展到更多现实世界问题时可能具有普遍用途。
利用模板本质上是一个部分完成的漏洞利用,其中不完整的部分由某种自动推理引擎填充。在上述论文的情况下,自动填充的部分是使堆进入特定布局所需的输入。以下是一个模板示例,展示了针对PHP解释器的部分漏洞利用。漏洞开发人员希望将imagecreate
创建的分配与quoted_printable_encode
创建的分配相邻放置。
|
|
SHRIKE(解析模板并搜索堆布局问题解决方案的引擎)接受一个包含部分完成的漏洞利用的.php文件作为输入,并搜索它应自动解决的问题。用于与引擎通信的指令以字符串X-SHRIKE
开头。它们在上述论文中有完整解释,但相当直接:HEAP-MANIP
告诉引擎它可以在此位置插入堆操纵代码,RECORD-ALLOC
告诉引擎应记录从此点开始的第n次分配,而REQUIRE-DISTANCE
告诉引擎在PHP程序执行的此时,与指定ID关联的分配必须彼此相距指定距离。引擎接受此输入,然后开始搜索将堆放入所需布局的方法。以上片段是针对CVE-2013-2110的漏洞利用,此视频展示了SHRIKE解决它,以及生成的漏洞利用在堆布局问题解决后的运行情况。有关视频中发生情况的更详细描述,请查看其在YouTube上的描述。
那么,这种方法的好处是什么?搜索是黑盒的,不需要漏洞开发人员分析目标应用程序或分配器,并且如果成功,会输出一个新的PHP文件,该文件实现了所需的布局,然后可以进一步工作以完成漏洞利用。这具有连锁效应,使漏洞开发人员更容易探索特定堆溢出的不同利用策略。在“正常”的软件开发中,像长构建周期这样的事情被认为是不好的,而REPLs通常被认为是好的。原因是后者支持形成一个假设、测试它、优化和重复的紧密循环,而前者打破了这个过程。漏洞利用编写有一个类似的假设优化循环,任何可以使这个循环更紧密的技术都将使过程更高效。
关于如何利用漏洞利用模板为漏洞开发添加自动化,仍有许多有趣的工作有待完成。在自动漏洞利用生成研究中,有一种趋势是专注于完全自动化,并且因为这对几乎所有问题都很困难,我们还没有深入探讨哪些方面可以部分自动化。因此,仍有许多领域有待突破。我们越早开始研究这些问题越好,因为如果更一般的程序综合领域有任何参考价值的话,自动漏洞利用生成的未来将更类似于基于模板的方法,而不是端到端的解决方案。