据 Photon 公司在 2026 年 4 月 6 日发布的博客,macOS 系统也存在时间炸弹,在连续运行 49.7 天后 TCP 连接功能会逐步瘫痪,问题发生原因则是苹果在 XNU 内核中的 TCP 网络实现存在缺陷。

该公司提供 AI 服务并且需要长时间运行 Mac 集群处理任务并进行监控,但因为未知原因部分设备会无法正常连接网络,开发团队经过排查和验证后确认这是苹果造成的缺陷。

正常情况下这个问题不会对普通用户造成影响,即便用户没有主动重启设备,苹果也可能推送系统更新重启设备,只有长时间连续运行且不重启的设备才会受到这个问题影响。

问题根源:32 位无符号整数溢出与时钟冻结

这个缺陷的核心在于 XNU 内核中使用 RFC 1323 TCP 时间戳变量 tcp_now,这是一个 uint32_t 32 位无符号整数类型的计数器,以毫秒为单位记录系统自启动以来的时间。

问题在于这个时间的最大值只能是 4,294,967,295 毫秒,约为 49 天 17 小时 2 分 47.296 秒,当系统连续运行超过这个时间周期时,计数器会发生溢出并回绕到接近零。

内核中存在一个单调性保护机制,该机制用于确保 tcp_now 只会向前递增,因此在溢出后旧值 (接近 2³²-1) 大于回绕后的新值,这导致比较条件始终为 false,因此 tcp_now 从此被冻结。

冻结后 TCP 子系统的时钟无法依赖的定时器无法正常工作,最终导致所有 TCP 连接都不能正常被回收,然后当所有端口被耗尽后 TCP 再也无法连接。

缺陷带来的直接影响:

macOS 上的 TCP 连接进入 TIME_WAIT 状态后,默认情况下会保留 30 秒以处理延迟报文,正常情况下内核的 tcp_gc () 垃圾回收函数会根据 tcp_now 判断并关闭这些等待状态。

但在 tcp_now 冻结后,比较逻辑 TSTMP_GEQ (tcp_now, timer) 始终失败,所有 TIME_WAIT 条目永远都不会被回收,于是这就造成诸多问题。

影响 macOS 10.15 及后续版本:

经过测试可以确认这个内核缺陷至少影响 macOS Catalina 10.15 及之后的版本,更老的版本是否有类似问题暂时还无法测试。

值得注意的是这个问题不会引发内核崩溃或者产生明显的错误日志,属于静默失效,所以用户往往难以第一时间定位问题根源。

对可能遇到这个问题的用户,最简单的解决办法就是设置计划重启时间,也就是确保在 49 天以内重启系统一次,至于苹果未来是否会修复这个 BUG 还需要观察。

了解更多:

https://photon.codes/blog/we-found-a-ticking-time-bomb-in-macos-tcp-networking