Формальная верификация модуля безопасности Linux. Презентация про проект AstraVer ИСП РАН. Доклад представлен на сессии коротких докладов летней школы Мастерчейн. НИУ ВШЭ, Москва, 09 июля 2018.
2. Летняя школа Masterchain, Москва, 2018
Модуль безопасности ядра Linux
(Linux Security Modules)
фото
фото
Ядро
Процесс
Ресурс
Модуль
Безопасности
(SELinux, AppArmor, …)
Структуры данных
Интерфейс LSM
Стандартные проверки
доступа
Проверка аргументов
Системный вызов
Реализует
интерфейс
3. Летняя школа Masterchain, Москва, 2018
Вопросы корректности работы системы с
модулем безопасности (1)
фото
фото
1. Код модуля безопасности
• Правилен ли код модуля безопасности?
• Корректно ли модуль безопасности реализует
модель безопасности (функциональные
требования)?
2. Интерфейс взаимодействия с ядром
• Правильно ли модуль безопасности
использует интерфейсы ядра?
3. Корректность работы всей системы
• Правильно ли ядро работает вместе с
модулем безопасности?
4. Летняя школа Masterchain, Москва, 2018
Вопросы корректности работы системы с
модулем безопасности (2)
фото
фото
1. Код модуля безопасности
• Дедуктивная верификация кода модуля
безопасности ядра (разработка формальных
спецификаций)
2. Интерфейс взаимодействия с ядром
• Трансляция формальных спецификаций в
исполняемые проверки (assert)
3. Корректность работы всей системы
• Динамическая верификация (runtime
verification) работы ядра ОС на соответствие
формальной модели
5. Летняя школа Masterchain, Москва, 2018
1.Формальная спецификация кода
на Си (1) (функция)
фото
фото
• Что можно сказать о функции по её коду?
• Это чистая функция;
• Она вычисляет среднее между двумя целыми числами;
• При определённых условиях возможно целочисленное
переполнение.
6. Летняя школа Masterchain, Москва, 2018
1.Формальная спецификация кода
на Си (2) (контекст вызова)
фото
фото
• Контекст: функция
двоичного поиска;
• Индексы l и h
неотрицательны, l не
превосходит h;
• Возможна ошибка
выхода за границу
массива при
целочисленном
переполнении в avr.
7. Летняя школа Masterchain, Москва, 2018
1.Формальная спецификация кода
на Си (3) (требования к функции)
фото
фото
• Описать контекст вызова:
𝜙: 𝑍×𝑍 → ⊤, ⊥
𝜙 𝑎, 𝑏 ≡ 𝑎 ≥ 0 ∧ 𝑏 ≥ 0 ∧ 𝑎 ≤ 𝑏
• Описать требования, которым
должны удовлетворять результаты:
𝜓: 𝑍×𝑍×𝑍 → {⊤, ⊥}
𝜓 𝑎, 𝑏, 𝑟𝑒𝑠𝑢𝑙𝑡 ≡ 𝑟𝑒𝑠𝑢𝑙𝑡 =
𝑎 + 𝑏
2
8. Летняя школа Masterchain, Москва, 2018
1.Формальная спецификация кода
на Си (4) (модель ошибки)
фото
фото
• Формализовать понятие ошибки
(целочисленное переполнение):
𝑖𝑛_𝑏𝑜𝑢𝑛𝑑𝑠: 𝑍 → {⊤, ⊥}
𝑖𝑛_𝑏𝑜𝑢𝑛𝑑𝑠 𝑛 ≡ 𝑀𝐼𝑁_𝐼𝑁𝑇 ≤ 𝑛 ≤ 𝑀𝐴𝑋_𝐼𝑁𝑇
• Формализовать код программы: функция 𝑀 𝑎𝑣𝑟 ,
которая возвращает результат 𝑀 𝑎𝑣𝑟 (𝑎, 𝑏) в
соответствии со своим программным кодом, если
завершается и завершается без ошибки, иначе
возвращается специальное значение 𝜔
• Доказать полную корректность:
∀𝑎, 𝑏 𝜙 𝑎, 𝑏
⇒ 𝑀 𝑎𝑣𝑟 𝑎, 𝑏 ≠ 𝜔 && 𝜓 𝑎, 𝑏, 𝑀 𝑎𝑣𝑟 𝑎, 𝑏
9. Летняя школа Masterchain, Москва, 2018
1.Формальная спецификация кода на Си (5)
(Frama-C ACSL) (исправление ошибки)
Статический анализ
Условие верификации
Исправление кода
Уточнение спецификаций
10. Летняя школа Masterchain, Москва, 2018
2.Трансляция спецификаций в исполняемые
(Frama-C E-ACSL)
Динамический анализ
Спецификации Исполняемый код
11. Летняя школа Masterchain, Москва, 2018
3.Формальная модель. Функциональные
требования (Event-B)
(непротиворечивость требований)
Входные
параметры
Модельная операция
Предусловия
для операции
Обновление
состояния
модели
12. Летняя школа Masterchain, Москва, 2018
3.Работа ядра вместе с модулем безопасности
Динамический анализ
Ядро
Модуль
Тесты
Трасса Воспроизведение
на модели
• Сбор трассы системных вызовов
• Ядро + модуль безопасности
• Запросы на доступы
• Тесты и фаззинг (syzkaller)
• Воспроизведение трасс на
формальной модели
• Поиск ошибок: на модели доступ
запрещен, в системе был дан
13. Летняя школа Masterchain, Москва, 2018
Дополнительная информация
• Проект AstraVer – верификация модуля безопасности
дистрибутива 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/
14. 101000, Россия, Москва, Мясницкая ул., д. 20
Тел.: (495) 621-7983, факс: (495) 628-7931
www.hse.ru
Public Key Fingerprint
7654 0336 0294 0DF1 920F
E403 B522 95B0 3350 301F
efremov@linux.com
15. Летняя школа Masterchain, Москва, 2018
Определения
• Верификация - проверка соответствия программного
обеспечения предъявляемым к нему требованиям;
• Дедуктивная верификация – представление
корректности программы как набора математических
утверждений, называемых условиями верификации,
выполнение которых проверяется автоматическими или
интерактивными доказателями теорем;
• Спецификация - набор требований и параметров,
которым удовлетворяет некоторый объект (представлена
в виде мат. модели, тестовых наборов, формальной
спецификации)
16. Летняя школа Masterchain, Москва, 2018
Предположения о работе системы
• Компилятор и линковщик работают корректным образом
• В программном обеспечении, использующемся при
верификации, не произошло ошибок
• Компьютер функционирует таким образом, как мы думаем
об этом (rowhammer)
• Нижележащий слой ПО (например, ОС, прошивка сетевой
карты, микрокод процессора) функционирует в рамках
нашего представления о том, что он должен делать и что не
должен делать (и ещё не содержит ошибок)
• Пользователь компьютера, если он есть, специально не
«пакостит»
• Выполнены предположения о входных данных программы,
о начальном состоянии
17. Летняя школа Masterchain, Москва, 2018
Что дает формальная
верификация
• Гарантии того, что программное
обеспечение функционирует в точном
соответствии с требованиями, к нему
предъявляемыми, на всех входных
данных, начальных состояниях, при любом
поведении окружения * **
• * В предположении что все предположения
выполнены
• ** И не осталось предположений, которых мы не
занесли в списочек
18. Высшая школа экономики, Москва, 2016
Стек
инструментов
дедуктивной
верификации
фото
фото
CIL
CIL with annotations
С program with
ACSL annotations
Jessie program
(with annotations built-in)
Jessie translator
Why3 support
Why3 VC generator
Why3 WhyML modules
Verification conditions
in Why3MLVC transformations
Why3 encoders + drivers
Logical formulas/scripts in
SMT-LIB/SMT-LIBv2/native format
Coq, PVS, Isabelle
proof templates
Why3
transformation/proof/shapes
database
Alt-Ergo Z3 CVC4 Coq PVS
Why3 IDE
...
Jessie2
CIL
visitors (rewriters)
Frama-C
Jessie plugin
Why3
Isabelle ...
20. Летняя школа Masterchain, Москва, 2018
Логическая формула для
солверов: код + спецификации
Высшая школа экономики, Москва, 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))