awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

Возобновление 0-RTT и шифрование пакетов

Суть Возобновление 0-RTT QUIC позволяет клиентам прикрепить данные к первому пакету — но без защиты от реплея. Почти полное шифрование пакетов устраняет пассивный сниффинг и RST-инъекцию ценой операционной непрозрачности.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Пользователь повторно посещает сайт, на котором был вчера. В браузере есть сессионный тикет. QUIC отправляет HTTP-запрос в самом первом пакете — ноль RTT — до того, как сервер вообще ответит. Но если злоумышленник перехватит и воспроизведёт этот первый пакет, сервер выполнит запрос дважды.

Механика возобновления 0-RTT

При повторных подключениях к тому же серверу клиент может переиспользовать кешированный сессионный тикет — зашифрованный блоб TLS-состояния, выданный сервером в конце предыдущего соединения. Клиент включает этот тикет в ClientHello и прикрепляет данные приложения (0-RTT данные) в том же Initial-пакете.

Сервер получает Initial, расшифровывает сессионный тикет (содержащий ключи возобновления) и может немедленно обработать 0-RTT данные — без ожидания полного рукопожатия.

Задержка: 0 RTT до обработки сервером первого запроса. На линии 100 ms это экономит 100 ms при переподключении — поверх 100 ms, уже сэкономленных 1-RTT рукопожатием против TCP+TLS.

Уязвимость реплея

0-RTT данные шифруются симметричным ключом сессионного тикета. Злоумышленник на пути захватив Initial-пакет, может позже воспроизвести весь пакет серверу. Поскольку у 0-RTT нет защиты от реплея на уровне TLS-записи, сервер получит и обработает воспроизведённый запрос.

Конкретная атака: Алиса отправляет POST /api/transfer amount=5000 from=alice to=bob в 0-RTT. Злоумышленник захватывает и воспроизводит пакет. Сервер выполняет перевод дважды: Алиса теряет 10 000 вместо 5 000.

Защита:

  1. Ограничить 0-RTT только идемпотентными запросами. GET, HEAD и безопасные операции — безопасны; воспроизведение даёт тот же результат. POST, DELETE и изменяющие состояние операции должны ждать 1-RTT ключей.
  2. Ответ 425 Too Early. Когда сервер перенаправляет 0-RTT на origin-backend, он включает заголовок Early-Data: 1. Origin может ответить 425 (Too Early), принуждая клиента повторить после полного рукопожатия (RFC 8470).
  3. Изоляция сессионных тикетов. Серверы не должны делиться ключами сессионных тикетов между датацентрами — тикет от Server A должен быть действителен только на Server A. Короткое время жизни тикетов (1–24 часа) ограничивает окно реплея.
Проследи
1/5

Трассируйте атаку реплея 0-RTT QUIC и защиту.

1
Step 1 of 5
Клиент подключается к server.example.com и получает сессионный тикет. Позже открывает новое соединение с 0-RTT данными в ClientHello: POST /api/transfer amount=5000 from=alice to=bob.
2
Locked
Злоумышленник на пути захватывает весь Initial-пакет, содержащий 0-RTT POST. Что он может сделать?
3
Locked
Сервер выполняет перевод дважды. Как сервер защищается?
4
Locked
Сервер перенаправляет 0-RTT на origin-backend. Какой заголовок он должен включить?
5
Locked
Может ли злоумышленник воспроизвести тот же 0-RTT пакет на другом сервере (резервной реплике example.com)?

Почти полное шифрование пакетов

TCP-заголовки открыты — исходный/целевой IP, порты, порядковые номера видны любому наблюдателю. QUIC шифрует почти всё:

Длинные заголовки (рукопожатие и Initial-пакеты):

  • Незашифровано: внешние 4 байта (версия + длина Connection ID) и сам Connection ID.
  • Зашифровано: номер пакета, полезная нагрузка — соответствующим ключом уровня.

Короткие заголовки (постхендшейковые пакеты):

  • Несут только Connection ID и зашифрованный номер пакета + полезную нагрузку.
  • Почти полностью непрозрачны для наблюдателей.

Последствия для безопасности:

  • Злоумышленник на пути не может внедрить RST-пакеты — без 1-RTT ключа нельзя сконструировать валидный зашифрованный пакет. Уязвимость TCP к RST-инъекции устранена.
  • Пассивный сниффинг содержимого потоков устранён — все данные потоков шифруются 1-RTT.
  • Анализ трафика на основе порядковых номеров невозможен без расшифровки.

Операционное последствие: tcpdump QUIC-трафика показывает только непрозрачные блобы. Сетевые инженеры не могут подсчитать HTTP-запросы на endpoint, идентифицировать медленных клиентов или обнаружить некорректное поведение на уровне пакетов без инструментации на уровне приложения.

QUIC vs TCP: что видит сетевой наблюдатель
TCP (открыто)
Исходный / целевой IP: видно
Порты: видно
Порядковые номера: видно
Флаги SYN/FIN/RST: видно
TLS-полезная нагрузка: зашифровано (если TLS)
QUIC (постхендшейк)
Исходный / целевой IP: видно (IP-заголовок)
UDP-порт: видно
Connection ID: видно
Номер пакета: зашифровано
Полезная нагрузка / данные потоков: зашифровано
Викторина

Почему 0-RTT QUIC уязвим к реплею, а TCP Fast Open (TFO) нет?

Викторина

Почему почти полное шифрование пакетов QUIC ломает традиционный мониторинг сети?

Какой RFC?

Какой RFC стандартизирует HTTP-код ответа 425 (Too Early) и заголовок Early-Data для защиты от реплея 0-RTT?

Граничные случаи

Сравнение защиты от реплея 0-RTT с TCP Fast Open: TCP Fast Open хранит cookie, выданный сервером, включающий серверный HMAC и TTL. Сервер проверяет cookie при запросе — если истёк, TFO отклоняется и принудительно выполняется стандартное рукопожатие. Эта встроенная временная проверка защищает TFO от реплея без участия приложения. У 0-RTT QUIC это отсутствует: действительность сессионного тикета контролируется его временем жизни, и в течение этого времени шифртекст может воспроизводиться. Именно поэтому RFC 9001 требует обеспечения идемпотентности на уровне приложения, а не полагается на TLS для защиты от реплея.

Компромиссы 0-RTT и шифрования
Экономия задержки 0-RTT при переподключении
100 ms на линии 100 ms
Риск реплея 0-RTT
любой неидемпотентный запрос
Типы пакетов с длинными заголовками
Initial, 0-RTT, Handshake, Retry
Типы пакетов с короткими заголовками
1-RTT (постхендшейк)
RST-инъекция TCP устранена
да (нет возможности создать валидный RST)
Вспомните перед уходом
  1. 01
    Объясните, почему 0-RTT QUIC уязвим к реплею, а TCP Fast Open нет.
  2. 02
    Что такое код ответа 425 Too Early и когда origin-сервер должен его отправлять?
  3. 03
    Почему почти полное шифрование пакетов QUIC ломает традиционный мониторинг на уровне пакетов?
Итог

Возобновление 0-RTT использует кешированный сессионный тикет для прикрепления данных приложения к ClientHello — ноль RTT для переподключающихся клиентов. Цена — уязвимость к реплею: злоумышленник на пути может захватить и воспроизвести 0-RTT шифртекст, дважды выполнив неидемпотентные операции. Защита трёхсоставная: ограничить 0-RTT безопасными/идемпотентными запросами, использовать механизм 425 Too Early для неидемпотентных случаев, передаваемых прокси, и изолировать ключи сессионных тикетов на сервер, чтобы предотвратить междатацентровый реплей. Почти полное шифрование пакетов QUIC выходит за рамки того, что обеспечивает только TLS: короткие заголовки шифруют номера пакетов и все данные потоков, устраняя RST-инъекцию и делая пассивный сниффинг невозможным. Компромисс — операционная непрозрачность: сетевые инженеры должны инструментировать на уровне приложения, а не на уровне пакетов.

Связанные уроки
встречается в258
Продолжить восхождение ↑Развёртывание и стоимость CPU
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.