Кратко

  • RFC 8446 от августа 2018 года помещает настоящий выбор TLS 1.3 в supported_versions. Унаследованные поля legacy_version сохраняют 0x0303, номер TLS 1.2; по ним одним нельзя определить протокол действующего соединения.
  • Если сервер с поддержкой TLS 1.3 договаривается о TLS 1.2, последние восемь байт ServerHello.random должны быть 44 4F 57 4E 47 52 44 01. Для TLS 1.1 или более старой версии последний байт равен 00. Клиент TLS 1.3 обязан прервать старое рукопожатие при обнаружении любой метки.
  • RFC 7507 в 2015 году описал другой путь назад: клиент помечает повторную попытку с низшей версией через TLS_FALLBACK_SCSV, а сервер, способный к более высокой, отвечает inappropriate_fallback. IANA ведёт реестр этих значений.

Старый номер на проходной

Оператор, читающий только ServerHello.legacy_version, может записать соединение TLS 1.3 как TLS 1.2. RFC 8446 оставляет в старом поле 0x0303, а решение переносит в supported_versions. Название «legacy» здесь буквально описывает функцию: сохранить знакомую форму пакета, а не сообщить, какой криптографический протокол запущен на концах. Мониторинг, принимающий табличку за состояние системы, начинает с неверного отчёта.

Старый номер понадобился из-за устройств на пути. Некоторые промежуточные узлы выучили форму прежнего рукопожатия и ломали обмен при встрече с новым шаблоном. Приложение D.4 к RFC 8446 описывает режим совместимости: клиент может отправлять непустой идентификатор сеанса, а фиктивные сообщения ChangeCipherSpec создают знакомую картину. Если конечные стороны выбрали TLS 1.3 в расширении, выполняется именно TLS 1.3. Старая форма рассчитана на наблюдателей посередине.

Эти наблюдатели получили фактическое право вето, не став участниками защищённого соглашения. Узел, который отбрасывает незнакомый трафик, заставляет новый стандарт менять внешность. Стандарт уступил в форме обмена, но оставил решение о версии конечным сторонам. То, что видно посреднику, и то, о чём договорились участники, приходится проверять в разных полях.

Предупреждение на конце случайного числа

Кроме внешнего сходства существовала атака по существу: злоумышленник на пути мог подтолкнуть стороны к старой версии. Сервер с поддержкой TLS 1.3, который выбирает TLS 1.2, обязан закончить ServerHello.random последовательностью 44 4F 57 4E 47 52 44 01. При выборе TLS 1.1 или ниже он использует те же семь первых байт и 00 в конце. Семь байт записывают в ASCII DOWNGRD; последний различает группу старых версий.

Клиент TLS 1.3, получивший ServerHello с TLS 1.2 или ниже, должен искать обе последовательности. При совпадении он завершает рукопожатие с предупреждением illegal_parameter. Метка сообщает, что сервер умел более новую версию, хотя видимый результат оказался старым. Работоспособность старого соединения не отвечает на вопрос, почему стороны с более высокой общей возможностью остановились на низшей.

Стандарт ограничивает силу сигнала. RFC 8446 называет его ограниченной дополнительной защитой сверх обмена Finished. При временных ключах подпись в старом рукопожатии связывает случайные значения сторон; со статическим RSA такая защита отсутствует. Текст также отмечает, что многие ранее установленные реализации TLS 1.2 не последуют новой норме. Восемь байт работают там, где способный сервер их записывает и способный клиент проверяет.

Ещё один сигнал шёл от клиента

RFC 7507 в 2015 году разбирал иной шаг. После неудачного рукопожатия клиенты иногда пробовали версию ниже ради совместимости. Нападающий, способный вызвать неудачу, мог направить клиента к такому повтору. Клиент включает TLS_FALLBACK_SCSV, а сервер, поддерживающий более высокую версию, отвечает inappropriate_fallback. Реестр TLS-параметров IANA содержит сигнальное значение и предупреждение.

Сигнал 2015 года отправляет клиент, который повторяет запрос. Метку 2018 года записывает в собственное случайное значение сервер, умеющий TLS 1.3. Каждый сообщает о знании конкретной стороны в конкретный момент. Если слить их в безликую «защиту от понижения», исчезнет главный вопрос: кто знал о лучшей версии в тот момент, когда соединение пошло назад?

Чьим был старый костюм

Приложение D.4 фиксирует давление уже установленных устройств на форму нового стандарта. TLS 1.3 пришлось выглядеть знакомо, чтобы пройти. Маркер в ServerHello.random провёл другую границу: уступка во внешнем виде не делает принудительное понижение допустимым и невидимым. Конечные стороны сохранили решение о версии, а клиент получил проверяемую улику о выборе более слабого протокола способным сервером.

Официальные документы и реестр устанавливают правила. Чтобы доказать применение режима и метки в конкретном соединении, нужны датированная запись пакетов и сведения о реализациях клиента и сервера. Исторический итог уже точен: в 2018 году TLS 1.3 спрятал настоящий выбор в расширении, оставил старый номер на проходной и потребовал сигнал тревоги в конце случайного значения способного сервера при движении назад.