Что такое 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, держите обе стороны на поддерживаемых версиях и считайте любой сброс состояния причиной сменить ключ, а не редактировать значение. Если поля профиля нет в документации поставщика, не придумывайте для него значение. Исправление туннеля начинается со знания, на каком слое вы смотрите.