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