内存支持战之攻击模型

作者:Diting0x


CSysSec注: 本系列文章主要介绍内存的安全性问题,以及相应的攻击模型及防御措施,对整个系统安全问题的概览有很大的帮助。
转载本文请务必注明,文章出处:《内存持久战之攻击模型》与作者信息:Diting0x


  • 0X01 基本攻击模型
  • 0X02 构建攻击模型

内存破坏是计算机安全中亘古不变的话题。内存破坏也被看作是top three危险的软件错误。像C/C++这种底层语言很容易引来这些bugs. 这些程序语言无法对内存安全性的保证,以至于让一些攻击者利用内存bugs改变程序行为或甚至控制整个控制流(control-flow). 要了解什么是内存安全性,可参考上一篇文章:内存持久战-内存安全性. 然而,一种最显而易见的解决方案就是避免这些容易引起内存破坏的程序语言,用一种内存安全的程序语言去重写这些程序。显然这是不切实际的,比如重写整个OS?
尽管papers的许多防御措施层出不穷,但大部分都无法应用到工业上,归结于以下问题:性能开销太大、与现有的程序特性并不兼容、不够健壮、不够完整、依赖于编译器或源码等等。
对内存的破坏与保护是一场持久战。本文重在总结利用内存破坏的相关攻击及其实施过程。


0X01 基本攻击类型

  • 代码破坏攻击(Code corruption): 攻击者在内存中覆盖程序代码,执行自己写入的代码.
  • 控制流劫持(Control-flow hijack): 攻击者重写程序的返回地址或跳转地址,转而执行自己的代码(shell code).
  • 数据攻击(Data-only attack): 攻击者并不会修改程序控制流,而是操作程序中的关键数据获取额外权限或泄露重要信息。
  • 信息泄露(Information leak attack):任何类型的内存错误都有可能导致内存内容的泄露

注意,也许你会问,怎么没有缓冲区溢出攻击,format string攻击等? 这些都只是实施细节,属于过程,最终目的都可划分为以上的四种攻击模型。可具体看下文的构建攻击模型。

0X02 构建攻击模型

攻击者要实施一次完整的攻击,首先要触发内存错误,具体可按照以下六个步骤进行:
注:Step 1&2 是上述攻击模型通用的过程,必不可少,目的是为了触发内存错误。至于 Step 3-6,有些攻击需要完整的步骤才能执行,有些则在前几个阶段就可以完成。

Step 1: 让指针无效

要让指针无效,可以强制让指针越界(out of bounds),引用越界指针引发空间错误(spatial error)。包括:触发未经过检测的空间分配失败错误(allocation failure),这时指针将变成空指针;在循环中不作边界检测,不断递增或递减数组指针,让指针指向数组边界之外的内存空间导致缓冲区溢出;索引越界,一般由整数溢出、截断、对齐、错误的指针映射导致。

或可让指针指向已经被删除的对象,这时指针称为悬挂指针(dangling pointer).比如,利用不正确的异常处理器(exception handler)回收对象,但并不重新初始化指向这个对象的指针。
引用悬挂指针引发时域错误(temporal error). 时域错误也称为use-after-free漏洞,因为引用(used)悬挂指针是在指针指向的内存区域已经被回收(freed)到内存管理系统之后. 大部分此类的错误指针在heap上分配的对象,但局部变量的指针分配给全局变量后会造成指针逃逸(escape)出局部作用域,在函数返回或栈上的局部变量被删除后逃逸的指针将会变成悬挂指针。

Step 2: 强制让程序引用(读或写)无效指针

Step 3: 利用无效指针修改对象。修改的对象包括数据指针、代码指针、代码、数据变量,以及输出数据变量

Step 4: 偏离源程序执行。可将修改的对象转向攻击者特定的代码(code curruption attack)、也可指向shellcode或者gadget(指一些指令序列)的地址、修改变量特定值、解析输出的数据变量(information leak attack). 注:此时,code currupttion attack与information lead attack过程都已全部完成。

Step 5: 使用修改后的对象。包括利用间接跳转指令 call/jump 引用指针,利用返回指令引用指针,以及引用破坏后的数据变量(data-only attack).至此,数据攻击过程已全部完成。

Step 6: 执行恶意代码。包括重用现有的函数/gadgets以及执行注入的shellcode(control-flow hijack).至此,control-flow hijack过程已全部完成。

最后看两张图,分别是control-flow hijack利用越界指针与悬挂指针劫持控制流的完整过程:







既然谈论的是持久战,针对内存破坏相关攻击的防御措施将在下一篇文章内存持久战-防御措施详细介绍。

References

S&P’13 Eternal War in Memory


转载本文请务必注明,文章出处:《内存持久战之攻击模型》与作者信息:Diting0x