Привет из эпохи Windows 98: системный баг в macOS наглухо вешает сетевой стек спустя 49 дней аптайма

Исследователи обнаружили критическую уязвимость в сетевом стеке операционной системы

2 мин.
Привет из эпохи Windows 98: системный баг в macOS наглухо вешает сетевой стек спустя 49 дней аптайма

Использование компьютеров Mac в качестве серверов, работающих в режиме 24/7, всегда было сопряжено с определёнными трудностями. Несмотря на Unix-подобную архитектуру, операционная система Apple не так идеально приспособлена для длительной автономной работы. Недавно выяснилось, что в macOS заложена критическая ошибка: если не перезагружать устройство ровно 49 дней, 17 часов, 2 минуты и 47 секунд, его сетевой стек TCP/IP полностью выходит из строя.

Проблему обнаружили инженеры компании Photon, которые используют парк Mac для мониторинга сервисов iMessage. В какой-то момент часть устройств начала вести себя аномально: они перестали принимать новые сетевые подключения, хотя продолжали отвечать на эхо-запросы (ping) и поддерживали уже установленные соединения. Такая частичная неисправность сделала диагностику крайне сложной, поскольку для внешних систем мониторинга серверы выглядели абсолютно рабочими. Единственным решением, которое системные администраторы традиционно недолюбливают, стала полная перезагрузка зависших машин.

Заметив закономерность (сбой происходил ровно на отметке в 49,7 дня непрерывной работы) специалисты Photon написали тестовые скрипты. Эксперимент подтвердил теорию: как только наступало критическое время, Mac, непрерывно создающий новые соединения, просто переставал это делать без выдачи каких-либо системных ошибок.

Причиной отказа оказался таймер tcp_now. Согласно сетевым стандартам, операционные системы должны регулярно удалять закрытые TCP-соединения – в macOS этот интервал составляет 30 секунд. Однако из-за ошибки в ядре XNU от Apple, когда таймер достигает своего лимита, происходит целочисленное переполнение. Счётчик математически «замораживается». Когда система пытается выяснить, истекло ли время жизни закрытого соединения, из-за ошибки вычислений она всегда получает ответ «нет».

В результате сетевой стек быстро переполняется «мёртвыми» соединениями, необоснованно удерживающими динамические порты. Как только свободные порты заканчиваются, работа устройства в сети полностью парализуется. Скорость наступления коллапса зависит от интенсивности сетевого трафика, но в серверной среде это происходит стремительно. Подобный класс ошибок хорошо известен в ИТ-индустрии: именно переполнение таймера приводило к знаменитым зависаниям Windows 98 через те же 49,7 дня работы, и схожая логика лежит в основе надвигающейся «Проблемы 2038 года».

На данный момент единственным способом вернуть Mac к жизни остаётся превентивная перезагрузка, хотя инженеры Photon уже ищут программные альтернативы. Стандарт RFC 7323 чётко регламентирует, как система должна обрабатывать достижение лимита времени на часах протокола, однако текущая реализация Apple этому правилу не следует. Исследователи обнаружили упоминания этой же ошибки на форумах Apple Community и ожидают, что компания оперативно выпустит патч, исправляющий баг в ядре.

Мы в Telegram, на Дзен, в Google News и YouTube



ePN