这是关于目前发现的最喜欢的 iOS 漏洞之一的故事。
- Darwin 通知:大多数 iOS 和 Mac 开发者熟悉[NSNotificationCenter]和[NSDistributedNotificationCenter],而 Darwin 通知更简单,是 CoreOS 层的一部分,提供进程间简单消息交换的机制,每个通知有一个关联的
state
(UInt64
),通常用于表示布尔值true
或false
。 - 漏洞:苹果操作系统(包括 iOS)上的任何进程都可以在沙盒内注册接收任何 Darwin 通知,无需特殊权限,且发送通知也无需特殊权限,API 是公开的且无验证发送者的机制,由此引发了对利用其进行拒绝服务攻击的思考。
- 概念验证:EvilNotify:通过寻找使用
notify_register_dispatch
和notify_check
的进程,创建了测试应用“EvilNotify”,能实现多种影响整个系统的操作,如在状态栏显示“液体检测”图标等。 - “恢复中”:找到最有希望的拒绝服务攻击方式是触发“恢复中”模式,只需一行代码
notify_post("com.apple.MobileSync.BackupAgent.RestoreStarted")
,SpringBoard 会观察此通知触发 UI,而此操作因设备未实际恢复会超时失败,需点击“重启”按钮重启设备。 - 拒绝服务:VeryEvilNotify:为使 Darwin 通知成为拒绝服务,通过创建包含小部件扩展的“VeryEvilNotify”应用,在扩展的入口点调用
notify_post
,并让扩展在运行后立即崩溃,从而使设备进入“恢复中”状态,需设备擦除和从备份恢复。 - 时间线:2024 年 6 月 26 日向苹果发送初始报告,9 月 27 日收到苹果通知称正在缓解,2025 年 1 月 28 日问题标记为已解决并确认赏金资格,3 月 11 日分配 CVE-2025-24091 并在 iOS/iPadOS 18.3 中解决,漏洞赏金为 17500 美元,苹果已分配 CVE 但相关咨询尚未发布。
- 缓解措施:发送敏感 Darwin 通知现在需要发送进程拥有受限权限,如
com.apple.private.darwin-notification.restrict-post.<notification>
,通知名称带有com.apple.private.restrict-post.
前缀会被notifyd
验证权限,从 iOS 18.2 beta 2 开始引入此机制,多个相关进程开始采用新的受限通知权限,到 iOS 18.3 解决了所有演示的问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。