攻击者视角下的Fuchsia OS与Zircon微内核漏洞利用

本文深入探讨Google开发的Fuchsia OS及其Zircon微内核的安全架构,详细展示了从环境搭建、漏洞测试到实际利用的全过程,包括KASAN测试、堆喷技术、控制流劫持和内核rootkit植入。

Fuchsia OS攻击者视角 | Alexander Popov

Fuchsia是由Google开发的开源通用操作系统,基于C++编写的Zircon微内核构建。设计优先考虑安全性、可更新性和性能。作为Linux内核安全研究员,我决定从攻击者角度研究Fuchsia OS。本文将分享我的研究成果。

内容概要

  • Fuchsia OS安全架构概述
  • 从源码构建Fuchsia,创建并运行简单应用
  • Zircon微内核:Fuchsia内核开发基础及GDB调试
  • Zircon微内核漏洞利用实验结果:
    • 模糊测试尝试
    • C++对象内存损坏利用
    • 内核控制流劫持
    • Fuchsia中植入rootkit
  • 漏洞利用原型演示

遵循负责任披露原则,我已向Fuchsia维护者报告了研究中发现的安全问题。

什么是Fuchsia OS

Fuchsia是Google从2016年开始开发的开源通用操作系统。2020年12月项目对外开放,2021年5月Google首次在Nest Hub智能家居设备上发布Fuchsia。系统支持arm64和x86_64微架构,目前处于活跃开发阶段。

核心安全概念

Fuchsia设计用于多种设备:IoT、智能手机、个人工作站。开发者特别关注安全性和可更新性,因此系统具有独特的安全架构:

  1. 无用户概念:基于能力(capabilities)进行访问控制。用户空间应用程序通过具有相应权限的对象访问内核资源,所有应用仅具有完成任务所需的最小权限。

  2. 微内核架构:与Linux内核相比,大量功能从Zircon微内核移至用户空间,显著减少内核攻击面。Zircon实现了176个系统调用,远多于其他微内核。

  3. 组件隔离(沙箱):应用程序和系统服务称为组件,每个在隔离沙箱中运行,所有进程间通信(IPC)均需显式声明。无全局文件系统,每个组件有独立文件空间。

  4. 软件交付更新机制:应用程序通过URL标识,在运行前由系统下载,确保软件包始终最新。

首次启动

Fuchsia文档提供了完善的快速入门指南。以下命令构建x86_64架构的workstation产品:

1
2
3
$ fx clean
$ fx set workstation.x64 --with-base //bundles:tools
$ fx build

系统可在FEMU(Fuchsia模拟器)中运行,基于Android模拟器(AEMU),后者是QEMU的分支。

创建Fuchsia应用

创建最简单的C++组件:

1
$ fx create component --path src/a13x-pwns-fuchsia --lang cpp

组件向系统日志输出问候信息。组件清单需启用日志转发功能。构建并测试新组件。

Zircon开发日常

Zircon C++代码位于zircon/kernel目录,随Fuchsia编译构建。开发调试需在QEMU中运行Zircon,但非英语区域设置会导致启动错误,需手动修复。

GDB调试Zircon

启动Fuchsia于QEMU/KVM中启用GDB调试:

1
$ fx qemu -N -s 1 --no-kvm -- -s

允许执行Zircon GDB脚本,提供KASLR适配、专用命令和改进的崩溃消息显示。但脚本可能因处理大型符号文件而挂起,需移除-readnow参数。

接近Fuchsia安全:启用KASAN

KASAN(内核地址消毒剂)检测内核内存损坏。Fuchsia支持编译带KASAN检测的Zircon微内核。通过注入合成UAF错误测试KASAN功能,成功触发内核崩溃并生成详细报告。

Fuchsia的syzkaller(已损坏)

尝试使用syzkaller进行模糊测试,但由于Fuchsia特殊的软件交付机制和构建系统问题,集成失败。2020年的旧版本syzkaller无法与当前Fuchsia版本兼容,且维护者未回应求助邮件。

艰难的策略选择

缺乏模糊测试支持后,决定专注于开发CVE测试漏洞的利用原型,而非寻找零日漏洞。

我们需要堆喷!

专注于利用TimerDispatcher对象的UAF漏洞。通过IPC系统调用实现堆喷技术,使用Zircon FIFO创建多个对象覆盖释放的TimerDispatcher。

C++对象剖析

Zircon的C++对象内存布局复杂。通过实验发现,通过覆盖虚拟方法表指针可实现控制流劫持,无需像Linux内核攻击中寻找函数指针。

绕过Zircon的KASLR保护

尝试通过内核日志泄漏信息绕过KASLR,但发现KASLR未实际工作——内核地址在重启后保持不变。维护者确认此问题已知。

Zircon中的虚拟方法表

虚拟方法表指针位于对象起始处。方法地址通过相对于vtable位置的偏移计算。通过构造伪vtable实现控制流劫持。

制作伪虚拟方法表

考虑SMAP保护后,决定禁用SMAP/SMEP并将vtable置于用户空间。通过精心计算偏移,使内核跳转至攻击者控制的函数。

在Fuchsia中破解什么

获得内核代码执行能力后,探索权限提升可能。最终决定植入内核rootkit而非攻击IPC机制。

Fuchsia中的系统调用

Zircon具有系统调用表,x86_64架构下通过x86_syscall()函数处理。表地址固定,包含176个系统调用处理函数。

在Zircon微内核中植入rootkit

通过覆盖系统调用表实现rootkit功能。选择覆盖assert_fail_msg()函数,因其尺寸足够容纳hook代码。编写汇编hook处理zx_process_create系统调用,打印日志消息后跳转至原处理函数。

漏洞利用原型演示

实现了针对zx_process_createzx_process_exit的hook,成功在内核日志中显示rootkit活动。2022年6月17日与Google Fuchsia团队进行了视频交流,讨论了威胁模型和防护措施。

结论

本文介绍了Fuchsia OS及其Zircon微内核,从安全架构概述到实际漏洞利用。向Fuchsia维护者报告了发现的安全问题,这是首批公开的Fuchsia安全研究之一,希望对系统安全研究社区有所启发。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计