Большинство людей встречают слово nonce в профиле VPN и предполагают, что это ещё один общий секрет, который нужно копировать между узлами. Это не так. Nonce — значение, которое никогда не должно повторяться под одним и тем же ключом, и в большинстве шифрования на основе nonce оно передаётся открыто. Путаница остаётся безобидной, пока кто-нибудь не отредактирует его вручную, и именно там начинается настоящая поломка.

Откуда на самом деле берётся nonce

Аутентифицированное шифрование требует отдельного nonce для каждого сообщения, зашифрованного под ключом. Протоколы выполняют это требование по-разному: монотонно возрастающий счётчик, соль в сочетании с идентификатором пакета или достаточно длинное случайное значение. IKEv2 обменивается nonce во время начального обмена, и они являются публичными входными данными для вывода ключа, а не секретами.

Уникальность может быть структурной или вероятностной. Счётчик не может повториться, пока не произойдёт переполнение, поэтому протокол определяет точку смены ключа задолго до этого. Случайное значение опирается на достаточное число бит, чтобы коллизия была невероятной в пределах лимита сообщений, а это другой аргумент с другим режимом отказа. Документация протокола указывает, какой метод применяется, и оба безопасны только при соблюдении заявленного лимита.

DesignWhere uniqueness comes fromExhaustion is handled by
AES-GCM recordsAn IV, typically a counterRekey before the counter wraps
ChaCha20-Poly1305A 96-bit nonce from a counter or generatorA message limit per key
WireGuardA per-key 64-bit counterRekey at a message cap
OpenVPN AEADPacket identifier plus implicit key materialRekey on the packet-id limit
IKEv2Fresh nonces per exchangeA new security association

Во что на самом деле обходится повторное использование

Повторное использование nonce под одним ключом — не мелкий вопрос эффективности. В GCM два сообщения с общим IV позволяют наблюдателю восстановить ключ аутентификации и вычислить исключающее ИЛИ двух открытых текстов. Поточные конструкции повторно используют ключевой поток так же, что превращает шифртекст в головоломку, а не в секрет.

Именно поэтому реализации меняют ключ до переполнения счётчика, и поэтому они останавливаются, а не продолжают, когда их состояние не определено. Перезагрузка, сбрасывающая счётчик, пока партнёр всё ещё держит старый ключ, или виртуальная машина, восстановленная из снимка, сделанного в середине сеанса, — это ровно та ситуация, для предотвращения которой существуют лимиты. Атакующий не нужен; достаточно обычных операций.

Почему ручное редактирование — неправильное решение

Счётчики, соли и идентификаторы пакетов — это машины состояний, общие для обеих сторон. Изменение одной стороны рассинхронизирует другую, и туннель отказывает так, что это выглядит как проблема маршрутизации. Поддерживаемый рычаг — свежий обмен ключами, который сбрасывает состояние на обоих концах сразу.

Пароли и nonce также играют разные роли. Пароль — это секретный вход для вывода ключа; nonce — публичный вход для каждого сообщения. Поле профиля с меткой nonce, которое запрашивает длинный секрет, обычно является статическим ключом или предварительно общим секретом под другим именем, поэтому читайте документацию для этого поля, а не предполагайте.

Когда рекомендация касается обработки nonce, исправление — это исправленная версия от сопровождающего, а не другой шифр или более короткий ключ. Смена шифра, чтобы избежать слова nonce, перемещает проблему, а не решает её.

Чтение предупреждения без догадок

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

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

Для обычного использования безопасное правило коротко: пусть реализация управляет nonce, держите обе стороны на поддерживаемых версиях и считайте любой сброс состояния причиной сменить ключ, а не редактировать значение. Если поля профиля нет в документации поставщика, не придумывайте для него значение. Исправление туннеля начинается со знания, на каком слое вы смотрите.

Похожие статьи