
ListenHub
2
4-28晓曼: 嘿,你最近有没有刷到那个 Darwin 通知漏洞的新闻?说是有一行代码就能把 iPhone 搞成“软砖”,然后不停重启,还挂了个 CVE-2025-24091 的名头。我看了之后直接懵了,这到底是个什么鬼?
原野: 哎哟,这个啊!其实说白了,这事儿得从 Darwin Notifications 说起。你可以把它想象成系统里面最原始的那个传话筒,就只负责传递一个 64 位的数字,通常就是 0 和 1,简单得就像按个开关一样。
晓曼: 这么简单?那它跟咱们平时写 App 用的 NSNotificationCenter 有什么区别?
原野: 那区别可大了去了。NSNotificationCenter 一般都是在一个进程里面转,或者说,借助 NSDistributedNotificationCenter 还能带点数据。Darwin 通知那可是更底层的玩意儿,基本就是发个“我在这儿”或者“我不在”的信号。
晓曼: 噢,我明白了。但是,为什么普通的 App 都能随便调用它呢?不需要什么权限吗?
原野: 这就是问题所在了!这个漏洞就出在这儿。任何进程,哪怕你是个沙盒里面的小游戏,都能自由地注册和发送通知,完全没有任何的权限验证。这 API 就跟自助餐一样,随便你拿。所以,就有人发现,如果你模拟系统进程去发那些敏感的通知,就能搞出大乱子。
晓曼: 比如说呢?能具体说说吗?
原野: 比如说,你发一个叫 com.apple.MobileSync.BackupAgent.RestoreStarted 的通知。这个时候,系统就以为“咦?恢复进程开始了!”,然后屏幕就跳到那个“恢复进行中”的界面,然后呢,超时失败了,整机直接重启。
晓曼: 等等,那这不就是重启一次嘛?怎么会变成软砖,还会循环重启呢?
原野: 这就得靠 Widget 扩展了。Widget 你知道吧?它会在系统启动的时候被唤醒。如果 Widget 一启动就发了这个通知,然后就崩溃了,系统会不停地重试唤醒,结果就是一开机就崩溃,再重启,就这样无限循环,用户根本进不去桌面。
晓曼: 就像那个安装包坏了,然后不停地重启重试,根本没法用。听着我后背都发凉了。
原野: 可不是嘛!后来,研究人员把这个漏洞提交给了 Apple,然后Apple就给它编了个 CVE-2025-24091 的编号,还给了 17500 美金的赏金。
晓曼: 嚯!出手挺大方啊!
原野: 那是!苹果在 iOS 18.2 beta 2 开始搞了个限制性的 entitlement,要求通知名称前面要加一个 com.apple.private.restrict-post. 的前缀,然后 notifyd 会先检查这个进程有没有这个权限,才会让你发送。等到 iOS 18.3,这个漏洞就被彻底堵上了。
晓曼: 明白了。所以说,这事儿给我们的教训就是,底层机制再简单,也不能随便放行啊!万一被黑客利用,靠一个简单的通知就能把设备变成砖头,那可就惨了。以后我们真不能小看那些没人管的接口。
原野: 没错!核心就是,通信的管道越底层、越简单,就越需要权限认证和最小权限原则。这次 Darwin 通知算是给我们敲响了警钟。
晓曼: 好,那今天咱们就先聊到这儿,下次有机会再说其他的神操作。感谢大家的收听!