Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

Evaluating the Effectiveness of Current Anti-ROP Defenses

论文下载

Introduction

  • 面对种种二进制软件漏洞的防护措施,最成功的攻击技术还是 ROP 。
  • 文章对时下最成功的三类ROP防护手段:kBouncer, ROPecker, and ROPGuard 进行了讨论,并且提出了Bypass他们的方法。
  • 当前手段的误报情况。

Background

  • ROP(JOP) 文章默认攻击者有办法绕过ASLR。
  • Last Branch Recording, 目前ROP防护方法不是基于这个就是基于Control Flow。LBR会记录16条最近的跳转的开始地址和终点地址。

kBouncer

  • 对52个危险地WinAPI做了监控,并且结合LBR(14个条)的记录来判断是否有ROP的可能。最长可识别的ROP链长度为13。
  • 它简单地认为超过8个以上的Gadget存在威胁,但是递归程序会造成误报。
  • 绕过:
    • 常规ROP肯定是先一系列ROP Chain,然后去调用危险的WinAPI。
    • 我们要试着在中间去插入LBR-flushing code,充分去利用只能记14个的弱点冲掉LBR的记录。
  • x86下:
    • LBR-flushing function(lbr-ff)
    • i-jump-gadget: 形如call →A→jmp ({ESI,EDI,EBP,EBX}) 这四个寄存器都是callee-saved的。
      • 攻击路径:ROP Chain part 1→LBR-FF→A→jmp {…}→Protected API→ROP Chain part 2
    • i-call-gadget: 形如call →A→call ({ESI,EDI,EBP,EBX})→B→retn
      • 攻击路径:ROP Chain part 1→LBR-FF→A→call {…}→Protected API→B→retn→ROP Chain part 2
  • x86_64下:
    • 参数要用寄存器来传,Windows下前四个是rcx,rdx,r8,r9,这四个都不是callee-saved的,导致x86下的方法有压力。
    • i-loop-gadget 见论文配图,主要就是利用一个循环里不停call一个地址递增的寄存器。
    • 中间插dummy gadget(没啥影响的gadget)
  • minpe-32/64、MPlayer Lite、IE10 on Windows7 32bit、Firefox 17 on Windows7 32bit

ROPGuard

  • 这个手段主要是被微软采纳了,靠CFI。微软吸收该产品的精华开发了继Windows上ASLR和DEP之后一个防御利器EMET。
  • “We found that our kBouncer example exploits that rely either on i-call-gadgets or on i-loop-gadgets (both minimal vulnerable programs and MPlayer) already bypassed ROPGuard’s implementation in EMET”。

ROPecker

這個檢測方法的話只要是統計了前後的gadgets累計的一個長度,但是指令數過多的gadget不會被認為是一個gadget,如果能夠插在原來的gadget中間,就可以bypass ROPecker的檢查。

Conclusion

目前的ROP防護手段都可以bypass,考察LBR顯然不是一個很明智、很出色的策略。