Page 274 - 《软件学报》2020年第11期
P. 274

李威威  等:基于硬件分支信息的 ROP 攻击检测方法                                                     3589


                 重点.ROP 攻击是一种利用代码复用技术的攻击方法,攻击者通过内存漏洞劫持程序的控制流,将代码中已有的
                 以间接分支指令结尾的短指令片段(称为 gadget)串联起来(组成 gadgets-chain),以实现预设的攻击目标                     [1−4] .
                    CFI 技术直接针对程序控制流进行保护,是一种防御 ROP 攻击的有效途径.CFI 技术通过监视程序运行过
                 程中的控制流转移过程,使其始终处于原有 CFG(control flow  graph)所限定的合法范围内.具体的做法是:分析
                 程序的控制流图,重点关注间接分支指令,包括间接 jmp、间接 call 和 ret 指令;在程序运行过程中,对间接分支指
                                                                                                      [5]
                 令的跳转目标进行检测,当攻击者劫持控制流导致分支目标偏离控制流图时,可迅速进行阻断,保证系统安全 .
                    然而,现有的 CFI 技术通常面临着如下几大问题.
                    1)   传统 CFI 技术为了保证控制流检测的完备性,需要针对所有的间接分支进行检测,检测点多,性能开销
                        较大  [5,6] .
                    2)   基于控制流图的粗粒度 CFI 技术为了在间接分支处插入检测点,需要修改源码或者通过反汇编重写
                        二进制代码插入检测代码,依赖于源码或者调试信息,难以适用于部分传统应用程序,限制了方法的
                        实用性   [7−10] .
                    3)   现有的硬件辅助的 CFI 技术为了降低性能开销,通常在 API 函数调用或者窗口页切换处利用存储的
                        分支历史信息进行窗口式检测            [11,12] ,无法做到对单个分支的实时检测,检测之前可能遭受历史刷新攻
                        击 [13] :攻击者在触发检测之前插入合法的程序流,覆盖用于 ROP 攻击的分支历史信息.
                    4)   基于特征检测的 CFI 技术为了与正常程序流中的可能出现的 gadgets-chain 区分开,通常仅根据长
                        gadgets-chain 特征判定 ROP 攻击  [11,12,14] ,难以对利用短 gadgets-chain 的规避攻击进行有效的检测.
                    针对这些问题,本文从降低检测频率、运行时提取检测所需信息、实时检测以及新型短 gadgets-chain ROP
                 攻击检测方法这 4 个角度出发,提出了 MIBChecker(mispredicted indirect branch checker)ROP 攻击检测方法.
                    1)   利用 ROP 攻击所使用的分支会导致 BPU(branch processing unit)预测失败这一特性,仅针对预测失败
                        的间接分支进行检测,在保证控制流检测完备性的同时,降低了性能开销.
                    2)   检测所需信息可直接从运行时获取,包括:a) PMI(performance  monitor interrupt)中断保存的系统状态
                        信息;b)  通过 LBR(last branch record)获取的分支地址信息;c)  根据分支地址获取的分支指令信息.这
                        些信息的提取过程不依赖源码和调试信息,同时也能保证所提取信息的有效性.
                    3)   检测在每个预测失败的间接分支处触发,分支相关 LBR 历史信息是被立即使用的,因此,历史刷新攻
                        击不影响 MIBChecker 的 gadget 检测.
                    4)   提出了敏感系统调用参数检测方法,在敏感系统调用处通过判断敏感系统调用的参数是否来源于之
                        前的 gadget 来检测 ROP 攻击,能够检测已有方法          [11,12] 检测不到的短 gadgets-chain 规避攻击.
                    MIBChecker 方法具备以下优点.
                    1)   安全:在每个可能用于 ROP 攻击的分支处立即触发检测,仅使用 LBR 中当前分支的信息,从根源上避
                        免了 gadget 检测所需历史信息被刷新的可能;同时,以敏感系统调用作为检测点,通过系统调用参数检
                        测方法判断敏感系统调用参数是否来源于短 gadgets-chain,进而能够识别出通过短 gadgets-chain 进
                        行敏感系统调用的规避攻击.
                    2)   透明:通过硬件 PMU 机制,能在预测失败的间接分支处自动触发 PMI 中断进行 ROP 检测,检测所需信
                        息也直接从 LBR 和运行时获取,整个过程对用户级程序透明.
                    3)   性能开销低:仅针对预测失败的间接分支进行 ROP 攻击检测,避免了对预测正确的间接分支进行检
                        测,能够有效减少检测点,控制了性能开销,同时,硬件触发检测相比软件动态插桩式检测也更为高效.
                    本文第 1 节介绍本文的相关研究背景.第 2 节对本文提出的 MIBChecker 检测方法进行详细介绍.第 3 节详
                 细描述 MIBChecker 的实现.第 4 节对 MIBChecker 进行安全性及性能评估.第 5 节对本文进行总结.

                 1    相关研究

                                                                      [5]
                    CFI 作为一种有效的 ROP 攻击防御技术,最早由 Abadi 等人提出 ,该方法假设程序在其执行过程中应当遵
   269   270   271   272   273   274   275   276   277   278   279