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

3594                                Journal of Software  软件学报 Vol.31, No.11, November 2020

                    •   递归 gadget 识别方法
                    首先,利用特征 1 和特征 2 判断当前指令片段是否为 gadget,如果是,且之前的 gadget-chain 长度不为 0,那么
                 从 LBR 中获取当前分支的 from_ip 和 to_ip 信息,和保存的上一个分支的 from_ip 和 to_ip 信息进行比较:如果
                 一致,则将该片段识别为递归 gadget.在 gadget 检测后,从 LBR 中获取当前检测分支的 from_ip 和 to_ip 信息进
                 行保存(用于下一次检测).
                    MIBChecker 采用如下算法来统计 gadgets-chain 的长度(gadgetsChainLength).
                    1)   初始 gadgets-chain 长度为 0.
                    2)   如果当前指令片段被识别为递归 gadget,那么 gadgets-chain 长度不变.
                    3)   如果当前指令片段被识别为 gadget(非递归 gadget),那么将 gadgets-chain 长度加 1.
                    4)   非情形 2)和情形 3)的情形,则将 gadgets-chain 长度清 0.
                 2.5.3    系统调用参数检测方法
                    常规的 ROP 攻击检测方法可能被利用短 gadgets-chain 进行的规避攻击绕过.而通过短 gadgets-chain 进行
                 的规避攻击只能通过较少的步骤达到攻击目的,通常会采用最直接的办法——快速构造系统调用参数,执行敏
                 感系统调用.因此针对此类攻击,MIBChecker 提出了系统调用参数检测方法,利用如下特征进行检测.
                    •   短 gadgets-chain ROP 攻击特征:利用短 gadgets-chain 进行的 ROP 攻击中,攻击者需要利用短 gadgets-
                        chain 来构造系统调用参数进行敏感系统调用,以达到攻击目的.
                    •   ROP 攻击判定方法:在每次检测到 gadget 时,记录当时的系统状态;劫持敏感系统调用,在进行实际系统
                        调用之前,检测系统调用的参数是否与上一次检测到 gadget 时保存的系统状态(以系统架构寄存器的
                        值来表征系统状态)一致,如果一致(即敏感系统调用受到了攻击者控制),则认定当前遭受了 ROP 攻击.
                 2.5.4    检测算法小结
                    结合上述小结的检测算法,ROP 攻击检测的总体算法如图 2 所示.

                        last_lbr:保存上一分支 LBR 信息
                        last_arch_state:上一 gadget 的系统架构信息
                        cur_arch_state:当前的系统架构信息
                        cur_lbr:包含当前分支的 LBR 信息
                        syscall_state:包含系统调用所需参数架构信息
                        chain_length:保存当前的 gadgets-chain 长度,初始值为 0

                        cur_instr(addr):解析 addr 对应内存地址的指令类型

                        last_instr(addr):解析 addr 对应内存地址的上一指令类型
                        match(state1,state2):比较 state1 中的架构信息是否包含 state2 中的所需的架构信息

                        ROP_detect 算法如下:
                        //gadget 检测
                        potential_garget=0;
                        if (cur_lbr.from_iplast_lbr.to_ip<maxGadgetLength)
                          potential_garget=1;
                        if (Cur_instr(cur_lbr.from_ip)==“RET” && Last_instr(cur_lbr.to_ip))!=“CALL”)
                          potential_garget=1;
                        //gadgets-chain 累计
                        if (potential_garget && chain_length>0 && cur_lbr.from_ip==last_lbr.from_ip &&cur_lbr.to_ip==last_lbr.to_ip)
                          recursive_gadget=1;
                        chain_length=recursive_gadget? chain_length:
                          potential_gadget? chain_length+1:0;
                        //ROP 攻击判定
                        if (chain_length>minChainLength|match(last_arch_state,syscall_state))
                          signal ROP-attack (kill the detected application).
                        last_lbr=cur_lbr;
                        if (potential_garget)
                          last_arch_state=cur_arch_state;
                                                Fig.2    ROP detection algorithm
                                                    图 2   ROP 检测算法
   274   275   276   277   278   279   280   281   282   283   284