世界顶级黑客大会 DEFCON 议题详解

雷锋说。编辑:Apple在macOS和iOS中采用了沙箱机制来保护系统免受恶意软件的侵害。在由世界着名的黑客大会DEFCON进行的演示中,来自AliSecurity的安全研究人员分析了最新版iOS中的沙箱机制以及如何获取沙箱配置文件。然后,我讨论了iOS上的IPC机制,并回顾了几个经典的沙箱逃逸漏洞。随后,安全研究人员在iOS11.4上展示了两个沙箱逃脱0day漏洞。

苹果公司在macOS10.5中把沙盒作为“SeatBelt”引入,它提供了MACF策略的第一个全面实现。在macOS上成功试用后,苹果公司又将沙盒机制应用于iOS6中。随着新的系统的发布或新的威胁出现,沙盒的钩子数量一直在稳步的增长。

在MacOS中,配置文件可见并存储在/System/Library/Sandbox/Profiles中。在iOS中,配置文件被硬编译到/usr/libexec/sandboxd中。解码沙箱配置文件很困难,但是我们可以迭代所有Mach服务以获得基于返回值的机器查找列表(例如,通过JonathanLevin的sbtool)。

Mach消息包含类型化数据,可包括端口权限和对大内存区域的引用。XPC消息构建在Mach消息之上,NSXPC消息构建在XPC消息之上。使用Mach消息,沙盒应用程序可以与Mach(MIG)服务,XPC服务和非沙箱化的NSXPC服务进行通信。

bluetoothd的“com.apple.server.bluetooth”Mach服务中有132个函数(从0xFA300开始)。蓝牙通过“com.apple.server.Bluetooth”与沙盒应用程序和其他非沙盒的进程(例如,SpringBoard)进行通信。

但是,Bluetoothd仅使用会话令牌来识别进程,这意味着我们可以使用沙盒应用程序通过会话令牌劫持蓝牙与沙箱外部进程(CVE-2018-4087)之间的通信。

漏洞的原因是ses_token太容易被黑客入侵。它只有0x10000(0x0000-0xFFFF)个可能的值。Apple通过向每个会话添加user_id(=arc4random())来修复此问题,只有进程本身知道user_id,而bluetoothd将检查map[ses_token]==user_id。

如前所述,user_id=arc4random()=[0x00000000-0xFFFFFFFF]。如果我们知道session_token,我们仍然可以通过user_id暴力劫持通信。但这需要很长时间(约12小时)。如果没有user_id验证,是否还有其他回调注册功能?答对了!0xFA365BTAccessoryManagerAddCallbacks()!

但是,通过BTAccessoryManagerAddCallbacks()向bluetoothd发送消息后,没有任何反应!最后,我发现了这个问题。回调事件仅在iOS设备连接到新设备时触发,这意味着我们需要通过手动单击蓝牙设备来触发回调。CallBacks1(需要很长时间),CallBacks2(很难触发),CallBacks3再次!

我们的目标不仅是控制PC指针,还控制整个过程。下一步是创建ROP链并对目标进程执行堆注入。在这种情况下,我们使用MACH_MSGH_BITS_COMPLEXMach消息和MACH_MSG_OOL_DESCRIPTOR格式。如果我们发送消息但没有收到消息,则ROP链将保留在目标的内存空间中。经过多次测试,我们可以在0x105400000处找到MAGIC_ADDR。

我们的可控寄存器是:X3,X4,X5,X19,X20。最后一个BR是X4。到目前为止,我们只能做BOP(JOP)。但在这种情况下,很难控制程序流程。因此,我们需要一个堆栈枢轴来控制堆栈并从BOP转换为ROP。

在libsystem_platform.dylib中可以找到一个很棒的堆栈透视小工具。如果我们可以控制x0,那么我们可以控制sp。

该端口为IPC提供端点。可以向端口发送消息或从端口接收消息。端口可以??包含权限,端口权限可以在消息中传递。进程最重要的端口是mach_task_self()。进程的内存和所有寄存器都可以通过其任务端口进行控制。我们可以使用mach_vm_allocate(target_task_port,&remote_addr,remote_size,1)在远程进程中分配内存。

1.我们可以使用mach_port_insert_right(mach_task_self(),port,port,MACH_MSG_TYPE_MAKE_SEND)向端口插入发送权限。可以通过MACH_MSG_PORT_DESCRIPTOR类型的OOL消息发送这样的端口。

但在iOS11中,Apple添加了一种新的缓解机制来控制沙箱中的应用程序以获取任务端口:

虽然我们无法轻松获取任务端口,但我们可以使用下面的ROP小工具来调用任何函数:

通过这些ROP,我们可以打开更多攻击面并进一步攻击内核。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180814A1HYZ800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券