论文部分内容阅读
随着信息世界的快速发展,系统与软件安全问题在个体与国家等不同层面越来越被重视。多年来,安全研究员们针对内存泄露类攻击提出了多种防御技术,这其中栈不可执行技术、地址空间布局随机化技术以及金丝雀技术已经得到了广泛部署,并被认为是防御内存泄漏类攻击的标准做法。尽管上述防御技术在可接受的性能损耗下能够提升系统对攻击者的抵御能力,但是由于其设计上的不足,导致技巧熟练的攻击者仍能够在特定环境下绕过这些防御机制,攻击受上述防御技术保护的系统。本论文从金丝雀技术入手,首先分析了现有几种金丝雀(Canary)技术的原理,并从其保护机制的强度、粒度、针对问题等角度讨论了它们的一些特点与不足。然后,我们指出目前基于金丝雀技术的工作,在函数返回时的验证信息不仅在崩溃自启动的服务端程序中可以被暴力破解,在一般应用程序中也存在被破解的风险,在此基础上我们研究对程序中每个函数返回前的验证信息进行随机化的技术。针对这一问题场景,我们实现了一套基于源码的自动化工具。工具包含了一个基于GCC编译器的插桩插件和一个地址无关的动态共享库,GCC插件主要负责在源码经GCC编译器编译为可执行程序的过程中插入负责动态信息验证的代码段,动态库则负责替换需要被改写的库函数以及提供其他与动态信息验证相关的功能函数。在进程创建时,调用动态库中的函数生成验证信息缓冲区,可执行程序中的插桩代码段负责在发生函数调用时从缓冲区中随机地取出验证信息,并放置验证信息到函数栈桢中,在函数执行完毕返回时校验验证信息,从而实现对恶意攻击行为的检测以及防止验证信息被破解。