论文部分内容阅读
随着软件规模的扩大与内部结构的复杂,境内外恶意程序感染主机规模不断增加。软件安全问题越来越受到人们的重视。编译器作为计算机系统不可或缺的系统软件,几乎所有的可执行代码都是通过编译器编译后产生。大多编译环境都是基于C/C++语言语法语义实现的,由于C/C++编程语言以及相关库固有的安全问题,其存在着大量的缓冲区溢出漏洞。因而提高编译器的防缓冲区溢出能力并减少防御导致的额外性能开销,一直是安全编译研究的热点和难点。 本文结合程序从源代码到最后在机器上执行的全过程,针对不同阶段所面临的缓冲区溢出漏洞威胁,在编译、链接以及基础库等方面实现一个综合的安全编译系统,主要工作包括: 提出了基于堆栈控制流信息备份的控制流完整性保护方法。针对堆栈中控制流信息可能被篡改而导致程序返回时跳转错误的问题,考虑现有防御方法在对间接攻击的防御以及兼容性与性能等方面的不足,设计在GCC编译器上实现防御缓冲区溢出攻击的动态防护方法。使用在动态库中声明的数组来备份函数的控制流信息包括返回地址和栈帧指针从而动态监测非法的篡改行为。 提出了GOT表写保护的控制流完整性保护方法。针对恶意程序可能篡改GOT表而导致链接重定位时提供入口地址错的问题,考虑目前GOT表备份和数据随机化等保护方法在性能和安全性方面的不足,实现了通过限制GOT表读写权限的方法来保护程序控制流完整性。 讨论已有Libsafe库安全增强机制并分析其依赖于栈帧指针回溯栈活动记录的局限性,提出改进的Libsafe库安全检查算法。采用程序指令特征码匹配来回溯函数栈活动记录方法,并引入哈希函数做进一步优化。同时对改进版Libsafe库安全检查算法做了分析,表明算法的有效性和可行性。 实验结果表明:控制流完整性保护技术防御能力优于文中提到的现有6款常见防御工具,其可对缓冲区溢出的直接攻击和间接攻击均有效防护,性能损失在6.6%左右;改进版Libsafe库防御成功率明显优于原始版Libsafe库,性能方面对实验所选SPEC2000一些题目反而有提升;综合控制流完整性保护技术和改进版Libsafe库的安全编译系统准确性和完整性高于上述两种方法,而性能损失则介于两者之间在5%左右。