Сучасні протоколи захищеного передавання даних поверх UDP покликані поєднувати дві вимоги: зберігати абсолютну конфіденційність сесійного стану та коректно реагувати на раптову втрату контексту на сервері. У корпоративних віртуальних приватних мережах (VPN) пограничні шлюзи регулярно перезавантажуються під час оновлення компонентів системи чи міграції контейнерів.

Коли сервер аварійно перезапускається, його оперативна пам'ять очищується, перетворюючи активні сесії клієнтів на «завислі з'єднання». Клієнт продовжує надсилати зашифровані датаграми, однак сервер більше не володіє сесійними ключами для їх дешифрування чи надсилання автентифікованого кадру закриття CONNECTION_CLOSE. Для розв'язання цієї проблеми без створення нових загроз безпеці протокол QUIC (RFC 9000, розділ 10.3) впроваджує криптографічний інструмент: пакет Stateless Reset (скидання без збереження стану).

Проблема втрати стану сесії при перезавантаженні сервера

В орієнтованих на з'єднання архітектурах поверх UDP оперативна пам'ять сервера зберігає таблицю відповідності між ідентифікаторами Destination Connection ID (DCID) та симетричними ключами, згенерованими під час рукостискання TLS 1.3.

Після перезапуску вузла контекст повністю зникає:

Клієнт (Активний стан)                             Сервер (Після перезавантаження)
  |                                                               |
  |--- Зашифрований пакет 1-RTT (DCID: 0x8a3f...) --------------->|
  |    Ключі: [AES-GCM / ChaCha20-Poly1305]                       | (DCID невідомий!)
  |                                                               | (Ключі дешифрування втрачено!)
  |    [Очікування: Клієнт чекає підтвердження ACK]               |
  |    [Таймер: Повторні інтервали зондування PTO]                | (Надіслати CONNECTION_CLOSE неможливо)
  |                                                               |

Без чіткого сигналу клієнт опиняється в тривалому очікуванні. Модуль виявлення втрат ініціює зондувальні інтервали PTO (Probe Timeout) з експоненційним зростанням затримки до завершення тайм-ауту бездіяльності (зазвичай від 30 до 120 секунд). У тунелях VPN це призводить до тривалого зависання голосового трафіку та інтерактивних терміналів.

Невідповідність класичного TCP RST вимогам захищеного UDP

У традиційному протоколі TCP скидання стану виконується службовим пакетом із прапорцем TCP RST. Проте класичний механізм RST має небезпечні архітектурні вразливості:

Критерій безпеки Класичний механізм TCP RST QUIC Stateless Reset (RFC 9000)
Автентифікація джерела Повністю відсутня (легко підробити) Криптографічний токен розміром 16 байтів
Стійкість до втручання Підроблений пакет миттєво рве з'єднання Недоступний для стороннього підбору ($2^{-128}$)
Аналіз трафіку Відкриті прапорці видають скидання сесії Виглядає ідентично зашифрованим Short Header
Небезпека ампліфікації Високий потенціал для відбиття трафіку Розмір строго обмежений, менший за пакет-тригер
Вимоги до ключів Ключі не потрібні Розрахунок через HMAC/HKDF від секрету сервера

Якби транспортний протокол дозволяв надсилати відкриті неавтентифіковані команди розірвання через UDP, сторонні зловмисники могли б вибірково руйнувати зашифровані тунелі enterprise-рівня.

Архітектура та математична генерація токенів Stateless Reset

QUIC усуває цю загрозу через узгодження секретного 16-байтного перевірочного токена Stateless Reset Token під час початкового рукостискання.

Під час обміну транспортними параметрами сервер формує та передає унікальний токен для кожного згенерованого Connection ID. Обчислення виконується за алгоритмом HMAC на базі секретного статичного ключа кластера:

$$\text{ResetToken} = \text{HMAC-SHA256}(K_{server_secret}, \text{ConnectionID})[0..15]$$

Оскільки ключ $K_{server_secret}$ зберігається у захищеному сховищі та не зникає при перезапуску процесу, сервер після рестарту здатен обчислити валідний токен для невідомого пакета за мілісекунди без збереження даних клієнта в RAM.

Сервер зчитує DCID із заголовка отриманого пакета, пропускає його крізь односторонню функцію та генерує саме ті 16 байтів, на які чекає клієнт.

Структура пакета та унеможливлення виявлення системами DPI

Принциповою вимогою стандарту QUIC є захист від осифікації мережі та збереження приватності. Системи глибокого аналізу пакетів (DPI) не повинні відрізняти скидання з'єднання від звичайного зашифрованого пакета Short Header.

Пакет Stateless Reset має вивірену структуру:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|1|P|R|R|         Псевдовипадкові байти (від 38 до 1024+)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+               Stateless Reset Token (16 байтів)               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  1. Формат заголовка: Перший байт містить біти 01, повністю наслідуючи структуру заголовка 1-RTT.
  2. Псевдовипадкове навантаження: За першим байтом слідують криптографічно стійкі випадкові байти з високою ентропією.
  3. Хвостовий блок: Останні 16 байтів датаграми займає розрахований токен перевірки.

Коли клієнт отримує пакет Short Header, автентифікація AEAD якого зазнає невдачі, він не відкидає його відразу. Клієнт виділяє останні 16 байтів і порівнює їх із переліком зареєстрованих токенів у константному часі. При збігу клієнт фіксує перезапуск сервера та негайно закриває сесію.

Для зовнішніх спостерігачів цей пакет виглядає як типовий нерозшифровуваний трафік.

Захисні бар'єри проти атак підсилення та циклічного відбиття

Оскільки пакети скидання створюються без збереження стану, специфікація RFC 9000 визначає жорсткі захисні обмеження для унеможливлення атак типу DoS:

Отримано пакет-тригер (Розмір: S_in)
         |
         v
Перевірка розміру: S_in >= S_min?
         |--- Ні ---> Приховане відкидання (Захист від ампліфікації)
         v
Обмеження розміру відповіді: S_out <= S_in - 1 байт
         |
         v
Надсилання Stateless Reset (Розмір: S_out) ---> Виключення нескінченних циклів
  • Правило зменшення розміру: Пакет скидання зобов'язаний бути строго меншим за отриманий пакет-тригер (щонайменше на 1 байт). Якби вузли без збереження стану відповідали пакетами однакового чи більшого розміру, виникла б нескінченна петля взаємного відбиття, що заблокувала б мережу.
  • Мінімальний поріг тригера: Сервер ігнорує надто короткі датаграми (менше 43 байтів), запобігаючи використанню вузла як підсилювача трафіку.
  • Обмеження інтенсивності (Rate Limiting): Застосовується алгоритм маркерного кошика (token-bucket) для контролю кількості згенерованих пакетів скидання на секунду.

Миттєве відновлення тунелів у мережевому стеку RiceGuard

У високошвидкісних мережах VPN швидкість відновлення після перезапуску шлюзу безпосередньо формує якість роботи додатків реального часу.

VPNRice впроваджує оптимізовану обробку токенів Stateless Reset у протоколі RiceGuard:

  • Виявлення збою за один RTT: Замість тривалого очікування тайм-аутів клієнти RiceGuard ідентифікують сигнал скидання за один інтервал RTT.
  • Миттєва перебудова тунелю: Після валідації токена клієнт плавно переводить потоки даних на нове рукостискання 0-RTT, відновлюючи тунель менш ніж за 15 мілісекунд.
  • Безпечне порівняння в пам'яті: Аналіз токенів здійснюється функціями константного часу, що виключає ризик витоку даних через сторонні канали таймінгу.

Завдяки реалізації вимог RFC 9000 протокол RiceGuard забезпечує стабільний зв'язок без затримок і завислих сесій.

Завантажити VPNRice.