SyntaxSage & CrimsonNode
CrimsonNode CrimsonNode
В последнее время я занимаюсь тем, сопоставляю схемы шифрования с формальными грамматиками, и мне кажется, тут есть интересное пересечение с твоими лингвистическими моделями. Может, попробуем разобраться, как протоколы безопасности выглядят, если их рассматривать как язык?
SyntaxSage SyntaxSage
Интересное предложение. Если представить обмен ключей как предложение, то синтаксическое дерево может выявить уязвимости в структуре. Поделись, как у тебя устроена грамматика, и посмотрим, насколько надёжны твои конструкции.
CrimsonNode CrimsonNode
Конечно. Представь себе обмен ключами как контекстно-свободную грамматику. Стартовый символ – `KEX`, и он разворачивается в `SEQ AUTH DATA`. `SEQ` – это последовательность сообщений рукопожатия: `MSG0 MSG1 MSG2…`. Каждое `MSG` определяется как `HEADER PAYLOAD SIGN`. `HEADER` содержит версию, идентификаторы алгоритмов и nonce. `PAYLOAD` – это открытый ключ или доказательство владения. `SIGN` – криптографическая подпись, охватывающая объединение `HEADER` и `PAYLOAD`. Если какие-либо из этих подправил допускают леворекурсию или неоднозначные правила – скажем, `PAYLOAD`, который можно распарсить как два разных типа ключей – то злоумышленник может внедрить вредоносную секцию, чтобы захватить контроль над обменом. Короче говоря: никаких неоднозначных правил, все нетерминалы детерминированы, и каждая `SIGN` должна быть связана с уникальным, невоспроизводимым nonce. Если это соблюдается, проникнуть в эту структуру очень сложно. Дай знать, куда копнём глубже.
SyntaxSage SyntaxSage
Вот черновик структуры получился довольно чистый. Как всегда, самое сложное – пункт об отсутствии неоднозначных интерпретаций: если `PAYLOAD` можно проанализировать двумя способами, парсер с радостью выберет тот, что выгоден атакующему. Ты думал о детерминированной конечной автомате для поля `HEADER`? Это автоматически избавит от леворекурсии, и тогда ты сможешь применить ограничение на nonce с помощью простого перехода между состояниями. И ещё, если привязать `SIGN` к хешу всей цепочки сообщений, а не только к локальным `HEADER` и `PAYLOAD`, это защитит от повторов. Где, на твой взгляд, самое слабое место в твоём текущем дереве?
CrimsonNode CrimsonNode
Дерево само по себе выглядит неплохо на бумаге, но настоящая проблема в отсутствии глобального состояния, которое связывало бы каждый `MSG` с предыдущими. В той грамматике, которую я набросал, злонамеренный `MSG` может проскользнуть, если его заголовок проходит DFA, потому что дерево не запоминает, что предыдущий `MSG` завершил цепочку. Злоумышленник может дублировать, переставлять или удалять сообщение, а парсер все равно построит корректное дерево. Тебе нужен контрольный код, который охватывает всю последовательность, а не только локальный заголовок и полезную нагрузку, чтобы любое изменение нарушало подпись. Пока ты этого не обеспечишь, правило "без неоднозначных производств" — это просто хорошая идея, которая не остановит умелого злоумышленника.
SyntaxSage SyntaxSage
Ты прав; дерево само по себе – не лучший свидетель. Нужна глобальная проверка целостности, которая связывает синтаксис с семантикой. Представь себе бегущую хеш-функцию: каждое `MSG` добавляет свои данные и подпись в хеш, который должен быть включен в следующее сообщение. Так, любое изменение порядка, дублирование или удаление разрушит цепочку. Это как линейная контекстно-свободная грамматика с ограничением на сопроекты; сопроект (хеш) обеспечивает глобальное состояние. Если это заложить в грамматику как дополнительное условие для `SEQ`, парсер отвергнет любое подозрительное сообщение еще до того, как оно дойдет до дерева. Это единственный способ остановить хитрую атаку, когда злоумышленник использует легально проанализированную, но семантически некорректную последовательность.