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

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


                 的 “ 短 ” 或 “ 违规 ”gadget 、 “ 长 ”gadgets-chain 特征进行 检测 . 设定两 个阈值 :gadget 指令片段最长长度
                 (maxGadgetLength)以及 ROP gadgets-chain 最短长度(minChainLength).
                    •   Gadget 的“短”特性
                    如果从上一个检测分支入口到当前分支的指令的长度低于 maxGadgetLength 阈值,则将该指令片段识别为
                 gadget,即
                                   isGadget=LBR(cur).from_ip−LBR(last).to_ip<maxGadgetLength          (1)
                 其中,LBR(cur)和 LBR(last)分别表示当前检测分支的 LBR 信息和上一次进行检测时保存的 LBR 信息.
                    •   gadget 识别方法
                    从 LBR 中获取当前分支的 from_ip 信息,和保存的上一次分支 to_ip 信息进行比较,如果满足上述条件,那么
                 将当前指令片段识别为 gadget;在 gadget 检测后,从 LBR 中获取当前检测分支的 to_ip 信息进行保存(用于下一
                 次检测).
                    •   Gadget 的“违规”特性
                    正常情况下,ret 指令会返回到 call 指令的下一条指令处,而 ROP 攻击过程中使用的 gadget 通常会破坏这个
                 特性.
                    对于所有的 ret 指令,如果其分支目标的上一条指令不是 call 指令,则将该指令片段识别为 gadget,即
                         isGadget=Cur_instr(LBR(cur).from_ip)==“RET” && Last_instr(LBR(cur).to_ip))!=“CALL”  (2)
                 其中,Cur_instr(addr)和 Last_instr(addr)分别表示地址 addr 对应的指令和它的上一条指令.
                    •   gadget 识别方法
                    利用硬件 LBR 中的分支地址(from_ip 和 to_ip)访问应用内存,分别获取当前分支指令信息以及目标地址上
                 一条指令信息,然后对它们进行动态反汇编来判断指令类型,如果满足上述条件,那么将当前指令片段识别为
                 gadget.
                    •   gadgets-chain 的“长”特性
                    当 gadgets-chain 长度超过 minChainLength 阈值时,那么该 gadgets-chain 判定为用于 ROP 攻击的 gadgets-
                 chain,受保护程序遭受了 ROP 攻击,即
                                       isROPAttack=gadgetsChainLength>minChainLength                  (3)
                    •   ROP 攻击判定方法
                    在每次检测到 gadget 时 , 累计连续的 gadgets(gadgets-chain) 长度 gadgetsChainLength, 如果
                 gadgetsChainLength 大于 minChainLength,那么认为程序遭受了 ROP 攻击.
                 2.5.2    Gadgets-chain 长度累计优化
                    gadgetsChainLength 记录连续的 gadget 数目.常规 ROP 攻击中采用的每个 gadget 都具备一定功能,gadgets-
                 chain 长度统计实际上就是对连续的各种子功能片段进行统计.
                    然而在深度递归调用返回时,单个 ret 指令片段如果较短,那么就有可能被 MIBChecker 识别成 gadget,那么
                 重复的递归返回就可能构成超长的 gadgets-chain,导致误报.
                    本文将这种连续重复使用的 gadget 称为递归 gadget.由于连续重复的 gadget 实际上只能实现单一功能,因
                 此,MIBChecker 对常规的 gadgets-chain 累计方法进行了优化,在 gadgets-chain 长度统计中仅需要将第一个
                 gadget 纳入统计,即不对递归 gadget 进行统计,这样既符合我们统计 gadgets-chain 长度的初衷——统计连续的
                 子功能片段的个数,又可以避免深度递归调用中重复递归返回引起的误报问题.
                    如果当前 gadget 和上一 gadget 一致,那么将当前 gadget 识别为递归 gadget,即
                             isRecusiveGadget =  isGadget (cur )  & & isGadget (last )  & &  ⎫
                                                                                         ⎬            (4)
                                                   ).
                             LBR (cur from ip =  ).  _  LBR (last from ip  & & LBR (cur ). _to ip =  LBR (lastto ip ⎭
                                                                                   ). _
                                                        _
                 其中,isGadget(cur)和 isGadget(last)表示当前指令片段和上一指令片段均为 gadget,LBR(cur),LBR(last)和特征 1
                 描述中具备一样的含义.
   273   274   275   276   277   278   279   280   281   282   283