В macOS обнаружена сетевая «бомба замедленного действия», срабатывающая через 49,7 дней
Использование Mac в качестве сервера — занятие, мягко говоря, нетривиальное. Несмотря на Unix-корни, операционная система не рассчитана на круглосуточную работу без присмотра. И, как выяснилось, в ней есть критический баг: если оставить компьютер работать ровно 49 дней, 17 часов, 2 минуты и 47 секунд, его сетевая подсистема TCP/IP перестанет функционировать. Единственное временное решение — перезагрузка.
Об этом сообщила команда Photon, которая столкнулась с загадочной проблемой в парке Mac-машин, используемых для мониторинга службы iMessage. Некоторые компьютеры внезапно переставали отвечать на новые сетевые подключения, хотя продолжали откликаться на ping-запросы. При этом существующие соединения оставались активными, что сильно затрудняло диагностику.
После перезагрузки проблема исчезала, но, как известно любому системному администратору, это не решение, если причина неизвестна. Команда Photon, отследив ещё одну группу машин, приближавшихся к отметке в 49,7 дней беспрерывной работы, запустила тестовые скрипты. Их предположение подтвердилось: в роковой момент Mac перестал создавать новые соединения без каких-либо ошибок.
Корень проблемы оказался в внутреннем счётчике ядра под названием «tcp_now». Он отслеживает время с момента загрузки с точностью до миллисекунды для нужд TCP-стека. Этот счётчик представлен 32-битным целым числом без знака, максимальное значение которого — 4 294 967 295. В миллисекундах это 4 294 967 секунд, или те самые 49,7 дней. По достижении этого лимита счётчик должен корректно переполниться, но из-за бага в ядре XNU от Apple он «застревает» на максимальном значении.
В результате, когда система пытается очистить неактивные TCP-соединения (что должно происходить через 30 секунд после закрытия), математика сравнения времени ломается. Система решает, что ни одно соединение ещё не устарело, и не удаляет его. Эфемерные порты накапливаются, пока их не остаётся вовсе, и сетевая подсистема фактически останавливается. Скорость наступления коллапса зависит от сетевой активности, но в серверной среде это происходит очень быстро.
Как отмечает Photon, подобные проблемы, связанные с переполнением целочисленных счётчиков, известны давно. Например, знаменитый крах Windows 98 через 49,7 дней или предстоящая «Проблема 2038 года». Стандарт RFC 7323 чётко описывает, как должна вести себя временная метка (tcp_now) при достижении лимита, но реализация Apple не соответствует спецификации.
Пока единственный способ смягчения последствий — перезагрузка машины до истечения критического срока. Команда Photon работает над альтернативным решением и отмечает, что эта же ошибка, судя по всему, является причиной ряда давних проблем, обсуждаемых на форумах Apple Community. Ожидается, что Apple оперативно выпустит исправление — желательно, раньше, чем через 49,7 дней после публикации отчёта.







0 комментариев