KextFuzz: Fuzzing macOS Kernel EXTensions on Apple Silicon via Exploiting Mitigations

USENIX Security 2023,

Tingting Yin , Zicong Gao , Zhenghang Xiao , Zheyu Ma , Min Zheng , Chao Zhang .

KextFuzz 论文介绍

本文将介绍由清华大学 NISL 实验室系统安全课题组VUL337)与蚂蚁基础安全合作完成的工作 《KextFuzz: Fuzzing macOS Kernel EXTensions on Apple Silicon via Exploiting Mitigations

近年来,内核模糊测试技术已经得到了广泛的研究,然而,现有方案普遍更适合应用于开源操作系统,闭源系统内核则由于有较大的分析与测试难度,成熟的工作仍十分有限。在闭源操作系统中,macOS 系统封闭的生态、独特的硬件环境和有限的安全分析工具链支撑,使得该系统的安全研究面临的挑战有一定的代表性。这篇文章提出了一个支持 Apple Silicon macOS 内核扩展(驱动,英文缩写 kext)的模糊测试器 KextFuzz,从代码覆盖率收集、接口识别、特权代码测试三个角度,改善闭源目标测试能力,力求在受限的环境中最大化自动化方案的漏洞挖掘能力。KextFuzz 共发现了 48 处 kext 代码缺陷,目前已有五处漏洞获得 CVE 编号。有趣的是,文章的各个设计,均利用了 macOS 自身提供的防御机制来辅助分析或测试,这也是文章题目中 ”exploiting mitigations” 的由来。

Untitled

背景与挑战

macOS 内核主要由 XNU 与 Kernel Extension (内核扩展,缩写为 KEXT) 两部分组成,其中 kext 可以当做 Linux 中的驱动来理解,是 macOS 内核中非常重要的组件,在内核中占据约一半的代码量。除了显卡、声卡驱动等常规驱动外,sandbox、网络协议栈等相对独立的内核功能也由 kext 实现。相比于开源的 XNU,闭源的 kext 分析难度更高,漏洞挖掘、测试更不充分,安全风险还没有得到充分的分析。较大的代码规模、较高运行权限和有限的安全测试,使得 kext 成为了 macOS 重要的攻击面之一。

对 kext 进行模糊测试,主要需要解决三方面的问题:

  1. 如何采集代码覆盖率:Coverage 反馈是提升 fuzz 效率的基本手段。其采集方法通常有代码插桩(kcov)、硬件监听(Intel-PT)与虚拟层监听(AFL-qemu)几种方式。然而,这三种方法均不适用于本文场景。首先,源码插桩无法应用于闭源的 kext;其次,Apple silicon 设备不提供与 Intel-PT 相似的硬件监听功能;此外,Apple Silicon macOS 系统虚拟化技术仍不成熟,虚拟化环境能够支持的 kext 十分有限。基于 binary rewriting 实现的闭源程序插桩技术有一定的可行性,但现有方案容易破坏程序结构,在运行过程中引发崩溃,不适用于稳定性需求高的内核场景。
  2. 如何识别接口格式:准确识别交互接口格式,能够帮助发现更为深层的漏洞。但与开源程序相比,闭源程序携带的信息更少,接口格式更难以提取。macOS 驱动接口又较为复杂,除了能够接收常量、字符串、指针等常规类型输入,还可能使用序列化对象、结构体等复杂的复合类型输入。
  3. 如何绕过权限检查:macOS 驱动广泛使用 Entitlement 检查限制普通程序调用内核敏感功能,而大部分 Entitlement 仅分配给苹果公司或部分特殊开发者(如大型公司),包括 Fuzzer 在内的普通第三方程序难以获取,这限制了 Fuzzer 能够触发的代码范围。然而,在实战中,攻击者仍然可以通过构造攻击链,利用受保护代码中的漏洞,使得受 Entitlement 保护的特权代码成为了一个缺少测试的独特攻击面。

KextFuzz

虽然在 Apple Silicon 设备上做内核 fuzz 有很多限制,但所谓车到山前必有路,KextFuzz 发现,macOS 系统各类严格的防御机制,一方面给动态测试带来了挑战,另一方面也提供了一些额外的分析资源,帮助实现模糊测试。接下来本文将针对上述三个挑战,分别讲讲 KextFuzz 的解决思路:

1. Coverage Collector

KextFuzz 通过 binary rewriting 实现代码覆盖率插桩。插桩,需要在程序中增加额外的代码,但如果直接向 binary 中添加 coverage 采集指令,会导致程序原有指令移位,破坏程序中使用相对偏移或绝对地址表示的引用关系。尽管静态分析可以修复或者避免一部分插桩引发的引用错误,但也难以做到全面、准确,在内核 fuzz 的场景下,容易频繁引发系统崩溃,降低测试效率。

而 KextFuzz 通过替换 PA (Pointer Authentication) 指令,在不破坏程序内部结构的前提下实现了插桩。Kext 广泛使用 ARM PA 指令保护控制流完整性,这些指令能够增加漏洞利用的难度,但在 Fuzz 的场景中没有实际作用。如下图所示,通过移除这些指令,可以释放充足的空间,用于添加 coverage 采集指令。类似地,在其它闭源程序中,可以通过替换 canary, CET 等防护指令达到类似的效果。

Untitled

2. Interface Analyzer

macOS 系统使用开发框架、后台服务等组件封装内核功能,以减少用户态程序对内核的直接调用。这些代码以合法、规范的方式构造 kext 接口调用,通过分析其向 kext 传递的参数,可以提取 kext 接口信息。KextFuzz 通过污点分析从封装层程序中提取上述信息。首先,为减少无关代码对分析结果带来的干扰,KextFuzz 从程序中提取与 kext 调用相关的代码片段,并将其作为分析目标;随后,KextFuzz 对参数初始化操作添加污点标签;最后,部分污点将扩散至 kext 调用参数,通过解析参数携带的污点,可以得知参数的来源并推断其类型(例如 malloc() 的返回值为指针)。KextFuzz 使用的污点分析技术在模拟执行的基础上实现,该方案将污点信息编码为特殊取值,赋值给内存和寄存器,使污点记号能够在代码片段模拟执行的过程中自然扩散,无需额外维护污点传播规则。具体实现方式可以参考论文原文。

Untitled

3. Entitlement Filter

通过 patch kext 中的 Entitlement 权限检查,KextFuzz 能够更有效地测试 kext 中的特权代码。Kext 通过特定接口检查用户态进程是否拥有合法的 Entitlement,因此,KextFuzz 可以通过 binary rewriting hook 相关接口,使其返回检查通过。

实验总结

KextFuzz 的实验结果可以总结为以下几点:

  1. Coverage Collector: 通过替换两类 PA 指令,可以插桩约 35% 的基本块,运行时开销为 2.03x。尽管插桩比例相比源码插桩较低,但仍能够反应测试用例触发代码的深度与广度,在实践中,使用 coverage 反馈做指导,在 24 小时内,KextFuzz 能够在 Table 1 所列驱动中发现六倍于黑盒测试所发现的漏洞。

Untitled

  1. Interface Analyzer & Entitlement Filter: 有效提升代码覆盖率,帮助发现更多漏洞。其中,Interface Analyzer 帮助 KextFuzz 额外发现漏洞两处,加速发现复杂漏洞两处;Entitlement Filter 帮助额外发现漏洞 18 处。
  2. 漏洞发现:KextFuzz 共发现 48 处 kext 代码缺陷,其中五处漏洞已分配 CVE 编号,三处漏洞获得苹果公司赏金奖励。文章也对比了 Intel 设备和 Apple Silicon 设备中驱动的差异。尽管目前 macOS 同时支持两种架构的硬件环境,但不同架构的系统使用的驱动有较大差异,如在 macOS 11 系统中,存在 313 个仅支持 arm 架构的 kext binary,KextFuzz 所发现的漏洞有 13 个位于这些 kext 中。与此同时,Apple Silicon macOS 与 iPadOS、iOS 共享了大量 kext 代码,在 Silicon 设备中发现的漏洞,也容易同时影响其他苹果系统。

Untitled

题外话

文章工作在命名为 KextFuzz 之前,还曾有过一个代号:Expelliarmuzz,也即哈利波特中的缴械咒 “除你武器”,是战斗中最为有效的白魔法咒语之一。这条咒语通过移除对手武装实现攻击,这也正是本文工作想要达到的效果,通过移除/利用 macOS 中的 mitigation,进行漏洞挖掘。只可惜咨询版权方后没有获得授权,只能作为一个小插曲分享给大家了,希望对理解本文内容有所帮助。

另外附带一段 KextFuzz 触发的 touchbar 变色表演,以供娱乐,建议配合音效食用 :)

Untitled

论文还有许多不足之处,欢迎大家交流讨论:

联系方式:[email protected] 殷婷婷

作者介绍:殷婷婷,清华大学网络科学与网络空间研究院博士生,导师是张超老师。她的主要研究方向为模糊测试、macOS 安全、Windows 内核安全、软件与系统安全。

课题组介绍:清华大学软件与系统安全课题组(VUL337)由张超老师带领,团队主要研究兴趣为:针对软件与系统安全领域漏洞与恶意代码等问题,面向主机、移动设备、区块链、物联网、车联网、人工智能系统等目标,研究自动化、智能化攻防技术,构建智能分析系统;针对数据安全与隐私计算问题,研究芯片、系统、算法协同的实用化解决方案。团队长期招聘对安全感兴趣的博士后、工程师、客座研究生、实习生等。

张超老师主页:https://netsec.ccert.edu.cn/chs/people/chaoz/