Суть спора: два подхода к формальной верификации

Суть спора: два подхода к формальной верификации

Формальные методы — это инструменты, позволяющие строго доказать соответствие системы (программы, протокола, микросхемы) поставленным требованиям. Однако два главных подхода верификации — модельная проверка и доказательство теорем — заметно различаются по предпосылкам, ресурсоёмкости и глубине гарантии.

Верификация теорем (Theorem Proving) строится на логических исчислениях и математических доказательствах. Специалист формулирует свойства системы как теоремы и доказывает их (вручную или полуавтоматически с помощью интерактивного доказателя — например, Coq, Isabelle, ACL2). Система абстрагируется как математическая модель. Такой подход позволяет получить абсолютное доказательство корректности относительно спецификации для всех входных данных, но требует больших интеллектуальных ресурсов и времени.

Проверка моделей (Model Checking) гораздо более автоматизирована. Ей дают конечную модель (например, в виде автомата) и свойства на языке темпоральной логики. Далее алгоритм сам проверяет модель на выполнение свойств — либо выдаёт подтверждение, либо выявляет контрпример. Однако анализируется не реальная система, а построенная модель; гарантия корректности даётся только для неё.

Таким образом, модельная проверка ищет ошибки в модели, а доказательство теорем строит строгое основание того, что ошибок нет в спецификации.

Как работает проверка моделей

Модельная проверка работает с моделью, описывающей возможные состояния системы и переходы между ними. Наиболее востребована в анализе протоколов связи, логики оборудования, конечных автоматов в аппаратуре.

  1. Построение модели: система описывается понятным для инструмента языком (например, Promela для SPIN или временные автоматы для UPPAAL).
  2. Формулировка свойств: требования оформлены формальным языком, обычно с помощью темпоральной логики (LTL, CTL): «по каждому запросу доступ предоставляется», «зелёный и красный не горят одновременно» и т.д.
  3. Автоматический перебор: алгоритм строит пространство состояний и проверяет каждое на предмет нарушения свойств.

Главное ограничение — комбинаторный взрыв (экспоненциальный рост числа состояний в сложных системах). Для борьбы с этим используют абстракции и оптимизации.

[ИЗОБРАЖЕНИЕ: Диаграмма переходов состояний конечного автомата с проверкой свойства LTL]

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

Принципы верификации теорем

Здесь система и её спецификация описываются внутри выбранной логической теории: теория множеств, лямбда-исчисление, индуктивные типы и т.п. Наиболее распространены Coq, Isabelle/HOL и схожие средства.

  1. Формализация спецификации: система и требования кодируются на строгом формальном языке интерпретатора доказательств.
  2. Построение доказательства: доказательство строится пошагово через применение логических выводов, с помощью скриптов — зачастую креативно и вручную.
  3. Проверка доказательства: ядро доказателя полностью проверяет корректность всех логических шагов относительно аксиом.

Например, при доказательстве корректности сортировки потребуется формализовать и свойства «отсортированности», и понятие «перестановки», и вести индукцию по структуре программы.

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

Сравнение подходов

Критерий Проверка моделей (Model Checking) Верификация теорем (Theorem Proving)
Уровень гарантии Для конкретной конечной модели. Возможны ошибки в абстракции. Абсолютная математическая гарантия для спецификации.
Автоматизация Полная автоматизация проверки. В основном ручное, автоматизирована проверка шагов.
Результат при ошибке Конкретный контрпример (сценарий нарушения). Описание неудачного шага доказательства без подробного сценария.
Масштабируемость Ограничена экспоненциальным ростом состояний. Ограничена сложностью доказательства для человека.
Обучение и порог входа Достаточно знать моделирование и базовую логику. Необходимы глубокие знания логики, теории типов и доказательств.
Типичные применения Протоколы, конечные автоматы, аппаратные контроллеры, анализ состояний. Алгоритмы, криптографические протоколы, компиляторы, микроядра.

Когда стоит выбирать проверку моделей

  • Система конечна или легко сводится к конечной модели (контроллеры, автоматизация).
  • Нужен быстрый поиск ошибок и анализ сценариев.
  • Группа не готова вкладываться в полноценную формализацию.
  • Проверяются инварианты или отсутствие deadlock/livelock.

Когда актуальна верификация теорем

  • Максимальные гарантии — жизненно важные/криптографические системы.
  • Система оперирует бесконечными доменами (числа, динамические структуры).
  • Необходимы доказательства общей корректности алгоритмов.
  • Есть ресурсы и возможности для глубокой формализации.

На практике подходы часто комбинируются: сначала автоматическая проверка моделей для быстрой отладки, потом глубокая верификация теорем — для «ядер» безопасности.

Специфика российского регулирования

В отечественной нормативке (ФСТЭК, 152-ФЗ, ГОСТ) формальные методы обычно упоминаются как элемент повышения доверия к средствам защиты, но не конкретизируют инструментальные требования. При этом система оценки построена на результатах: важнее, чтобы риски снижены, а система надёжна, чем способ проверки.

Частая ошибка: использовать проверку моделей там, где она неадекватна задаче (например, проверять конечной моделью криптопротокол с бесконечным пространством сообщений и ключей). Гарантии распространяются только на исследованную модель, что не соответствует требованиям стандарта по СКЗИ. В этих случаях требуется именно верификация на уровне теорем для доказательства свойств на любом входе.

Обратный перекос — требовать математического доказательства для логики конечного контроллера доступа. Это неоправданно трудоёмко, эффективней использовать проверку моделей.

В части аудита важно учитывать: результат проверки моделей зачастую нагляднее для комиссии (диаграммы, контрпримеры), чем формальное доказательство на специализированном языке. Тем не менее, степень строгости у доказательства выше.

ГОСТ Р и профильные стандарты требуют, чтобы способ формального анализа соответствовал классу защищённости и был обоснован с точки зрения рисков, а не только «формально» выполнял требования.

Типовые сценарии выбора

  • Контроллер лифта или стрелки: конечный автомат, основные риски — deadlock и некорректные переходы. Проверка моделей эффективна, UPPAAL подходит для темпоральных свойств.
  • Криптографический модуль (СКЗИ): алгоритмы с бесконечным пространством входов и ключей. Верификация теорем: корректность должна быть доказана для любого input (EasyCrypt, VeriFast).
  • Ядро гипервизора: сложное взаимодействие, изоляция и синхронизация. Комбинированный подход: модельная проверка для протоколов и планировщика, глубокая верификация — для механизмов защиты.

Эти примеры иллюстрируют: ключ к выбору — структура задачи и требуемый уровень гарантий, а не личные предпочтения или «мода» на инструмент.

Скрытые сложности обоих методов

Вне зависимости от выбранной технологии остаются общие и уникальные ограничения.

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

В обоих случаях формальная гарантия применима только к проверенной модели или формализованной спецификации. Чтобы эти гарантии распространялись на реальный код, необходимо либо автоматически генерировать программу из модели, либо использовать верифицированные компиляторы, либо строить «мост» между моделью и исходным кодом, что часто опускается в российских проектах.

Практические шаги для инженерной команды

  1. Анализ системы: является ли система по сути конечной? Что критично — корректность алгоритма (функциональность) или только отсутствие deadlock/invariant?
  2. Пилот: начните с малого модуля (аутентификация, простой контроллер) и проверьте оба подхода в простейших условиях.
  3. Экспертиза и инструменты: оцените компетенции команды; используйте доступные инструменты — для моделей (SPIN, UPPAAL, TLA+), для теорем (Coq, Isabelle и пр.). При необходимости привлекайте сторонних специалистов.
  4. Интеграция в разработку: формальные методы должны применяться параллельно проектированию, а проверки — автоматизироваться в CI/CD.
  5. Документирование для регуляторов: обоснуйте выбраный путь, опишите ограничения и предположения модели, включите отчёты и выводы инструмента.

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

Оставьте комментарий