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、智能手机、个人工作站。开发者特别关注安全性和可更新性,因此系统具有独特的安全架构:
-
无用户概念:基于能力(capabilities)进行访问控制。用户空间应用程序通过具有相应权限的对象访问内核资源,所有应用仅具有完成任务所需的最小权限。
-
微内核架构:与Linux内核相比,大量功能从Zircon微内核移至用户空间,显著减少内核攻击面。Zircon实现了176个系统调用,远多于其他微内核。
-
组件隔离(沙箱):应用程序和系统服务称为组件,每个在隔离沙箱中运行,所有进程间通信(IPC)均需显式声明。无全局文件系统,每个组件有独立文件空间。
-
软件交付更新机制:应用程序通过URL标识,在运行前由系统下载,确保软件包始终最新。
首次启动
Fuchsia文档提供了完善的快速入门指南。以下命令构建x86_64架构的workstation产品:
|
|
系统可在FEMU(Fuchsia模拟器)中运行,基于Android模拟器(AEMU),后者是QEMU的分支。
创建Fuchsia应用
创建最简单的C++组件:
|
|
组件向系统日志输出问候信息。组件清单需启用日志转发功能。构建并测试新组件。
Zircon开发日常
Zircon C++代码位于zircon/kernel目录,随Fuchsia编译构建。开发调试需在QEMU中运行Zircon,但非英语区域设置会导致启动错误,需手动修复。
GDB调试Zircon
启动Fuchsia于QEMU/KVM中启用GDB调试:
|
|
允许执行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_create
和zx_process_exit
的hook,成功在内核日志中显示rootkit活动。2022年6月17日与Google Fuchsia团队进行了视频交流,讨论了威胁模型和防护措施。
结论
本文介绍了Fuchsia OS及其Zircon微内核,从安全架构概述到实际漏洞利用。向Fuchsia维护者报告了发现的安全问题,这是首批公开的Fuchsia安全研究之一,希望对系统安全研究社区有所启发。