论文阅读:KOOBE: Towards Facilitating Exploit Generation of Kernel Out-Of-Bounds Write Vulnerabilities

Usenix Security 2020 的一篇关于内核OOB漏洞自动化利用的文章,感觉写的不错。

简介

这篇文章的主要目的是为了评估堆溢出漏洞的可利用性,从而方便开发人员判断漏洞修补的价值。文章提出了KOOBE,一个基于漏洞能力来实现内核堆溢出漏洞的自动化利用的工具。KOOBE的实现主要基于符号执行和基于能力的模糊测试这两种技术。实验在17个内核堆溢出漏洞(公共的exploit只有5个)中生成了11种利用策略。最后,作者认为其他的漏洞利用过程也有机会可以自动化。

研究背景

微软2019年的一篇报告指出在2006-2018年大约70%的漏洞都是内存安全漏洞。因此研究人员需要夜以继日的修补漏洞,这个过程还需要区分漏洞是否可以利用,从而优先修补重要的漏洞。对于难以利用的漏洞,研究人员通常会选择延缓修补的节奏。而内核漏洞的验证是很困难的工作,主要在于这两点:

  • 任何内核利用都是精心设计的多体的交互过程,涉及到一系列攻击者选择的输入(比如系统调用和其参数),而这些都是相互依赖的。

  • OS内核的内部状态数很多,很难穷尽搜索空间去寻找可利用的状态。

因此,自动化评估内核漏洞是否修复就成了一个很重要的问题。这篇文章的目的就是要自动化评估内核漏洞的可利用性,进而帮助研究人员判断漏洞的重要性。

研究方法

研究假设

给定一个PoC触发一个或多个OOB访问,系统生成1个或多个利用原语来实现指令指针的劫持(Instruction Pointer Hijacking)。也就是说,没有到任意代码执行这步,所以也就不是端到端的漏洞自动化利用。但是有互补的技术来补充,比如KEPLER可以自动化将指令指针劫持转换为任意代码执行。

另外,文章假设的内核的防御机制有以下三个,但实际上真正需要绕过的机制只有SMAP,因为作者只做到指令指针的劫持部分:

  • KASLR(Kernel Address Space Layout Randomization)
  • SMEP(Supervisor Mode Execution Prevention)
  • SMAP(Supervisor Mode Access Prevention)

核心思想

在背景部分,作者给出了内核堆溢出的利用过程图解。首先分析漏洞的能力,了解漏洞能覆盖写多少字节,能写多远,以及能写的值。接着,利用heap feng shui技术构造堆的布局,消耗cache当其重填一个新的页的时候,后续的分配就会返回一个连续的地址。以便让分配的漏洞对象和目标对象挨在一起。然后,选择一个目标对象。让其分配到一起。最后,调整PoC用理想值覆盖重要数据,实现指令指针的劫持。

基于以上的漏洞利用过程,KOOBE的设计分为五个部分:

  • 漏洞分析:试图发现所有的漏洞点,并标识对应的漏洞对象
  • 能力归纳:根据PoC来为OOB漏洞生成一个能力
  • 能力探索:探索这个漏洞其他潜在的能力
  • 可利用性评估:选择一个合适的目标对象,产生一个方案(具体的系统调用)
  • 利用原语综合:根据上面的系统调用,结合Heap Feng Shui技术来产生exp

漏洞分析这个部分的工作有点像KASAN,但是KASAN不能提供完整的漏洞点及准确的与漏洞点对应的漏洞对象。作者在这个工作的基础上增加了符号追踪技术。具体点就是在每个对象创建的时候,为其分配一个唯一的符号值,然后用符号追踪技术追踪每个对象。所以对于每次内存访问,如果其包含一个符号表达式,我们就可以直接提取想要的对象。而且,通过查询指针的符号表达式的可能范围,可以发现给的PoC没有触发的潜在溢出。

能力归纳这部分,作者对漏洞能力给出了具体的定义,简单来说,一条PoC路径的能力包括漏洞对象的大小,执行p路径的条件限制集合,以及OOB写漏洞的三个特征。OOB写漏洞的三个特征,可概括为如下三点:

  • 写的距离有多远(how far the write can reach)
  • 能写多少字节(how many bytes can be written)
  • 可以写什么值(what value can be written)

另外,作者还定义了两个PoC能力的比较,也为后面的能力导向的模糊测试的实现奠定了理论基础。

能力探索,存在的意义是给定的PoC通常只有一条路径,会限制我们发现漏洞完整的能力。因此,需要去探索新的PoC,来发掘漏洞完整的能力。能力探索的流程可以分为三步:

  • 去搜寻新的PoC,来扩展现有的能力或者发现一个新的能力

  • 接着重复能力归纳和可利用性评估步骤

  • 直到成功或者时间超过了我们预设的值

具体的实现方法,作者提出了能力导向的模糊测试,也是我认为本文的亮点所在。实际上就是将现有的覆盖率导向的模糊测试修改为能力导向的模糊测试。原本覆盖率导向的模糊测试,是基于覆盖率这一指标,来决定生成测试样例。这里就是基于发现的新能力是否大于旧能力来决定如何生成测试样例。覆盖率导向的模糊测试可以增加发现crash路径的概率,能力导向的模糊测试偏重于发现新的PoC的概率。

到可利用性评估这部分,系统会试图搜索一个或多个合适的目标对象。整个过程实际上就是根据目标对象的条件约束来与能力进行匹配。比如,一个合法的指针的约束就是,其必须指向一个合法的用户空间或者内核空间。然后,KOOBE将目标约束堆叠在前面获得的功能之上,并将它们提供给求解程序以获得解决方案。如果没有产生结果,那就去匹配下一个。在这个步骤,还提到了能力合成的概念。当一个能力单独使用时,不一定能够满足给定目标对象的要求。这不意味着这个能力没有用了,还有可能我们重复使用这个能力,来多次触发OOB写,来达到我们的目的。另外有时候有些利用需要结合多种不同能力来实现,文章用了一个贪心算法来实现能力的合成。

最后利用原语综合这部分,就是用Heap Feng Shui技术来构造内存布局。同时,使用physmap 喷射技术来绕过内核的SMAP防御机制。

实现

KOOBE主要是基于三个现有的工作来实现的:

  • Syzkaller(内核的模糊测试工具)
  • S2E(符号执行框架)
  • Angr(二进制分析引擎)

在实现过程中,作者提到了几个实现上的挑战:

  • 内核crash需要重启
  • 符号执行引擎对符号化长度的支持很差
  • 符号执行不好处理循环
  • 符号索引和循环边界导致的路径冲突问题
  • 目标对象收集问题

内核产生crash需要重启,这样每次模糊测试产生crash就重启一下的话,会有很大的时间开销,作者采取的方式是,在内核中插桩,来跳过导致OOB访问的指令,但同时有新的指令,会保存下来,但也导致了系统状态的不一致性,也就是存在假阳性的情况。

对于符号执行引擎对符号化长度的支持很差这个问题,作者实际上采用了一种相对高效的枚举方法,用最小的OOB长度去试,从而避免破坏系统数据。

对于符号执行处理循环上,作者借鉴了SAGE的思路,利用循环守卫模式匹配规则来自动推断index。不过不是使用原始论文中的动态分析方法,而是用angr来静态分析。

至于符号索引和循环边界导致的路径冲突问题,作者去除了不相关的条件限制,比如printk()函数引起的。

在目标对象收集问题上,作者用LLVM pass构建内核的调用图来处理。同时,作者也补充说明,也可以使用SLAKE这篇文章的来解决。

测试评估

评估使用的漏洞是从CVE数据库和syzbot平台上获取的,分别从这两个平台取7和10个内核堆溢出漏洞。关于syzbot漏洞的选择,作者做了一个说明。平台上有28个堆溢出漏洞,其中8个是不提供c代码测试,8个是由同一个漏洞引起,1个需要错误注入来触发,1个需要root权限来触发,1个已经和CVE关联了。所以,只选择这个平台的10个漏洞。

最后的结果是,7个CVE漏洞中的公开利用策略有4个,产生了11个利用策略,潜在的策略有503个。10个syzbot中的漏洞的公开利用策略有1个,产生了8个利用策略,但其中有一半的漏洞仍然没有产生利用策略。作者对这些没有exp的策略进行验证,发现以他们的知识水平,确实是没有利用策略。

另外,作者验证了去除条件限制的优化方法,发现这种优化确实减少了使用时的时间开销。

总结

这篇文章和FUZE那篇文章很像。不过那篇是提出内核UAF漏洞的自动化利用。这篇是针对内核堆溢出漏洞的自动化利用。这篇文章的亮点在于漏洞能力的提出,并且对堆溢出漏洞能力做了定义,因此衍生出了基于能力导向的模糊测试。虽然这篇文章没有实现端到端的漏洞自动化利用,但是有很多补充的技术,比如KEPLER,可以将指令指针的劫持自动转化为任意代码执行。二者相结合就可以实现完整的内核漏洞自动化利用。

文章使用了Heap Feng Shui策略,实际上简化了很多情况。如果遇到系统有细粒度的随机化机制(Diehard),Heap Feng Shui可能就不好用了,这也意味着这个自动化工具在应用上的一些局限性。

KOOBE中的Fuzzing在种子选择策略上还可再做优化。文中的种子选择策略,只是随机在能力和覆盖率这两个指标挑选,作为模糊测试的导向。下一步的研究也许可以针对这里再作优化,比如在什么情况下,选择以覆盖率导向的模糊测试更优,在另外一种情况下,选择能力导向的模糊测试更优。

这篇文章对我也产生了一些启发。文中提到了对漏洞能力的定义,那么这个能力能不能作为一些机器学习应用在漏洞检测的一个特征呢?另外,文章的结果里列出了很多潜在的利用策略。如何自动化验证这些潜在的利用策略,应该也是一个很有意义的工作。这篇文章是起源于FUZE(内核的UAF漏洞利用),那么还有什么其他漏洞可以自动化利用?

除了idea给的启发,文章的写作风格看得也比较舒服,第三章的漏洞实例贯穿了全文,看文章的时候,结合例子,感觉理解得更深了。或许这种写作技巧可以借鉴到今后的学术写作上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章