Apple 发布了 iOS 18.3.1 (build ) 来修补公民实验室报告的与辅助功能22D72框架相关的漏洞。让我们来分析一下吧!
漏洞公告可在此处找到。以下是直接摘自 Apple 网站的概述:
无障碍设施
适用于: iPhone XS 及更新机型、iPad Pro 13 英寸、iPad Pro 12.9 英寸第 3 代及更新机型、iPad Pro 11 英寸第 1 代及更新机型、iPad Air 第 3 代及更新机型、iPad 第 7 代及更新机型、iPad mini 第 5 代及更新机型
影响: 物理攻击可能会禁用锁定设备上的 USB 限制模式。Apple 获悉一份报告称,该问题可能已被利用于针对特定个人的极其复杂的攻击中。
描述:已通过改进状态管理解决授权问题。
CVE-2025-24200:多伦多大学蒙克学院公民实验室的 Bill Marczak
在这篇博文中,我们解释了迄今为止我们对该补丁的理解。
🚧 USB 限制模式
在分析更新之前,让我们简单提一下 USB 限制模式以及它的重要性。
如果 iPhone 在激活该功能时保持锁定状态超过一小时,则通过其端口的数据连接将被禁用,直到用户解锁设备并明确授予配件连接的权限:
这对于减轻涉及外部设备(如法医提取器)的复杂攻击至关重要,例如这个或这个。
能够从锁定屏幕绕过此机制将恢复使用此类设备的可能性。这条最新推文显示了此功能对于威胁行为者的重要性:
在下一部分中,我们将对 CVE-2025-24200 进行初步分析,该漏洞可以在某些条件下绕过 USB 限制模式。
📦设置
在找到实际补丁之前,第一步是下载补丁前后的 iOS 版本:
# pre-patchipsw download ipsw --device iPhone14,4 --build 22D63# post-patchipsw download ipsw --device iPhone14,4 --build 22D72
然后,我们可以从两个版本中提取所有二进制文件和库来调查更改。
🔬 查找补丁
我们首先查看了Blacktop针对每个 iOS 版本生成并发布的差异报告。ipsw diff
从这里,我们可以检查每个值得注意的变化。值得注意的是,在公告中,Apple 提到了改进的状态管理,这可能需要额外的检查,从而引入新的基本块。
使用以下(无头)二进制忍者脚本,我们可以列出同一二进制文件的两个符号化版本的基本块计数差异:
import binaryninjabinaryninja.disable_default_log()defbuild_table(bv: binaryninja.BinaryView):"""Builds a table of function names to their basic block count.""" table = {}for f in bv.functions:ifnot f.name.startswith('sub_'): table[f.name] = [len(f.basic_blocks)]return tabledefdiff_tables(original, patched):"""Compares two basic block tables and prints changes."""for fn in original.keys() & patched.keys():if original[fn] != patched[fn]: print(f'{fn}: {original[fn]} -> {patched[fn]}')t1 = build_table("/path/to/original")t2 = build_table("/path/to/patched")diff_tables(t1, t2)
在接下来的小节中,我们将重点介绍其中两个组件中发现的显著变化。
更改 AXSpringBoardServerInstance
在这个框架中,下面的函数似乎有4个新的基本块。
-[AXSpringBoardServerHelper _handleDisallowUSBRestrictedModeSCInformativeOnly:]
仔细检查后发现,Apple 似乎在函数的最开始处添加了一个检查,以确保设备在显示警报之前已解锁。此警报的标题为 id 的本地化字符串sc.disallow.usb.restricted.mode.alert.title,以及一个可点击的操作,即OK。
顾名思义,该函数仅提供信息,即它仅影响用户界面。我们仍然需要找到在出现警报后有效禁用 USB 限制模式的位置。
更改 profiled
profiled 是一个重要的 iOS 守护进程,处理很多事情,其中包括辅助功能、远程设备管理 (MDM) 等等……
在此版本中,修补了以下功能并获得了 6 个基本块:
-[MCProfileServicer setParametersForSettingsByType:configurationUUID:toSystem:user:passcode:credentialSet:completion:]
diff --git a/original.m b/patched.mindex cd2b537..7fe1bd4 100644--- a/original.m+++ b/patched.m@@ -8,6 +8,13 @@ BOOL has_ent = [selfif (has_some_entitlement == NO) { // Unchanged} else {+ NSDict *rb = [settingsByType objectForKeyedSubscript: @"RestrictedBool"];+ BOOL is_device_locked [[MCDependencyManager sharedManager] isDeviceLocked];+ BOOL restricted_mode_allowed = [+ rb objectForKeyedSubscript: @"FeatureUSBRestrictedModeAllowed"+ ]++ if (restricted_mode_allowed == NO || is_device_locked == NO) { [[[MCProfileServiceServer sharedServer]] setParametersForSettingsByType: type sender: [self remoteProcessBundleID] completion: completion ]++ } else {+ NSError *error = [+ MCErrorWithDomain: _MCSettingsErrorDomain+ code: 0x6d66+ descriptionArray: _MCErrorArray+ errorType: _MCErrorTypeFatal+ ];++ if (completion) {+ completion.completionHandler(completion, error);+ }+ } }
我们可以看到,在调用setParametersForSettingsByType有效设置所需设置(即我们例子中的受限模式状态👀)的内部方法之前,该函数会检查设备是否已解锁。
这似乎是有效缓解 CVE-2025-24200 的补丁。
攻击向量
现在我们对补丁有了更深入的了解,我们需要找到可以让我们利用底层漏洞的代码路径。
第一步是找到可以通过之前确定的两个修补函数之一禁用 USB 限制模式的位置。
经过一番研究,我们发现assistivetouchd守护进程包含通过以下函数禁用 USB 限制模式的代码:
-[SCATScannerManager _setUSBRMPreferenceDisabled]
此函数包含对多个类的引用AX[...]。这暗示它可能与我们讨论的补丁的第一部分(发出警报)有关。这促使我们更加关注这个守护进程。
assistivetouchd守护进程
assistivetouchd 您可以在 iOS 设备上的以下位置找到该守护进程:
System/Library/CoreServices/AssistiveTouch.app/assistivetouchd
通过查看交叉引用来assistivetouchd查找_setUSBRMPreferenceDisabled可以调用的位置,我们可以找到以下函数:
-[SCATScannerManager handleUSBMFiDeviceConnected]
根据其名称,我们可以预期只需连接 MFi(经 iPhone 认证)设备就足以激活它。
下面是我们成功逆向的该函数的代码(虽然可能存在不准确之处):
@implementationSCATScannerManager- (void)handleUSBMFiDeviceConnected { AXSettings btm = [SCATBluetoothManager sharedInstance];bool did_read_rm_alert = [btm switchControlUserDidReadUSBRestrictedModeAlert];bool has_disabled_rm = [self userHasDisabledUSBRM];bool should_disallow_rm = [btm switchControlShouldDisallowUSBRestrictedMode];if (!did_read_rm_alert && !has_disabled_rm && should_disallow_rm) { [btm setSwitchControlShouldDisallowUSBRestrictedMode:NO];// Forwards a call to the AXSettings framework that is responsible// for showing the alert discussed earlier in the patch section// The -[SCATScannerManager _setUSBRMPreferenceDisabled] function that// disables USB restricted mode is passed as the callback handler for// this alert. }}@end
执行一些基本检查以确定是否应显示警报。基本上,如果尚未显示警报并且启用了 USB 限制模式,则应该显示警报。发生这种情况时,唯一的选择是单击OK,这将触发提供的回调。
在这种情况下,回调就是_setUSBRMPreferenceDisabled函数。
手动触发该功能以进行测试
为了验证我们的假设,我们想在可以使用FridahandleUSBMFiDeviceConnected调试的 iOS 设备上任意调用该方法。
不幸的是,我们无法通过ModuleAPI 获得该函数。因此,我们决定采用另一种方法,并assistivetouch使用以下命令从设备中提取二进制文件:
frida-pull -U /System/Library/CoreServices/AssistiveTouch.app/assistivetouchd
从这个二进制文件中,我们可以手动计算可触发函数和目标函数之间的偏移量。
在我们的例子中,我们将使用钩子,-[HNDRocker _shakePressed]因为我们可以在设备锁定时从辅助触摸菜单触发它。以下是onEnter处理程序:
onEnter(log, args, state) {// Following addresses need to be adapted for each build shakePressedBaseAddr = 0x100042858; handleUSBMFiDeviceConnectedBaseAddr = 0x1000ad1c8;off = handleUSBMFiDeviceConnectedBaseAddr - shakePressedBaseAddr shakePressedAddr = this.context.pc; log('ShakePressed::', shakePressedAddr) handleUSBMFiDeviceConnectedAddr = shakePressedAddr.add(off) log('handleUSBMFiDeviceConnected:', handleUSBMFiDeviceConnectedAddr) handle = new NativeFunction(handleUSBMFiDeviceConnectedAddr, 'long', []); handle()},
frida-trace -U assistivetouchd -m'-[HNDRocker _shakePressed]'
如前所述,此时攻击者只需单击OK锁定屏幕即可禁用 USB 限制模式。
-
本节描述的测试是iPhone10,3使用运行 iOS 16.7.10 (build 20H350) 的 iPhone X ( ) 进行的。
如何在实际情况下触发此功能
到目前为止,我们只能通过任意调用该方法来使警报出现-[SCATScannerManager handleUSBMFiDeviceConnected],但我们还不知道在实际条件下应该如何调用它。
我们没有提到的一点是,Assistive Touch功能并不是唯一一个让assistivetouchd守护进程在后台运行的功能。另一个可以做到这一点的辅助功能是Switch Control。
此功能允许将外部设备插入 iPhone 以进行控制。从我们迄今为止查看的各种方法的类名来看,它们都以SC(可能是 Switch Control) 开头,我们可以推断这是合法的方法:将经过 MFi 认证的开关控制设备插入 iPhone。
看了市面上的开关控制设备,似乎大部分都是蓝牙设备。不过,我们发现了一个曾经通过雷电操作的设备。
以下是该产品供应商网站的截图。请注意,该产品不再可用:
当设备处于受限模式时,USB 协议将被完全禁用。但是,其他协议可以通过闪电端口自由使用。例如, MFi 设备可以使用的iAP2协议就是这种情况。
这就是为什么我们认为将这种设备插入启用了切换控制的 iPhone 可能足以使弹出窗口出现并在 iOS 18.3.1 之前从锁定屏幕禁用 USB 限制模式。
免责声明:
虽然我们相信这种方法可行,但目前我们缺乏测试所需的硬件。我们还知道,对于物理配件而言,限制模式并不是唯一的缓解措施,实际利用方法可能更为复杂。
此外,我们仅探索了此漏洞的一个可能攻击媒介,但可能还存在其他攻击媒介。即使您不使用辅助功能,也建议您将设备更新到最新版本。
参考
安全地激活数据连接 - Apple 支持(英国)
-
https://support.apple.com/en-gb/guide/security/sec5044aad1b/1/web/1
关于 iOS 18.3.1 和 iPadOS 18.3.1 的安全性内容 - Apple 支持 (我国)
-
https://support.apple.com/en-ca/122174
关于 Blue2 和 Hook+ 开关接口的重要信息(2024 年 4 月 8 日更新)| OMazing Kids AAC Consulting
-
https://omazingkidsllc.com/2022/06/30/important-info-about-the-blue2-and-hook-switch-interfaces/
stacksmashing - Hithackers 的 Apple Lightning 和 JTAG 黑客指南 - V02
-
https://media.defcon.org/DEF%20CON%2030/DEF%20CON%2030%20presentations/stacksmashing%20-%20The%20hitchhackers%20guide%20to%20iPhone%20Lightning%20%20%20JTAG%20hacking.pdf
原文始发于微信公众号(Ots安全):首次分析 Apple 的 USB 限制模式绕过 (CVE-2025-24200)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论