主要观点:发现并报告了 macOS 内核中的 CVE-2025-24118 竞争条件漏洞,涉及 macOS 内核的多个先进特性,可导致线程kauth_cred_t
凭证指针损坏。
关键信息:
- Safe Memory Reclamation(SMR):XNU 中用于并发、无锁环境下回收内存的算法,基于 epoch 机制,维护全局计数器,线程跟踪观察的 epoch,超过一定进度可释放旧内存,SMR 保护的字段使用原子更新的指针,读者需在 SMR 临界区读取,写入时使用锁序列化。
- Read-Only Pages in XNU:XNU 将凭证等敏感信息放在只读页,通过
zalloc_ro
等 API 管理,memcpy
在 X86_64 上非原子,可能导致并发读者看到部分更新的指针,从而访问无效地址,zalloc_ro_mut
非原子,应使用zalloc_ro_mut_atomic
。 - Per-Thread Credentials:XNU 中的凭证结构
struct ucred
用于跟踪线程安全相关字段,通过 SMR 哈希表让线程共享相同的凭证对象,节省内存,current_cached_proc_cred_update
用于管理线程凭证。 - The Race Condition:代码中存在使用
zalloc_ro_mut
非原子地更新proc_ro.p_ucred
的漏洞,可通过setgid
触发频繁的凭证更新,使kauth_cred_proc_update
调用,从而导致并发读取p_ucred
时观察到部分写入的值,可能导致内核崩溃或凭证损坏。
重要细节: - 漏洞证明的 PoC 可在这里找到,需以
setgid
二进制运行,默认组为staff
,使用everyone
作为第二个组触发凭证切换。 - 向 Apple 报告漏洞时提供的建议修复方法是使用
zalloc_ro_mut_atomic
原子地交换旧凭证指针和新凭证指针,Apple 已在 macOS 15.3 中修复该漏洞。 - 仅在 Intel 系统上观察到此问题,ARM64 上的
memcpy
优化可能提供一定的原子性,未导致kauth_cred_t
损坏。 - 赢得竞争条件时可能出现内核恐慌或凭证悄悄更改,难以确定性地控制无效指针的形成。
- 参考了多个关于并发和无锁数据结构的链接,如 Paul E. McKenney 的书、Keir Fraser 的论文等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。