近期 Photon 团队透露,macOS 的内核存在一个严重的整数溢位漏洞,在系统持续运行达到49天17小时2分47秒时,其 TCP/IP 网络协议栈会出现彻底瘫痪。 该问题在目前所有的 macOS 版本中存在。
该问题最早是在Photon用于监控iMessage服务的Mac装置集群中发现,有部分机器会在无明显征兆的情况下拒绝所有新的网络连接,但ping探测正常,已有连接不会断开,这导致问题排查更加困难。
为解决网络问题,运维人员只能通过最原始的重启来恢复。 但经过一段时间后发现,该问题会在 49.7天的运行时间后再次出现。
经过深入调查,Photon 团队发现了问题的所在。 macOS 内核中的 tcp_now 计时器以 32bit 整数来记录系统启动的毫秒数,所以最大值为 4,294,967,295(即2³²-1),刚好就是 49.7天。 数值达到上限后会归零或翻转,如果系统没有进行处理,系统就会出现崩溃的情况,从而导致网络驱动程序认为时间顺序错误,停止处理所有数据。
该问题与 1999年 Windows 98 的 49.7天蓝屏事件一样,都是属于整数溢位问题。
其实RFC 7323标准已经对时间戳时钟溢位时的处理方式作出规范,但是Apple的内核并未进行处理。
对于普通 MacBook 用户,设备会定期关机或者进行重启,所以基本不会出现网络崩溃的问题。 但当下 Mac mini 会被用来进行养龙虾等任务处理,设备需要连续运行数月,所以就会稳定的触发该问题。
目前问题的唯一解决方案便是定期重启,Photon 团队正在开发替代方案,但根源需要苹果进行内核层面的推送更新。