Содержание статьи
Как создать защищенную ОС с нуля? Взять memory safe язык программирования, написать на нем высокоуровневые части ядра, поверх него положить концепцию замкнутых песочниц и единый канал связи между песочницами и ОС, а все сетевое взаимодействие наладить через некую разновидность VPN. Как сделать защищенной уже существующую ОС? Попробовать прилепить все это к ней и постараться ничего не сломать по пути.
Дисклеймер
Честно говоря, изначально Subgraph OS не произвела на меня никакого впечатления. Очередной проект, ставящий своей целью разместить пользовательский софт в песочницах и таким образом достигнуть каких-то непонятных уровней защищенности ОС. Нет, ребята, в Qubes OS все это уже реализовано, причем на самом низком уровне, на уровне гипервизора Xen, да еще и с изоляцией сетевого стека и слоя работы с накопителями. Однако, следя за развитием проекта, я начал замечать движение в правильную сторону. Песочницы оказались далеко не так просты, как представлялось, а система обрела множество других правильных черт, в том числе ядро с включенными патчами PaX/Grsecurity и прокси-слой, который пропускает трафик приложений через Tor, анонимизируя его источник.
В целом операционка начала обретать черты из коробки защищенной системы, которую гипотетический пользователь может поставить и просто юзать, не вникая в детали того, как это все работает. А это уже тянет если не на премию, то как минимум одну статью в одном русскоязычном журнале. Тем более Сноуден уже высказался, почему нельзя мне?
Где взять?
Subgraph OS до сих пор находится в стадии активной разработки, поэтому для загрузки доступна только alpha-версия. Скачать ее можно с официальной страницы, размер ISO-образа 1,4 Гбайт, для установки пригоден практически любой комп с не менее чем 2 Гбайт оперативки, в том числе виртуальная машина на базе VirtualBox или VMware.
Устанавливается все это дело с помощью обычного инсталлятора Debian, а в качестве рабочего стола выступает немодифицированный GNOME 3. Конечно же, имеется набор предустановленных приложений: плеер VLC, офисный пакет LibreOffice, почтовый клиент IceDove и другие, плюс стандартные репозитории, из которых можно ставить любой софт с помощью apt-get.
Так что внешне и по уровню user experience операционка практически ничем не отличается от типичного дистрибутива Linux. Но в самой основе системы есть множество различий.
![install](https://xakep.ru/wp-content/uploads/2016/10/install.jpg)
Песочницы
Ключевая идея Subgraph OS — запуск пользовательских приложений в изолированных песочницах. Для этого задействована подсистема Oz, состоящая из демона (системного сервиса), получающего запросы на создание sandbox’ов, X-сервера Xpra и набора специальных утилит.
В своей основе Oz очень сильно напоминает Firejail, о котором мы уже рассказывали в статье «Игры с песочницей». Для изоляции приложений Oz применяет пространства имен, дополнительно ограничивая доступные приложению системные вызовы с помощью механизма seccomp-bpf. Общение приложения с графической подсистемой осуществляется с помощью виртуального X-сервера Xpra, который запускается внутри каждой песочницы. X-сервер основной системы подключается к Xpra и выводит картинку приложения на экран. Это очень важный момент, так как стандартный метод запуска графических приложений в песочницах — это прокидывание сокета X-сервера /tmp/.X11-unix/X0 в саму песочницу, что открывает запущенному в песочнице приложению возможность не только выводить картинку на экран и обрабатывать события устройств ввода, но и получать доступ к любому окну любого другого приложения и перехватывать любые клавиши. Xpra решает эту проблему.
В целом запуск приложения в Subgraph OS выглядит примерно так:
- Юзер кликает на иконку приложения или запускает его с помощью командной строки.
- Управление получает Oz, так как настоящий исполняемый файл приложения находится в каталоге /usr/bin-oz/, а тот, что запускает юзер, — это всего лишь симлинк на /bin/oz.
- Oz получает имя приложения, читая первый аргумент (он всегда содержит имя исполняемого файла), и через сокет отдает демону oz-daemon команду запустить приложение.
- Демон читает профиль приложения, в котором указано, что ему разрешено/запрещено, какие файлы домашнего каталога доступны и так далее.
- Демон создает каталог /srv/oz/rootfs/, подключает к нему каталоги /bin, /lib, /lib64, /usr и /etc основной системы, создает другие необходимые каталоги: /var, /tmp, /mnt и так далее, создает минимальный набор нужных для работы приложения файлов-устройств в /dev, подключает другие приложения файлы и каталоги, далее выполняет chroot в этот каталог и создает новые пространства имен, запирающие приложение в песочницу.
- Демон выделяет для песочницы новый виртуальный сетевой интерфейс и подключает его к виртуальному свитчу, подсоединенному к внешнему сетевому интерфейсу машины.
- Далее демон запускает внутри песочницы oz-init, который запускает Xpra и использует seccomp-bpf для настройки запрета/разрешения на выполнение системных вызовов.
- Oz-init запускает приложение из каталога /usr/bin-oz/.
Все это очень похоже на то, что мы делали в статье про создание собственных песочниц, с тем исключением, что вместо создания окружения исполнения для приложения с нуля (то есть прямого копирования нужных для его работы файлов в песочницу) Oz просто «пробрасывает» все файлы основной системы в песочницу с помощью bind() (системный вызов, позволяющий подключить один каталог к другому). Плюс, конечно же, те самые seccomp-bpf и Xpra.
![oz-flow](https://xakep.ru/wp-content/uploads/2016/10/oz-flow.jpg)
Если запущенное в песочнице приложение будет скомпрометировано, оно не сможет ни выбраться из песочницы, ни навредить основной системе — хоть каталоги системы и подключаются внутрь песочницы, они недоступны для записи. Информация также останется в сохранности, так как взломщик/малварь сможет добраться разве что до конфигов приложения и различных кешей. Более того, тот же просмотрщик PDF (Evince) не может открыть любой документ, вместо этого он получит доступ только к файлу, для просмотра которого был запущен (юзер кликнул на документ в проводнике).
![oz-tray](https://xakep.ru/wp-content/uploads/2016/10/oz-tray.jpg)
В общем, вполне очевидная и простая, но хорошая архитектура. Проблема только в том, что в данный момент Subgraph OS использует Oz для запуска всего восемнадцати приложений, в число которых входят защищенный мессенджер CoyIM, почтовый клиент IceDove (Mozilla Thunderbird), офисный пакет OpenOffice, IRC-клиент HexChat, VLC и Tor Browser (для сравнения: в том же Firejail есть настройки для запуска почти сотни различных приложений). Остальные работают без всяких песочниц.
![oz-prof](https://xakep.ru/wp-content/uploads/2016/10/oz-prof.jpg)
Прозрачное проксирование через Tor
Вторая важная особенность Subgraph OS — это проксирование всего исходящего трафика через Tor. По умолчанию Tor не поддерживает такую конфигурацию и представляет собой всего лишь SOCKS-прокси, то есть требует, чтобы приложение явно поддерживало SOCKS, а пользователь самостоятельно настроил проксирование приложения через Tor.
Разработчики Subgraph OS обошли эту проблему с помощью Metaproxy, перенаправляющего весь переданный на его порт трафик на адрес указанного SOCKS- или HTTP-прокси (в данном случае Tor), и простого правила брандмауэра, перенаправляющего весь исходящий трафик на порт Metaproxy (8675), делая исключение только для порталов аутентификации публичных сетей Wi-Fi.
![ports](https://xakep.ru/wp-content/uploads/2016/10/ports.jpg)
В качестве браузера Subgraph OS использует стандартный, никак не модифицированный Tor Browser. Это единственное приложение, использующее Tor напрямую, весь остальной софт, включая Wget, отдает трафик Metaproxy. ICMP запрещены в любую сторону, так что операционка не только не отвечает на пинги, но и не позволяет пропинговать другой хост.
![browser](https://xakep.ru/wp-content/uploads/2016/10/browser.jpg)
Брандмауэр
В Subgraph OS интегрирован собственный брандмауэр, точнее графическая надстройка над iptables с диалоговым интерфейсом: стучится приложение, куда не надо, — на экране появляется диалог с просьбой разрешить или запретить соединение.
PaX/Grsecurity
Ядро Subgraph OS собрано с патчами PaX и Grsecurity, это значит, что оно из коробки включает в себя средства, затрудняющие выполнение атак, направленных на переполнение буфера. В первую очередь это пометка стека и области данных приложений как неисполняемых, а области кода как неперезаписываемой, а также технология ASLR (Address Space Layout Randomization), размещающая стек, область кода и данных приложений по случайным адресам в оперативной памяти.
Также Grsecurity включает в себя ряд средств, направленных на повышение безопасности ядра в целом. Это существенные ограничения для приложений, исполняемых в chroot (который используется для создания песочниц), запрет на исполнение бинарных файлов, не принадлежащих пользователю root, запрет на изменение текущего времени и даты, скрытие информации в файловой системе /proc, выводе dmesg, ограничения на использование FIFO-каналов и сокетов и другие.
Некоторые компоненты Subgraph OS напрямую завязаны на Grsecurity. Например, демон USBLockout использует функцию запрета на подключение любых устройств, чтобы не допустить подключения к компу любых USB-устройств, пока он заблокирован.
Нереализованные функции
Зашифрованный диск. Разработчики заявляют о том, что операционка использует принудительное шифрование данных. На самом деле это не так, по крайней мере пока. Инсталлятор может поставить Subgraph OS, используя любую конфигурацию диска, в том числе на один раздел без применения шифрования. Но можно выбрать и установку на логический том LVM, зашифрованный с помощью dm-crypt. Иными словами, никаких отличий от других дистрибутивов Linux.
Subgraph Mail. Во всех документах о дизайне ОС авторы Subgraph OS заявляют об использовании написанного с нуля почтового клиента с поддержкой OpenPGP. Это тоже неправда, операционка использует стандартный почтовый клиент IceDove с плагином Enigmail, а разработка собственного клиента, судя по всему, уже давно заброшена.
Доверенная загрузка. Еще одно громкое заявление разработчиков. Subgraph OS якобы использует технологию доверенной загрузки (Chain of trust), предполагающую защиту от загрузки ОС в случае ее внешней модификации. Для этого обычно используются зашифрованный загрузочный раздел, подписанные цифровым ключом ядро и RAM-диск, контрольные суммы файловых систем. В данный момент ничего подобного в Subgraph OS нет, операционка грузится обычным загрузчиком Grub, который передает управление ядру без всяких сверок цифровых подписей.
![encrypt](https://xakep.ru/wp-content/uploads/2016/10/encrypt.jpg)
Выводы
Subgraph OS — всего лишь альфа, но даже для альфы она выглядит очень бедно. Внимания заслуживает разве что система прозрачного проксирования трафика через Tor, но в этом нет ничего нового, та же система есть в ОС TAILS и Whonix.
Система запуска приложений в песочницах, несмотря на свою вторичность, неплоха, но в данный момент используется только для небольшого числа «избранных» приложений. Включенные в состав ядра патчи Grsecurity — правильная вещь, но опять же реализованная в десятках других систем, включая древний как мир Hardened Gentoo.
Остальные функции пока просто не реализованы, так что ничего лучше старой доброй Qubes OS у нас до сих пор нет.