Group of Software Security In Progress

GoSSIP @ LoCCS.Shanghai Jiao Tong University

HeapSentry: Kernel-assisted Protection Against Heap Overows

论文下载

这篇文章是2013年发表在DIMVA(Conference on Detection of Intrusions and Malware & Vulnerability Assessment)上的。作者是Leuven大学的Nick Nikiforakis et.al.

过去防止heap overflow的工作都是用canary保护,在free的时候检查canary的值是不是被破坏了。作者认为这个检测的粒度不够细,要在每次调用syscall的时候检测canary的值是不是被破坏。

系统设计

HeapSentry分成用户态和内核态两个模块。

用户态模块用LD_PRELOAD做hook,劫持了malloc和free函数。在malloc的时候增加了一个canary,并通知内核模块增加一个 “地址-canary“ pair。在free的时候,通知内核模块检查canary。

内核模块用kprobes劫持syscall。一是用来处理HeapSentry用户模块发来的请求;二是在每次目标程序发起syscall的时候都检查canary的值。如果不能通过检查就直接调用exit。

Fig

优化

Syscall 分类 作者给syscall按危险程度分类三类:

Fig

  • 如果是High-Risk就把全部的canary都检查一遍。
  • 如果是Medium-Risk就检查一部分的canary。
  • 如果是No-Risk就不检查。

组操作

HeapSentry用户模块会缓存一部分的canary。每次有malloc的时候新分配的canary会先缓存在用户态的一个buffer里,等buffer满了之后再一起更新到内核里。

Fig

Evaluation

Attack Coverage

测试用的是 Ripe: Runtime intrusion prevention evaluator. In Proceedings of the 27th Annual Computer Security Applications Conference (ACSAC), 2011

Fig

Security Evaluation of Risk groups

从shell-storm上找了100个shellcode,用strace跑,发现95个shellcode都用到了High-Risk的syscall。

Performance

Fig

Fig

(1/32,1/16,1/8是Medium-Risk的时候检查的比例)