@romangol
2017-05-04T16:55:57.000000Z
字数 2006
阅读 1722
paper_reading
本周我们在程序分析理解和二进制代码安全方面推荐两篇相关论文,这两篇论文都和如何识别程序中特定的结构/行为相关,是程序分析方面很好的参考文献。
第一篇论文Travioli: A Dynamic Analysis for Detecting Data-Structure Traversals发表在2017年的软件工程顶级学术会议ICSE上,作者是来自加州大学伯克利分校的Rohan Padhye 和 Koushik Sen。论文关注了程序代码对于特定数据结构(data structures)的遍历(traversal)这一常见而又非常重要的过程的动态检测。对数据结构的遍历一般会依据数据结构的特征和相关的算法而执行,例如典型的二叉树前序遍历,理解这一过程不仅能够帮助分析人员更好地理解程序,同时因为遍历操作往往是程序分析中开销比较大的部分,对其进行检测和深入分析往往也能发现性能改善的空间,进而提高程序运行的效率。本论文在Javascript代码上借助Jalangi framework实施动态的程序插桩(instrumentation),根据作者定义的acyclic execution context概念,检测一个函数操作是否为潜在的数据结构遍历操作。其实验不仅体现了较高的准确率和较低的误报率,同时亦可协助分析人员发现一些潜在的冗余遍历操作,为程序优化提供了参考。
该论文的研究方向是程序中特定行为的识别检测,在这一方向上,此前有许多关于密码学算法自动化识别的论文:[Lutz08], [Groebert09], [Matenaar11], [Li12],亦有关于通用的动态分析识别算法的一篇论文[Oksanen11]。此外,在2002年的ASPLOS学术会议上发表的论文Automatically Characterizing Large Scale Program Behavior在刚刚过去的2017年ASPLOS会议上赢得了Most Influential Paper Award
第二篇论文Strict Virtual Call Integrity Checking for C++ Binaries发表在2017年的计算机安全著名学术会议AsiaCCS,作者是George Mason University的Mohamed Elsabagh, Dan Fleck以及Angelos Stavrou。论文研究了C++虚表(Virtual Table)的保护问题,对于C++虚表的保护在很多控制流完整性(Control Flow Integrity)的研究文章中都有提及,相比于之前的工作,这篇文章在一些细节上进行了改进:在实现中,该论文提出的方法不需要更多的预备知识,直接针对二进制代码进行分析即可。作者使用Dyninst对二进制程序重写实现对虚函数调用时的检测,防止利用修改虚表指针进行的攻击。实现代码包括3500~ SLOC的分析代码,以及500~ SLOC的防护机制实现代码。作者通过与GCC编译器的virtual table verification (VTV)策略、VTint(NDSS'15)、vfGuard(NDSS'15)做比较,展示了更好的保护效果。
该论文的研究方向是二进制代码中的C++虚表保护,在这一方向上,最近几年的NDSS学术会议上发表了一系列研究工作:在2015年NDSS上发表的关于C++虚表保护的文章[VTint]中,作者指出,虚表的地址都是只读的内存页,而攻击者针对虚表进行攻击时(vtable corruption & vtable injection attack),攻击的虚表指针都会指向一个可写的内存。VTint通过静态分析识别出虚函数调用地址,对程序二进制文件进行插桩,并对虚表指针地址进行检查。同样发表于2015年NDSS的文章 [vfGuard]使用IDAPython识别出虚表的位置和虚函数调用的地址,并生成CFI规则,最后用Pin插桩在虚函数调用时进行检查。在2016年NDSS上发表的一篇关于C++虚表保护的文章[ivtbl]通过对虚表项的重新排列,使得多重继承下同名虚函数的排列是连续的,从而对虚函数调用的检查只需要做一个地址范围的判断。此外,作为保护的基础,关于二进制代码中虚表的逆向分析和识别也同样是重要的研究点。2017年NDSS上发表的一篇关于C++类继承的文章[Marx]通过检查对象调用的虚函数来恢复类的继承结构。作者通过定义了一系列规则来定位虚表,然后通过把程序二进制文件转成VEX-IR进行虚函数调用的识别,以筛选出前一步中错误识别的虚表。