论文部分内容阅读
软件公司控制软件成本和追求利润的本质,软件开发从业人员的疏忽,以及软件测试的不可穷举性等,都造成了程序漏洞的不可避免性。其中最常见的是与非法篡改内存相关的程序漏洞,包括缓冲区溢出漏洞、格式化字符串漏洞、整型漏洞等的。 程序漏洞攻击的表现包括控制流攻击和数据流攻击,其中控制流攻击是指通过篡改函数返回值、函数指针等来劫持程序执行流程,数据流攻击是指通过篡改判断相关数据、用户身份数据等与程序执行控制流无关的数据以造成程序执行异常甚至控制程序执行的攻击。针对这两种攻击形式,安全研究人员提出了很多生成程序签名的方法。已有基于模式匹配的方法,基于程序执行控制流图的方法和基于动态内存染色的方法都具有不同程度的漏/误报率或运行开销。 本文设计、实现并测试了针对控制流攻击和数据流攻击的二进制程序签名,并生成了针对控制流攻击中对函数指针攻击的二进制程序补丁。针对漏洞攻击,方法首先将二进制可执行文件转化为一种中间语言VEX格式;然后在程序运行时对外部输入数据进行染色,并追踪记录外部输入数据的传播路径;最后在检测到程序崩溃后,后向分析程序崩溃点和外部输入数据之间的关联以定位漏洞触发点,并将漏洞触发指令和漏洞关联信息作为程序签名生成。漏洞触发指令和相关漏洞定位信息还可作为程序补丁生成。 我们在Linux平台上,基于二进制动态分析工具Valgrind及其上的染色增强工具Flayer实现了原型系统。使用具有常见内存漏洞的程序来测试系统的有效性和性能损耗。实验结果证明我们的方法生成的程序签名能够有效地检测相同的程序攻击,程序补丁也能有效地使程序在运行时跳过对程序漏洞的触发,并且方法具有很低的执行开销。