论文部分内容阅读
代码复用攻击中,攻击者篡改程序正常的堆栈并利用软件漏洞劫持控制流。在执行重利用的代码片段之前,攻击者需要将程序的栈指针切换到伪造的调用栈。通过保护程序的堆栈,可以阻止代码复用攻击的必要环节。因此,本文利用影子栈提供后向控制流完整性保护,同时检测并阻止非法栈切换,以防御代码复用攻击。本文主要工作包括:(1)分析影子栈保护方案存在的问题。影子栈保存了每次函数调用时的返回地址,可提供后向控制流完整性(Backward CFI)保护。但现有的影子栈实现方案只适用于单线程,不适用于多线程情形,且需要修改源代码,同时还存在被泄露和篡改的威胁。(2)针对有程序源代码的情况,改进现有影子栈实现方案。通过线程劫持和编译器插装技术避免修改程序源代码并将影子栈技术扩展到多线程情形。利用线程局部存储机制隐藏影子栈,避免其被泄露和篡改。设计实现了原型系统HSS,对该方案的有效性进行了验证,同时测试了性能损耗,开销为5.8%。(3)分析栈切换检测的问题。在实际的ROP攻击中,攻击者会利用栈切换将栈指针指向部署了payload的非栈区域,比如堆区。现有的栈切换检测方法只在和内存操作相关的敏感函数开头插装,检查栈指针是否处于当前线程的合法栈空间,忽略了攻击者将调用敏感函数的payload切换回栈上的可能性,导致可以被绕过。(4)重新设计了栈切换的检查时机,通过在修改栈指针的相关指令后面插装检查动作避免栈切换检查被绕过。在LLVM中实现这一方法,经测试,开销小于1%。