Формальная верификация модуля безопасности Linux. Презентация про проект AstraVer ИСП РАН. Доклад представлен на сессии коротких докладов летней школы Мастерчейн. НИУ ВШЭ, Москва, 09 июля 2018.
Security Modules) фото фото Ядро Процесс Ресурс Модуль Безопасности (SELinux, AppArmor, …) Структуры данных Интерфейс LSM Стандартные проверки доступа Проверка аргументов Системный вызов Реализует интерфейс
модулем безопасности (1) фото фото 1. Код модуля безопасности • Правилен ли код модуля безопасности? • Корректно ли модуль безопасности реализует модель безопасности (функциональные требования)? 2. Интерфейс взаимодействия с ядром • Правильно ли модуль безопасности использует интерфейсы ядра? 3. Корректность работы всей системы • Правильно ли ядро работает вместе с модулем безопасности?
модулем безопасности (2) фото фото 1. Код модуля безопасности • Дедуктивная верификация кода модуля безопасности ядра (разработка формальных спецификаций) 2. Интерфейс взаимодействия с ядром • Трансляция формальных спецификаций в исполняемые проверки (assert) 3. Корректность работы всей системы • Динамическая верификация (runtime verification) работы ядра ОС на соответствие формальной модели
(1) (функция) фото фото • Что можно сказать о функции по её коду? • Это чистая функция; • Она вычисляет среднее между двумя целыми числами; • При определённых условиях возможно целочисленное переполнение.
(2) (контекст вызова) фото фото • Контекст: функция двоичного поиска; • Индексы l и h неотрицательны, l не превосходит h; • Возможна ошибка выхода за границу массива при целочисленном переполнении в avr.
(4) (модель ошибки) фото фото • Формализовать понятие ошибки (целочисленное переполнение): _: → {⊤, ⊥} _ ≡ _ ≤ ≤ _ • Формализовать код программы: функция , которая возвращает результат (, ) в соответствии со своим программным кодом, если завершается и завершается без ошибки, иначе возвращается специальное значение • Доказать полную корректность: ∀, , ⇒ , ≠ && , , ,
безопасности Динамический анализ Ядро Модуль Тесты Трасса Воспроизведение на модели • Сбор трассы системных вызовов • Ядро + модуль безопасности • Запросы на доступы • Тесты и фаззинг (syzkaller) • Воспроизведение трасс на формальной модели • Поиск ошибок: на модели доступ запрещен, в системе был дан
– верификация модуля безопасности дистрибутива Astra Linux (сертификация МО, ФСТЭК, ФСБ) http://www.ispras.ru/technologies/astraver_toolset/ • «Моделирование и верификация политик безопасности управления доступом в операционных системах» П.Н. Девянин, Д.В. Ефремов, В.В. Кулямин, А.К. Петренко, А.В. Хорошилов, И.В. Щепетков http://www.ispras.ru/publications/2018/security_policy_mo deling_and_verification/ • Базовая кафедра «Системное программирование» ИСП РАН ВШЭ https://cs.hse.ru/dse/sp/ • Спецификации библиотечных функций ядра Linux https://github.com/evdenis/verker/
соответствия программного обеспечения предъявляемым к нему требованиям; • Дедуктивная верификация – представление корректности программы как набора математических утверждений, называемых условиями верификации, выполнение которых проверяется автоматическими или интерактивными доказателями теорем; • Спецификация - набор требований и параметров, которым удовлетворяет некоторый объект (представлена в виде мат. модели, тестовых наборов, формальной спецификации)
Компилятор и линковщик работают корректным образом • В программном обеспечении, использующемся при верификации, не произошло ошибок • Компьютер функционирует таким образом, как мы думаем об этом (rowhammer) • Нижележащий слой ПО (например, ОС, прошивка сетевой карты, микрокод процессора) функционирует в рамках нашего представления о том, что он должен делать и что не должен делать (и ещё не содержит ошибок) • Пользователь компьютера, если он есть, специально не «пакостит» • Выполнены предположения о входных данных программы, о начальном состоянии
Гарантии того, что программное обеспечение функционирует в точном соответствии с требованиями, к нему предъявляемыми, на всех входных данных, начальных состояниях, при любом поведении окружения * ** • * В предположении что все предположения выполнены • ** И не осталось предположений, которых мы не занесли в списочек
+ спецификации Высшая школа экономики, Москва, 2016 function to_int bint : int function of_int int : bint predicate in_bounds (n:int) = -2147483648 <= n && n <= 2147483647 constant a, b, o1, o2: bint axiom H0: a >= of_int 0 && b >= of_int 0 && b >= a axiom H1: to_int o1 = 2 axiom H2: to_int o2 = (to_int a + to_int b) goal avr_safety: in_bounds 2 -> in_bounds(to_int a + to_int b) -> not to_int o1 = 0 -> in_bounds(div (to_int o2) (to_int o1))