Учебный пример и настройка окружения.md
Учебный пример и настройка окружения
Безопасное обновление
Задача
Задача заключается в обновлении прошивки устройства, при условии, что прошивка авторизована - то есть соответствует версии прошивки, полученной из доверенного источника (от поставщика прошивки).
Давайте посмотрим на предполагаемую архитектуру и выделенные сущности простого и достаточно типичного примера реализации системы обновления:
- Downloader скачивает данные из сетей общего пользования
- Manager оркестрирует весь процесс обновления
- Verifier проверят корректность скачанной прошивки
- Storage – промежуточное хранилище скачанной прошивки
- Updater непосредственно применяет обновление.
Для примера ниже показана диаграмма потока данных процесса верификации в нашей системе обновлений: Manager запрашивает Verifier проверку обновления, Verifier читает данные из - Storage и при позитивном вердикте, изменяет состояние системы, чтобы указать, что в Storage находится правильное обновление.
- Монитор безопасности - системный сервис - проверяет весь обмен сообщениями между сущностями на соответствие политикам безопасности.
Наша задача, создать безопасную систему обновления. Что это означает в рамках кибериммунного подхода? Нам необходимо выполнить некоторую последовательность задач:
- определить цели безопасности;
- разделить систему на домены/сущности;
- определить сценарии, в которых возможно компрометация целей безопасности;
- создать необходимые политики безопасности и тесты политик безопасности;
- написать необходимый функциональный код;
В рамках решения задачи хакатона не требуется детальной работы с функциональным кодом, поэтому будет минимально работоспособного варианта, имитирующего работу системы в объёме примера хакатона.
Например, обновляемое приложение может состоять из нескольких строк кода, нам важно только понимать, что оно работает и как-то понимать, что обновление произошло (или нет).
#!/usr/bin/env python
from flask import Flask
app = Flask(__name__) # create an app instance
APP_VERSION = "1.0.3u"
@app.route("/") # at the end point /
def hello():
return f"Hello World! Application version {APP_VERSION}"
if __name__ == "__main__": # on running python app.py
app.run(host="0.0.0.0")
Итак, сначала мы должны определить цель безопасности, которую система будет обеспечивать. Целью безопасности в нашем случае будет обеспечение возможности применения только правильных обновлений.
В данном случае правильный – это некий набор проверок, который мы определили как достаточный.
Далее, для простоты примера, мы сразу же оставим за скобками проблемы доставки обновления на устройство и возможные атаки на доставку. И наконец, мы не будем рассматривать вопросы физической безопасности устройства.
Давайте посмотрим пример процедуры обновления на сиквенс диаграмме.
Это один из вариантов процесса обновления, но общий подход можно применить к любому аналогичному процессу.
В общем случае, компонент Manager может быть недоверенным, результаты проверки могут быть игнорированы или данные могут изменены после проверки.
Давайте посмотрим на процесс обновления с точки зрения безопасности, чтобы найти потенциальные проблемы, то есть сценарии, где возможна компрометации целей безопасности.
Наши вводные, исходя из выбранного охвата задач: на устройство доставлена прошивка и теперь нам надо устройство обновить.
Первая значимая команда в диаграмме – это запрос на проверку и первая возможная проблема, компонент Manager «забыл» отправить запрос на проверку, и таким образом в результате на обновление отправится непроверенная версия.
Следующая значимая команда – запрос на обновление и следующая возможная проблема, это то, что результат проверки может быть проигнорирован и запрос на обновление может отправиться неверная версия прошивки.
Следующая возможная проблема уже не связана командами, но она отражает тот факт, что между тем, как обновление проверено и запросом на обновление от Manager есть некий зазор по времени. В этот период времени данные обновления могут быть изменены, и на обновление может отправиться неверная версия прошивки.
Детальный анализ может выявить ещё и другие проблемы, например, роллбэк атаку и т.д., но для понимания механизмов будет достаточно и самых очевидных. Поэтому, для упрощения политик безопасности примера мы будем рассматривать следующие три очевидных сценария:
- «забыли» отправить запрос на проверку обновления;
- результат проверки проигнорировали;
- данные обновления изменили после проверки.
В качестве самостоятельного задания читателю предлагается добавить другие возможные сценарии компрометации обновления и расширить набор политик, чтобы адресовать и эти сценарии.
Ниже представлены три выбранные сценария компрометации целей безопасности на диаграмме процесса обновления:
Решение
Настройка рабочего окружения для запуска примера
-
Windows
- виртуальная машина с Linux (например, Ubuntu 20.04) или
- WSL (Linux subsystem for Windows) с Linux (например, Ubuntu 20.04), важно использовать версию WSL 2 или выше (иначе не будет работать docker) или
- Docker desktop (лицензия!)
-
Linux код примера тестировался с Ubuntu 20.04, но почти наверное будет работать и в других дистрибутивах при условии работающего docker-compose
Установленные пакеты
- docker-compose
- python3-pip
- pipenv (командой sudo pip install pipenv)
- pytest (командой sudo pip install pytest)
Рекомендованный инструмент разработки
- Visual Studio Code с расширениями
- REST client
- Docker и/или Docker Compose
- Python
опциональные, если VS Code будет работать не внутри виртуальной машины
- Remote - WSL (в случае использования WSL)
- Remote - SSH (в случае использования виртуальной машины)
- Remote - Containers (в случае использования только docker)
Видео-инструкция по настройке окружения
https://rutube.ru/video/private/b0dee7982b13382d2f6d0eb5d615355d/?p=MEK8DdzhOmF1y421noxJ-Q
Отчёт и код
-
описания решения доступно по ссылке: https://github.com/sergey-sobolev/secure-update/blob/main/docs/report/report.md
-
там же можно найти и исходный код: https://github.com/sergey-sobolev/secure-update
Тесты
- Видео-инструкция по запуску тестов https://rutube.ru/video/private/3acada5b89bc18d76ab2f93d576df4c6/?p=oyPqAgHHtuOH98KPD5W6PQ