Що таке nonce у VPN і чому повторне використання ламає тунель
Nonce — це значення для кожного повідомлення, яке ніколи не повинно повторюватися під одним ключем, і зазвичай воно передається відкрито. Редагувати його вручну — помилка, якої треба уникати.
Більшість людей зустрічають слово nonce у профілі VPN і припускають, що це ще один спільний секрет, який треба копіювати між вузлами. Це не так. Nonce — значення, яке ніколи не повинно повторюватися під тим самим ключем, і в більшості шифрування на основі nonce воно передається відкрито. Плутанина залишається нешкідливою, доки хтось не відредагує його вручну, і саме там починається справжня поломка.
Звідки nonce насправді береться
Автентифіковане шифрування потребує окремого nonce для кожного повідомлення, зашифрованого під ключем. Протоколи виконують цю вимогу по-різному: монотонно зростаючий лічильник, сіль у поєднанні з ідентифікатором пакета або достатньо довге випадкове значення. IKEv2 обмінюється nonce під час початкового обміну, і вони є публічними вхідними даними для виведення ключа, а не секретами.
Унікальність може бути структурною або ймовірнісною. Лічильник не може повторитися, доки не переповниться, тому протокол визначає точку зміни ключа задовго до цього. Випадкове значення покладається на достатню кількість бітів, щоб колізія була неймовірною в межах ліміту повідомлень, а це інший аргумент з іншим режимом відмови. Документація протоколу вказує, який метод застосовується, і обидва безпечні лише за умови дотримання зазначеного ліміту.
| Design | Where uniqueness comes from | Exhaustion is handled by |
|---|---|---|
| AES-GCM records | An IV, typically a counter | Rekey before the counter wraps |
| ChaCha20-Poly1305 | A 96-bit nonce from a counter or generator | A message limit per key |
| WireGuard | A per-key 64-bit counter | Rekey at a message cap |
| OpenVPN AEAD | Packet identifier plus implicit key material | Rekey on the packet-id limit |
| IKEv2 | Fresh nonces per exchange | A new security association |
У що насправді обходиться повторне використання
Повторне використання nonce під одним ключем — не дрібне питання ефективності. У GCM два повідомлення зі спільним IV дозволяють спостерігачеві відновити ключ автентифікації та обчислити виключне АБО двох відкритих текстів. Потокові конструкції повторно використовують ключовий потік так само, що перетворює шифротекст на головоломку, а не на секрет.
Саме тому реалізації змінюють ключ до переповнення лічильника, і тому вони зупиняються, а не продовжують, коли їхній стан невизначений. Перезавантаження, яке скидає лічильник, поки партнер ще тримає старий ключ, або віртуальна машина, відновлена зі знімка, зробленого посеред сеансу, — це саме та ситуація, для запобігання якій існують ліміти. Нападник не потрібен; достатньо звичайних операцій.
Чому ручне редагування — неправильне рішення
Лічильники, солі та ідентифікатори пакетів — це машини станів, спільні для обох сторін. Зміна однієї сторони розсинхронізує іншу, і тунель відмовляє так, що це виглядає як проблема маршрутизації. Підтримуваний важіль — свіжий обмін ключами, який скидає стан на обох кінцях одночасно.
Паролі та nonce також відіграють різні ролі. Пароль — це секретний вхід для виведення ключа; nonce — публічний вхід для кожного повідомлення. Поле профілю з позначкою nonce, яке вимагає довгого секрету, зазвичай є статичним ключем або заздалегідь спільним секретом під іншою назвою, тому читайте документацію для цього поля, а не припускайте.
Коли рекомендація стосується обробки nonce, виправлення — це виправлена версія від супровідника, а не інший шифр або коротший ключ. Зміна шифру, щоб уникнути слова nonce, переміщує проблему, а не вирішує її.
Читання попередження без здогадів
Рядок журналу про лічильники або nonce зазвичай описує втрачений стан, а не атаку. Перевірте, чи не перезапускався один із партнерів, чи не використовувала клонована віртуальна машина ту саму ідентичність і чи згодні дві сторони щодо налаштувань зміни ключа. Потім встановіть новий сеанс і подивіться, чи повертається повідомлення.
Тримайте діагностику окремо від не пов’язаних збоїв. Сторінка, яка не завантажується, або запит облікових даних, що зациклюється, не є доказом повторного використання nonce, і трактування його як такого відправляє вас у криптографічний шар, тоді як проблема вище нього.
Для звичайного використання безпечне правило коротке: нехай реалізація керує nonce, тримайте обидві сторони на підтримуваних версіях і вважайте будь-яке скидання стану причиною змінити ключ, а не редагувати значення. Якщо поля профілю немає в документації постачальника, не вигадуйте для нього значення. Виправлення тунелю починається зі знання, на який шар ви дивитеся.