论文部分内容阅读
二进制克隆代码检测(也称为相似性比较)与代码修补技术在软件安全以及软件工程领域有诸多应用。二进制克隆代码检测技术旨在寻找二进制代码之间相似或者相同的代码片段,分析人员由此可以复用已知代码的特性和已有的分析结果,快速理解对象代码,该技术可用于检测已知漏洞代码、推断恶意软件家族、检测代码抄袭等;二进制代码修补技术用以修补二进制程序中的缺陷代码,在源代码缺失的情况下,该技术对于代码补强、遗产代码维护等有着重要意义。然而,以上技术当前仍然主要依靠人工分析实现,已有的方法在分析精度、效率上还存在许多不足,在现实复杂的代码分析情境下捉襟见肘,因此,我们需要在已有工作的基础上更进一步,提高二进制克隆代码检测的精度以及二进制代码修补的质量,同时兼顾分析效率,增强以上技术在应对现实应用时的鲁棒性,以期降低人工成本、减少人为错误、提高劳动生产率。本文提出了在不同指令架构集上检测二进制克隆代码以及基于代码重用修补二进制代码的方法。对于二进制克隆代码检测,本文基于语义代码特征,分别用动态插桩、静态模拟执行和重用运行时信息模拟执行的方法处理二进制程序理解、相似代码比较以及目标代码搜索的问题;对于二进制代码修补,本文针对二进制代码中静态链接的已知缺陷代码,利用相应的正确版本代码产生补丁代码以修复缺陷、避免恶意攻击。本文的主要贡献如下:(1)提出基于动态插桩的克隆代码检测技术辅助理解多架构二进制代码。随着智能设备的不断兴起(比如智能手机),越来越多的程序由传统的桌面平台部署到以ARM或者MIPS为架构的嵌入式系统中,然而,与桌面平台相比,ARM、MIPS等架构上的二进制代码分析方法并不成熟,所以我们提出基于动态插桩的克隆代码检测技术MoCKKNGBIRD,用于理解ARM以及MIPS等指令架构集上的二进制代码。由于MOCKINGBIRD采用语义代码特征和动态监控技术,该技术可以处理不同指令架构集的二进制克隆代码检测问题;我们还提出针对语义特征的标准化策略,进一步增强该技术在现实应用中的鲁棒性。实验结果表明,在多架构二进制相似代码比较中,MOCKINGBIRD平均取得了超过75.0%的准确率,当通过ARM架构上OpenSSL的二进制函数检测其在MIPS架构上的克隆代码时,相较同时期的Multi-MH[1]方案,MOCKINGBIRD将检测准确率提高了 50.0%。(2)提出基于模拟执行的二进制克隆代码检测技术。二进制克隆代码检测在安全、软件工程等领域都有着重要应用,比如代码抄袭检测、恶意软件分析等,我们提出一个基于模拟执行的通用技术CACOMPARE以实现以上分析目标。由于采用模拟执行技术提取代码语义特征,该技术不仅能够比较用不同配置编译产生的二进制代码,比如使用不同的编译器、优化选项等,而且可以覆盖所有待检测代码。实验结果表明,CACOMPARE平均能够得到超过75.0%的准确率,在跨架构检测BusyBox的克隆函数时,相较于同时期的BinGo[2]方案,CACOMPARE将检测准确率提高了 37.9%。(3)提出基于重用运行时信息模拟执行的克隆代码检测技术,用于搜索二进制代码。代码搜索是相似代码比较的一个重要应用,当给定一段样例代码时,分析人员可以利用代码搜索确定目标代码中是否存在类似的代码,典型的场景比如查找已知漏洞函数。我们提出基于重用运行时信息模拟执行的二进制克隆代码检测技术BINMATCH,该技术结合了动态分析以及静态分析二者的优势,不仅利用动态执行过程中丰富的语义信息提高精度,而且通过模拟执行可以覆盖所有目标函数。实验结果表明,BINMATCH能够处理因等价语义变换而存在语法差别的二进制代码,比如编译器优化,甚至代码混淆,在与同时期的Asm2Vec[3]方案的比较实验中,BINMATCH将平均检测准确率提高了 27.7%。(4)提出基于重用正确版本代码修补二进制程序中已知缺陷代码的代码修补技术。二进制代码修补对于软件安全以及软件维护都有着重要意义,比如代码补强、遗产代码维护等,我们提出基于重用正确版本代码的修补已知二进制缺陷代码的技术BINPATCH,该技术基于二进制克隆代码检测技术定位目标缺陷代码,而后重用相应的正确版本代码作为补丁用以修复缺陷,BINPATCH因此无需依赖大量测试用例定位目标代码、限定补丁代码行为,不仅避免了不完备的修补,而且更加适用于二进制代码修补缺乏测试用例的应用场景。实验结果表明,BINPATCH不仅能够准确定位出缺陷代码,而且能够产生相应的补丁代码正确地修复缺陷。