论文部分内容阅读
软件系统已经应用到现实世界中的各个方面,因此软件系统的漏洞严重威胁着用户,企业,甚至国家。而即使软件开发者用尽最大努力,软件漏洞在现实世界中大量存在,且无法避免。软件公司建立自己的测试团队,并利用各种方式,如模糊测试(Fuzz Testing)来发现各种软件系统中的存在的漏洞。然而,随着软件复杂度的日益增加及软件开发周期的日益缩短,检测软件漏洞变得更加具有挑战性,这导致软件公司的内部测试团队已然无暇在软件发布之前检测到所有可能的漏洞。当这些漏洞被有意或无意间触发之后,软件系统就会非正常退出或者崩溃,从而严重影响软件的可靠性以及用户的使用体验。为了修复软件系统中的安全漏洞使其不再受攻击,如今的软件厂商除了软件漏洞挖掘技术之外,还采取以下两种新的策略。一,软件供应商通过各种漏洞报告网站,或漏洞赏金计划来鼓励软件用户(如黑客,安全分析人员,研究学者,普通用户等)提交漏洞报告。随后,软件开发者通过分析漏洞报告并重现该漏洞来识别这些软件漏洞。通过漏洞重现,软件开发者可以很容易找到漏洞的根本原因。二,软件供应商会自动化地收集软件崩溃报告,并从中分析并定位软件漏洞的根本原因。软件开发者对崩溃报告中的信息(如Core dump/Memory dump)进行进一步的分析,找到导致软件崩溃的漏洞,以及崩溃的传播过程。综上所述,当软件厂商获知漏洞细节之后,他们会开发出来对应的漏洞补丁来修复漏洞,以防被别有用心的攻击者所利用。因此,对于一个软件漏洞,我们可以通过增强三个阶段—软件漏洞挖掘,软件漏洞重现,软件崩溃分析来提升软件漏洞的发现、识别及诊断技术。同时,这三个阶段的性能,以及效果提升对于最后的漏洞修复有着至关重要的作用。针对这三个阶段,我们利用一些新型方式,如硬件辅助,深度学习来提高其性能及效果。现有的基于代码覆盖率的二进制模糊测试主要受限于繁重的动态插桩,其性能远低于源码级别的模糊测试。在漏洞挖掘阶段,我们设计了 PTrix,利用Intel PT这个硬件特性来替代繁重的动态插桩来收集代码覆盖,从而提高二进制模糊测试的性能,并且发现新的深层次漏洞。在漏洞重现阶段,我们首次对大量现实世界中的安全漏洞,执行一个大规模的经验性实验来调研软件漏洞的可重现性。通过实验我们发现,漏洞报告中普遍缺少各种信息,并且现实世界中的安全漏洞具有很低的可重现性。同时,众包收集的信息可以帮助安全分析专家提高漏洞复现的成功率,但是在解决不可重现的例子时仍然面临很多关键的挑战。为了进一步寻找解决方案,我们调研了黑客,学者以及工程师这些软件安全方向有丰富领域专长的人。除了因特网范围内的众包,我们还发现安全专家重度依赖人工调试以及试探性的推测来推断丢失的信息。最后,在软件崩溃分析阶段,POMP利用Intel PT记录软件执行过程中的控制流,并通过逆向执行恢复程序执行过程的数据流,从而定位导致程序崩溃的根本原因。其中POMP利用假设检验(Hypothesis Testing)来进行内存别名分析。而假设检验的计算复杂度是指数级的,严重影响崩溃分析的性能和效果。为了提高内存别名分析的效率和效果,我们进行了两方面的尝试。一,我们设计POMP++,并引入逆向执行机制来恢复程序崩溃之前的执行状态。此外,POMP++利用静态分析Value-set Analysis来确认内存别名关系,从而提高数据流恢复的能力;二,我们设计并开发了 RENN,通过循环神经网络学习二进制代码访问内存的特征。然后它推测内存引用所访问的内存区域。由于不同的内存区域天然说明它们之间non-alias的关系,我们的神经网络框架可以极大减少假设验证的负担,以便更好地追踪二进制中的non-alias关系。我们通过对比这些工作与现有工作来评估对应的有效性。我们的结果表明,PTrix可以在给定时间内获得更好的测试速度以及达到一些其他工具错过的代码区域。此外,PTrix还找到了在之前测试完善的二进制文件中35个新的漏洞,表明其可以补充现有测试工具的能力;POMP++可以定位到大多数现实世界中漏洞的根本原因,同时更加精确地和有效地定位导致程序崩溃的程序语句,使得软件崩溃诊断更加方便;RENN可以极大地提高诊断软件崩溃根本原因的效率。与现有的先进工作相比,RENN可以到达平均快36.25%的执行速度,检测到平均多21.35%的非内存别名对,最终成功诊断出更多例子的根本原因。