
Darwin通知漏洞:一行代码致设备软砖并反复重启 CVE-2025-24091
苹果Darwin Notifications机制存在安全漏洞,沙盒应用可模拟系统通知导致设备DoS,通过特定通知可使设备无限重启。苹果已修复该漏洞,增加权限限制。
- Darwin Notifications 是苹果操作系统 CoreOS 层级的低级进程间通信机制。
- 与
NSNotificationCenter
(进程内) 和NSDistributedNotificationCenter
(进程间,带少量数据) 不同,Darwin Notifications 非常简单,每个通知只有一个UInt64
状态值,通常用于表示布尔值 (0 或 1)。 - 发送通知使用
notify_post
,接收通知注册使用notify_register_dispatch
。 - 发送或获取带有状态的通知需要先注册
notify_register_check
获取句柄,然后使用notify_set_state
或notify_get_state
。 - 关键漏洞点: 任何进程,包括沙盒应用,无需特殊权限即可接收和发送 Darwin Notifications。API 是公开的,没有验证发送者机制。
- 利用此特性,沙盒应用可以模拟系统进程发送具有强大副作用的 Darwin Notifications,导致拒绝服务 (DoS)。
- 通过搜索使用了
notify_register_dispatch
和notify_check
的系统进程,发现很多可以被模拟的通知。 - 一个特别的例子:发送
com.apple.MobileSync.BackupAgent.RestoreStarted
通知会导致设备进入“恢复进行中”模式,最终因超时失败并强制设备重启,仅需一行代码。 - 为了实现跨重启的持久化 DoS,利用了 Widget 扩展在系统启动时被唤醒的特性。
- 在 Widget 扩展的代码入口处调用
notify_post("com.apple.MobileSync.BackupAgent.RestoreStarted")
,并让扩展随后崩溃,促使系统反复尝试唤醒。 - 结果是设备陷入反复重启的“软砖”状态,需要擦除设备才能恢复。
- 该漏洞已报告给 Apple,并分配了 CVE-2025-24091。
- 修复方法是为敏感 Darwin Notifications 引入了新的限制性 entitlement (
com.apple.private.darwin-notification.restrict-post.<notification>
)。 - 敏感通知的名称现在带有
com.apple.private.restrict-post.
前缀,notifyd
会检查发送进程是否拥有对应的 entitlement。 - 该 Entitlement 最早出现在 iOS 18.2 beta 2 中,并在 iOS 18.3 中完全修复了 PoC 中展示的所有问题。
- 漏洞赏金为 US$17,500。