利用模板实现漏洞利用生成的自动化
在去年的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通常是好的。原因是后者支持形成假设、测试、优化和重复的紧密循环,而前者打破了这个过程。漏洞编写有一个类似的假设优化循环,任何能使这个循环更紧密的技术都将使过程更高效。
关于如何利用漏洞模板为漏洞开发添加自动化,仍有许多有趣的工作要做。在自动漏洞生成研究中,有一种趋势是专注于完全自动化,并且因为这对几乎所有问题都很难,我们还没有深入探索哪些方面可以部分自动化。因此,仍有许多领域有待突破。我们越早开始研究这些问题越好,因为如果更一般的程序合成领域有任何参考价值的话,自动漏洞生成的未来将看起来更像基于模板的方法,而不是端到端的解决方案。