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

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


                 3    实   现
                    本文实现的 MIBChecker 系统运行实验环境为:Intel  i5-3320M CPU 2.6GHz,4G RAM;操作系统为 Ubuntu
                 15.04 x86_64(内核版本 3.19.0.93).系统结构如图 3 所示.

                                                       内存信息              应用程序


                                                    指令信息                     敏感系统调用
                                                               系统调用信息
                                  maxGadgetLength                                  Linux 内核
                                                         ROP    检测模块    触发检测
                                  minChainLength

                                                               PMI 信息    PMI 中断处理
                                                 分支地址信息
                                                                                    CPU
                                                                     PMU
                                                           LBR
                                                                         BPU
                                             Fig.3   MIBChecker system achitecture
                                                 图 3   MIBChecker 系统结构

                    ROP 检测模块在 Linux 内核上实现,检测算法如上一节所述.在具体实现过程中,MIBChecker 检测算法还有
                 两个问题需要确定.
                    1)   实际 CPU 平台中不一定支持我们理想的分支事件,那么实际的分支检测触发点如何选择?
                    2)   gadget 检测以及 ROP 攻击判定相关的阈值如何设定?
                 3.1   分支检测触发点选择

                    本文在 Ivy Bridge 平台下实现了 MIBChecker 系统.然而,Ivy Bridge 的 PMU 功能并不支持我们理想的分支
                 检测触发点,那么我们需要从该平台中寻找最接近理想分支事件的事件超集,即选择的事件必须包含所有理想
                 的分支事件(这一原则适用于所有其他平台).
                    经过分析,Ivy Bridge 平台下满足条件的最接近理想分支事件的两个分支事件为:用户态预测失败的跳转分
                 支指令提交事件(事件编码 0xc5,掩码为 0x20)和用户态预测失败的跳转间接分支指令执行事件(事件编码 0x89,
                 掩码为 0xac).
                    针对这两种事件类型,我们利用 perf 性能采样工具对随机选取的 10 个 Linux 常用程序进行了采样,命令为
                                            perf stat −e rac89:u,r20c5:u 〈app〉 〈options〉
                 其中,perf stat 为性能采样命令;−e 用于指示待采样的事件;r〈encode〉用于表示事件编码和掩码,例如 rac89 表示事
                 件编码为 0x89,掩码为 0xac;u 表示事件为用户态事件;app 为待采样的程序名;options 为程序运行所需携带的参
                 数.重复 10 次得到的采样数据平均值见表 1.

                             Table 1    Sample data for two branch PMU events on common Linux applications
                                      表 1   常用 Linux 应用上两种分支 PMU 事件的采样数据
                                                     用户态预测失败的跳转间接           用户态预测失败的跳转分支
                            程序           参数
                                                     分支指令执行事件(rac89:u)       指令提交事件(r20c5:u)
                             ls          −a                  480                   3 505
                           dmesg          −                 42 984                 61 317
                            ps           −a                 14 278                 21 202
                            cat          test                195                   1 787
                           mkdir        newdir               456                   4 048
                            ping   www.baidu.com −c 10        0                      0
                            stat         test                970                   6 229
                           passwd         −                   0                      0
                            gdb          a.out              273 562               710 585
                            tar       −cj test.tar test      1 084                 7 346
                            vi           test                2 894                 12 011
   275   276   277   278   279   280   281   282   283   284   285