Кратко

  • Sharon Goldberg, Aanchal Malhotra, Isaac E. Cohen и Erik Brakke установили, что старые клиенты ntpd принимали Kiss-o’-Death даже с меткой origin timestamp, не соответствующей их запросу.
  • По одному поддельному пакету на каждый настроенный сервер было достаточно, чтобы лишить клиент всех источников коррекции на выбранный атакующим срок; отказ нужно связывать с запросом и ограничивать локальным максимумом.

Обычная атака на доступность требует продолжать посылать трафик. Здесь после нескольких коротких сообщений работать продолжала сама жертва: она послушно не обращалась к серверам времени. Именно эту обратную экономику описали в 2015 году Aanchal Malhotra, Isaac E. Cohen, Erik Brakke и Sharon Goldberg.

Kiss-o’-Death, или KoD, создан не для атаки. Это механизм самозащиты NTP-сервера. Специальный ответ в режиме 4 имеет индикатор високосной секунды 3, stratum 0 и четырёхсимвольный код в поле reference ID. RATE просит увеличить интервал между обращениями, а DENY и RSTR отказывают в обслуживании.

Проблема возникла на стороне того, кто исполнял просьбу. В испытанных версиях ntpd 4.2.6 и 4.2.8 клиент не требовал, чтобы origin timestamp в KoD совпадал с открытым запросом. Подделав адрес известного сервера, атакующий вне маршрута мог отдать команду, не наблюдая настоящего обмена.

Ответу не требовался вопрос

В нормальном NTP-сеансе запрос режима 3 содержит transmit timestamp. Сервер переносит его в origin timestamp ответа режима 4. Проверка TEST2 сравнивает возвращённое значение с незавершённым запросом. Это не криптографическая аутентификация сервера, но полезный nonce: ответ демонстрирует знание конкретного вопроса.

Старый обработчик KoD обходился без такой связи. Внешнего вида серверного ответа было достаточно, чтобы повлиять на будущие запросы. Фильтр по адресу отвечал лишь на вопрос, на кого похож отправитель; он не доказывал, к какой транзакции относится отрицательная команда.

Поле poll задаёт интервал степенью двойки. Значение 17 означает не меньше 2^17 секунд — около 36 часов. Клиенты принимали и значения выше предполагаемого диапазона. При poll 25 речь идёт примерно о годе. Мгновенный ввод создавал состояние, способное пережить смены персонала и сроки хранения телеметрии.

RFC 5905 предписывал при RATE увеличивать интервал. Встроенное исправление меняет противоположный глагол в исходном тексте. Но правильного смысла команды мало: система обязана отдельно проверить её контекст и ограничить длительность исполнения.

Источники времени исчезали по одному

Для прямой атаки требовались адрес клиента и один используемый им сервер. Исследователи показали, как узнать активный сервер: отправить клиенту запрос режима 3. Ответ синхронизированного IPv4-клиента в режиме 4 мог раскрыть адрес текущего сервера через reference ID.

Затем следовал поддельный KoD якобы от этого сервера. Если ntpd переходил к следующему настроенному источнику, процедуру повторяли. Мерой атаки были не пакеты в секунду, а одна принятая команда на один источник. После исчерпания списка часам становилось некого спрашивать.

В лаборатории ntpd 4.2.8p2 работал с тремя общедоступными серверами. До третьего KoD команда дошла примерно за полтора часа. После прекращения эксперимента клиент не отправлял запросов ещё 50 часов, хотя минимальный заданный период составлял около 36 часов.

Периодическая отправка могла сохранять состояние сколько угодно. Но и первый цикл показывал основное неравенство: атакующий платил один раз, а получатель долго исполнял решение. Система обнаружения, которая видит только всплески пропускной способности, могла не заметить главное событие.

В измерении 2015 года более 13 миллионов IPv4-адресов отвечали на запрос, полезный для первого шага. Это историческая оценка одной предпосылки, а не сегодняшнее число уязвимых устройств. Клиенту требовалось также реагировать на KoD и показывать синхронизированный IPv4-сервер.

Лишить поправок — не значит выставить время

Поддельный KoD не записывал в часы произвольное значение. Он прекращал поступление новых поправок. Дальше клиент шёл по локальному генератору, а дрейф зависел от оборудования, виртуализации, нагрузки CPU и реализации.

Стабильная физическая машина могла уходить медленно, виртуальная под нагрузкой — быстрее. Журналы, сертификаты, аутентификация, распределённые базы и расписания имеют разные допуски. Доказанный результат атаки — долгое отсутствие внешней коррекции, а не одинаковая ошибка времени на всех целях.

Поэтому расследованию нужны последняя успешная синхронизация, отправитель и код KoD, результат TEST2, запрошенное и применённое значение poll, оставшиеся источники и неопределённость в режиме holdover. Если молчание отображается лишь как «нет данных», причина исчезает вместе с каналом наблюдения.

Исправление повысило цену команды

Уведомление NTP Project о Bug 2901 относит к прямой уязвимости выпуски до 4.2.8p4; в ветке разработки — до 4.3.77. Версия p4 стала проверять origin timestamp и принимать KoD только при наличии эха реального запроса. Свободно сочинить подходящий ответ вне маршрута стало нельзя.

Это ещё не криптографическая проверка личности. Авторы описали более дорогой остаточный вариант «priming pump»: послать настоящему серверу множество запросов с адресом жертвы, добиться ограничения частоты и заставить сервер самому выпустить правильно связанный KoD. Потребовалось больше трафика, а отступление обычно было короче — например poll 10, около 15 минут, вместо произвольного года.

В 2019 году RFC 8633 добавил вторую линию. KoD принимается только с действительным origin timestamp. Даже тогда клиент должен установить разумный максимум RATE, не выше poll 13, то есть двух часов. Один запрос с чрезмерным poll уже может считаться признаком нападения.

Привязка показывает, какому запросу принадлежит ответ. Аутентификация показывает, кто говорит. Локальный предел решает, как долго чужая команда может управлять поведением. Это три разных контроля, и ни один не следует объявлять заменой двух других.

Goldberg соединила три слоя доказательств

Официальный профиль Boston University описывает подход Goldberg как сочетание криптографии, теории игр и алгоритмов с сетевыми измерениями, моделированием и симуляцией. В NTP-работе стандарт определил ожидаемую семантику, тесты реализации — реальное условие приёма, лаборатория — срок состояния, а сканирование — распространённость видимых предпосылок в то время.

Исследование принадлежит всем четырём авторам: Malhotra, Cohen, Brakke и Goldberg. По странице проекта ответственное раскрытие началось 20 августа 2015 года. Network Time Foundation, NTPsec, Cisco и Red Hat выпустили исправления до публикации 21 октября. Профиль Goldberg не должен превращать коллективный результат в историю об одном изобретателе.

Операционный вопрос применим далеко за пределами NTP. Получив «попробуйте позже», «остановитесь», «откажите», «изолируйте» или «отпишитесь», система должна знать: какой запрос дал команде право, какая сторона её подписала, кто задаёт срок и какой путь восстановления остаётся.

Отрицательный ответ управляет будущим, а не просто описывает текущую ошибку. KoD был дешёв в подделке и дорог в ожидании. Надёжный контроль меняет баланс: требует контекст, ограничивает отступление и фиксирует момент, когда часы перестали спрашивать.

Источники