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