Игры с песочницей. Выбираем простое и быстрое решение для изоляции приложений

Тема в разделе "ПО для защиты компьютера и информации", создана пользователем Igisimbaev, 22 июл 2016.

  1. Aleks

    Aleks Постоялец

    Регистрация:
    21 май 2015
    Сообщения:
    237
    Симпатии:
    260
    Баллы:
    63
    Пол:
    Мужской
    Наверняка хоть раз в жизни тебе приходилось иметь дело с не вызывающими доверия приложениями и скриптами, которые могли навредить системе. Или ты хотел запустить браузер в максимально изолированном окружении, чтобы в случае его взлома твоей системе ничто не угрожало. Сегодня подобные задачи принято решать с помощью вездесущего Docker, однако есть масса гораздо более простых и удобных инструментов для быстрого запуска приложений в песочницах.

    Вместо введения
    Задолго до того, как идея Docker зародилась в головах его создателей, появился проект LXC (LinuX Containers). Он был основан на все тех же технологиях разделения пространств имен (Linux Namespaces) и точно так же позволял создать минималистичное замкнутое на себя окружение исполнения (песочницу, контейнер) для запуска сервисов или небезопасных приложений. Однако LXC не был столь дружелюбным к новым пользователям и не обладал фишками Docker вроде слоеной файловой системы, возможности быстро выкачать и запустить уже готовое приложение и конфигами для автоматической сборки окружений.

    Намного раньше во FreeBSD появилась технология jail, позволяющая создавать песочницы, подобные chroot, но с акцентом на более глубокий уровень изоляции. Долгое время jail была гордостью FreeBSD и даже послужила прообразом для технологии Solaris Zones. Однако сегодня она уже не может обеспечить тот уровень гибкости и управления ресурсами, которые предлагают LXC и Docker, так что в целом jail оказалась на обочине истории. Сегодня песочницы в Linux можно создавать множеством разных способов. Это и уже упомянутые LXC и Docker с их пространствами имен, это механизм seccomp, используемый Chrome для изоляции вкладок и плагинов, это технологии SELinux/AppArmor, позволяющие тонко регулировать доступ приложения к чему бы то ни было. В этой статье мы познакомимся с самыми удобными для обычного пользователя инструментами, которые лучше всего подходят для решения повседневных задач, таких как:
    • запуск не вызывающего доверия приложения, способного навредить системе;
    • изоляция браузера, email-клиента и других приложений, чтобы их взлом не привел к утечке данных;
    • запуск «одноразовых» приложений, которые не должны оставлять следов в системе.
    Mbox
    Начнем с одной из самых простых песочниц. Mbox — не совсем стандартный инструмент изоляции, он не урезает полномочия запущенного приложения, не выполняет виртуализацию сетевого стека и не имеет каких-либо настроек. Единственная задача Mbox — сделать так, чтобы приложение не смогло ничего записать в файловую систему. Для этого он создает специальную виртуальную ФС, на которую перенаправляет все запросы ввода/вывода. В результате под управлением Mbox приложение работает как ни в чем не бывало, однако в ходе его работы ты получаешь возможность применить или отвергнуть те или иные изменения виртуальной файловой системы к файловой системе реальной.

    Лучше всего эту концепцию демонстрирует пример с официальной страницы Mbox:
    Код:
    $ mbox -- wget google.com
    ...
    Network Summary:
    > [11279] -> 173.194.43.51:80
    > [11279] Create socket(PF_INET,...)
    > [11279] -> a00::2607:f8b0:4006:803:0
    ...
    Sandbox Root:
    > /tmp/sandbox-11275
    > N:/tmp/index.html
    [c]ommit, [i]gnore, [d]iff, [l]ist, [s]hell, [q]uit ?>
    В данном случае под управлением Mbox запускается Wget. Mbox заботливо сообщает нам, что Wget обращается к адресу 173.194.43.51 и порту 80, и записывает файл index.html, который мы можем применить к основной системе (для этого нужно нажать «c»), игнорировать (i), просмотреть diff, выполнить другие операции или вообще завершить приложение. Проверить, как это все работает, можно, просто установив уже готовый пакет Mbox. В Debian/Ubuntu это делается так:
    Код:
    $ wget http://pdos.csail.mit.edu/mbox/mbox-latest-amd64.deb
    $ sudo dpkg -i mbox-latest-amd64.deb
    В Arch Linux Mbox доступен в AUR, поэтому установить его еще проще:
    Код:
    $ yaourt -S mbox-git
    Это все. Теперь можно запускать любые бинарники, не беспокоясь, что они оставят в файловой системе бэкдор. В случае если приложению необходимо ограничить доступ к определенным частям файловой системы, можно использовать профили. Это обычные текстовые файлы, в которых перечислены разрешенные и запрещенные на доступ каталоги. Например, следующий профиль запретит приложению доступ к твоему домашнему каталогу (~), но оставит возможность работы с файлами текущего каталога (.):
    Код:
    [fs]
    allow: .
    hide: ~
    Чтобы запустить приложение с определенным профилем, достаточно указать его через опцию -p:
    Код:
    $ mbox -p profile.prof -- wget google.com
    Еще одна полезная опция — -n. Она полностью запрещает приложению доступ в интернет.

    [​IMG]
    Как работает Mbox

    [​IMG]
    Производительность приложения в Mbox в среднем на 12–13% ниже обычной
    Firejail
    Само собой разумеется, простой запрет на доступ к файлам — это слишком мало для создания по-настоящему изолированных песочниц. Вредоносный код или взломщик могут вообще ничего не прописывать в систему, а просто унести с собой твой Bitcoin-кошелек и базу паролей KeePass или использовать уязвимость приложения для получения прав root и выхода из песочницы. К тому же Mbox не дружит с графическим софтом и в целом не годится для запуска комплексных приложений, которые могут записывать на диск множество временных файлов и постоянно обновляют свои базы данных.

    К счастью, у нас есть Firejail, гораздо более гибкий и мощный инструмент изоляции, который не просто контролирует доступ к ФС, а полностью отрезает приложение от основной системы с помощью механизма Linux Namespaces. Запущенное в песочнице Firejail приложение имеет доступ только к заранее определенным файлам и функциям системы. Например, можно запретить приложению доступ ко всем файлам, кроме собственных конфигов, открыть некоторые файлы только на чтение или только на запись, запретить поднимать свои привилегии до root, запретить подключаться к определенным портам, запретить небезопасные системные вызовы, такие как execv.

    Ограничения приложения задаются в профиле, который может насчитывать десятки строк типа noroot, seccomp,whitelist ~/.mozilla. Однако лично тебя никто не заставляет их писать — Firejail уже включает в себя профили для 95 различных приложений. Все, что остается сделать, — просто установить инструмент и запустить программу:
    Код:
    $ wget http://sourceforge.net/projects/firejail/files/firejail/firejail_0.9.40_1_amd64.d
    $ sudo dpkg -i firejail_0.9.40_1_amd64.deb
    $ firejail firefox
    Все, теперь Firefox работает в изолированной песочнице и имеет доступ только к своему собственному каталогу, нескольким связанным конфигам (KeePass, например) и не имеет доступа к опасным системным вызовам и портам за исключением 80, 443 и 53.

    [​IMG]
    Запускаем Firefox в песочнице
    Более того, ты можешь запустить Firefox в полностью стерильном окружении без доступа к конфигам и файлам основной системы:
    Код:
    $ firejail --private --dns=8.8.8.8 firefox -no-remote
    Такой способ запуска полезен при работе с интернет-банками и любой важной информацией. Основная идея здесь в том, что, если твой основной браузер будет скомпрометирован с помощью вредоносного кода, который ты случайно подцепил на одном из развлекательных сайтов или установив не вызывающее доверия расширение, приватная песочница останется не затронута и банковский аккаунт будет в безопасности.

    Ты можешь создать сразу несколько таких песочниц и использовать их для захода на разные сайты (здесь USER — это твое имя пользователя):
    Код:
    $ firejail --private=/home/USER/work firefox -no-remote &
    $ firejail --private=/home/USER/bank firefox -no-remote &
    $ firejail --private=/home/USER/other firefox -no-remote &
    Эти команды запустят три инстанса браузера в отдельных песочницах. Первый ты будешь использовать для работы, второй для онлайн-банкинга, а третий для всего остального, не связанного с первыми двумя. Компрометация одной из песочниц не приведет к компрометации остальных.

    В случае необходимости ты можешь даже ограничить ширину канала для запущенного в песочнице приложения. Например, следующая команда ограничит ширину входящего канала до 80 Кбайт/с, а ширину исходящего — до 20:
    Код:
    $ firejail --name=browser --net=eth0 firefox &
    $ firejail --bandwidth=browser set eth0 80 20
    Все профили приложений Firejail хранит в каталоге /etc/firejail. Если тебе нужно создать профиль для приложения, не поддерживаемого Firejail, просто скопируй профиль похожего по функциональности приложения и измени его. Формат профиля интуитивно понятен. Правда, для фильтрации системных вызовов придется выяснить, какие из них использует приложение, а затем добавить в профиль. Как это сделать, описано в официальной документации.

    [​IMG]
    Часть профиля firefox
    Sandbox
    Если среди 95 профилей Firejail нет нужных тебе приложений, а идея писать профили самому не слишком тебя радует, то Sandbox — это твой выбор. Данный вид песочницы технически сильно отличается от двух уже описанных инструментов (он использует правила SELinux вместо seccomp и Namespaces), но в плане функциональности представляет собой нечто среднее.

    Как и Mbox, Sandbox полностью отрезает приложение от внешнего мира, позволяя читать только stdin (то есть на вход запущенного в песочнице приложения можно передать данные другого приложения), а писать только в stdout (выводить данные на экран или перенаправлять другому приложению). Все остальное, включая доступ к файловой системе, сигналам, другим процессам и сети, запрещено. Простейший пример использования:
    Код:
    $ cat /etc/passwd | sandbox cut -d: -f1 > /tmp/users
    Данная команда читает файл /etc/passwd, извлекает из него имена пользователей и записывает их в файл /tmp/users. Пользы от нее никакой, но она отлично демонстрирует принципы работы Sandbox. В песочнице запускается только команда cut, а сам файл /etc/passwd передается ей с помощью внешней команды. Вывод, с другой стороны, реализуется с помощью обычного перенаправления stdout.

    [​IMG]
    Сообщение SELinux при попытке «свернуть» Vim с помощью Ctrl-Z

    Красота Sandbox в том, что с его помощью довольно легко расширить доступные приложению возможности. Например, ты можешь создать для него временные домашний каталог и каталог /tmp, передав команде всего один флаг:
    Код:
    $ sandbox -M mc
    После завершения работы программы эти каталоги будут уничтожены, что весьма удобно при запуске не вызывающего доверия софта. Но что, если домашний каталог нужно сохранять между запусками (ну, допустим, для того, чтобы протестировать софт, работающий с множеством файлов)? Для этого достаточно создать каталог, который станет домашним для песочницы, и добавить еще одну опцию:
    Код:
    $ mkdir sandbox_home
    $ sandbox -M -H sandbox_home mc
    Теперь у mc есть свой собственный домашний каталог, куда он может сохранять конфиги и откуда может читать файлы. Также Sandbox позволяет запускать графический софт (с помощью виртуального X-сервера Xephyr). Для этого достаточно передать еще один флаг:
    Код:
    $ sandbox -X -M -H sandbox_home gvim
    Но и это еще не все. Sandbox имеет встроенные политики безопасности для запуска браузеров. Все, что нужно сделать, — выполнить такую команду:
    Код:
    $ sandbox -X -H sandbox_home -t sandbox_web_t firefox
    Причем, как ты уже должен был понять, ты можешь использовать разные домашние каталоги для запуска разных сессий браузера или использовать «одноразовый» домашний каталог для походов по злачным местам. Еще один полезный флаг, о котором стоит упомянуть, — -w, с его помощью можно указать размер окна для графического софта. Он тебе определенно пригодится, так как динамически менять размер окна нельзя (это техническое ограничение Xephyr).

    В целом Sandbox — очень удобный инструмент, единственная проблема которого — поддержка в дистрибутивах. Фактически прямо из коробки Sandbox работает только в Fedora, основанных на нем RHEL/CentOS и, возможно, в других дистрибутивах с активированным по умолчанию SELinux.

    Выводы
    Запустить софт в песочнице довольно просто, и для этого можно использовать множество инструментов. В этой статье мы рассмотрели три из них.
    • Mbox отличается крайней простотой и идеален, когда необходимо контролировать то, к каким файлам приложение должно получить доступ.
    • Firejail подходит для создания сложных конфигураций и запуска почти сотни различных приложений, но не очень удобен, если нужного приложения нет в списке поддерживаемых.
    • Sandbox — прекрасный инструмент для запуска любых типов софта, но доступен только пользователям Fedora и основанных на нем дистрибутивов.
    Техническое описание принципов работы Mbox
    Описание технологии seccomp-bpf, используемой в Mbox и Firejail

    Источник
     
    svytoi и yan_nemiroff нравится это.

Поделиться этой страницей