Control-Flow Integrity(控制流完整性) 的提出与发展历程

1 引言

1.1 控制流劫持

计算机经常受到旨在控制软件行为的外部攻击。这种攻击作为数据传输并驻留在程序存储器中,就触发预先存在的软件缺陷。通过利用这些漏洞,攻击可以破坏执行并获得对软件行为的控制。

在二进制安全中,大部分的漏洞利用方式是劫持控制流,接着使程序按照攻击者的攻击思路运行下去。控制流劫持是一种危害性极大的攻击方式,攻击者能够通过它来获取目标机器的控制权,甚至进行提权操作,对目标机器进行全面控制。当攻击者掌握了被攻击程序的内存错误漏洞后,一般会考虑发起控制流劫持攻击。

早期的攻击通常采用代码注入的方式,通过上载一段代码,将控制转向这段代码执行。例如,应用程序中的缓冲区溢出可能导致对敏感系统函数的调用,可能是应用程序从未打算使用的函数。

通过栈溢出控制程序中某个函数的返回地址,然后在该地址上布置 shellcode,将控制流劫持至 shellcode。为了阻止此类攻击,在硬件的支持下,现代操作系统都增加了 DEP(Data-Execution-Prevention, NX or W⊕X) 机制,通过限制内存页不能同时具备执行权限和写权限,即隔离数据与代码来阻止程序运行攻击者的恶意数据。

为了突破DEP的防御,攻击者又探索出了代码重用攻击方式,他们利用被攻击程序中的代码片段,进行拼接以形成攻击逻辑。代码重用攻击包括Return-to-libc、ROP(Return Oriented Programming)、JOP(Jump Oriented Programming)等。研究表明,当被攻击程序的代码量达到一定规模后,一般能够从被攻击程序中找到图灵完备的代码片段,绕过 DEP 保护,最后达到攻击者的目的。

1.2 早期的防范措施

已提出的漏洞缓解措施包括堆栈金丝雀[Cowan et al. 1998],运行时消除缓冲区溢出[Ruwase和Lam 2004],随机化和人工异质性[PaX Project 2004; Xu et al. 2003],以及可疑数据的污染[Suh et al.2004年]。

其中,有些减缓技术是不切实际的。例如,依赖于硬件修改或施加高性能损失。在任何情况下,它们的安全利益都有争议:缓解范围通常有限,攻击者已找到方法来规避每个部署的缓解机制[Pincus and Baker 2004; Shachamet et al. 2004; Wilander and Kamkar 2003]。

这些机制的局限性部分源于缺乏现实的攻击模式以及对非形式化推理和隐藏假设的依赖。为了实现可靠性,缓解技术应该赋予潜在攻击者的聪明才智以及当前和未发现的软件漏洞的丰富性 - 易于理解和强制执行,同时为强大的攻击者提供强有力的防御。另一方面,为了在实践中可部署,缓解技术应该适用于现有代码(一些优选代码,甚至适用于传统二进制代码)并且产生毕竟低的开销。

2 CFI的提出与发展

2.1 CFI的提出

为了抵御控制流劫持攻击,Abadi等人于2005年提出了控制流完整性(Control Flow Integrity, CFI)的防御机制,是一种通过保证控制流的完整性来实现软件防篡改的方法(基于插桩技术)。

其核心思想是限制程序运行中的控制转移,使之始终处于原有的控制流图所限定的范围内。它规定软件执行必须遵循提前确定的ControlFlow图(CFG)的路径。

CFG可以通过分析(源代码分析,二进制分析或执行分析)来定义。这篇文章关注通过静态二进制分析得到的CFG。 CFG也可以通过显式安全策略来定义,例如编写为安全自动机[Schneider 2000]。

具体做法是通过分析程序的控制流图,获取间接转移指令(包括间接跳转、间接调用、和函数返回指令)目标的白名单,并在运行过程中,核对间接转移指令的目标是否在白名单中。控制流劫持攻击往往会违背原有的控制流图,CFI使得这种攻击行为难以实现,从而保障软件系统的安全。

利用二进制重写技术向软件函数入口及调用返回处分别插入标识符ID和ID_check,通过对比ID和ID_check的值是否一致判断软件的函数执行过程是否符合预期,从而判断软件是否被篡改。

该方法虽能防范多种类型攻击,但实现复杂,且由于判断软件是否被篡改的全部逻辑都在该软件自身中存在,故该防护机制易于被攻击者发现和利用。

2.2 CFI的分类(实现角度)

CFI从实现角度上,被分为细粒度和粗粒度两种。

细粒度CFI严格控制每一个间接转移指令的转移目标,这种精细的检查,在现有的系统环境中,通常会引入很大的开销。而粗粒度CFI则是将一组类似或相近类型的目标归到一起进行检查,以降低开销,但这种方法会降低CFI的保护效果。

2.3 CFI的发展历程

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值