Bubblewrap Создаем свои песочницы с хирургической точностью
Знакома ситуация, когда нужно запустить какое-то приложение или скрипт, но вы не до конца уверены в его безопасности? Или, может быть, вы разрабатываете систему, где каждый процесс должен работать в строгой изоляции, не имея лишних привилегий? Конечно, на ум сразу приходят контейнеры — Docker, Podman, Kubernetes. Но что, если я скажу, что есть инструмент, который позволяет создать мощную песочницу без всех этих "тяжелых" абстракций и, главное, без привилегий root?
Сегодня мы погрузимся в мир Bubblewrap – проекта от организации containers, который, возможно, незаметен на первый взгляд, но играет ключевую роль в безопасности и изоляции приложений, например, в том же Flatpak.
Что за зверь этот Bubblewrap и зачем он нужен?
Представьте, что вам нужно дать непривилегированному пользователю возможность запустить "контейнер". Стандартные инструменты вроде systemd-nspawn или docker тут не подойдут: слишком велик риск получить полноценную root-оболочку на хостовой машине. Да, есть механизм пользовательских пространств имен (user namespaces) в ядре Linux, который призван решить эту проблему, но он все еще вызывает вопросы по безопасности и не всегда доступен в "продакшн" дистрибутивах.
Вот тут на сцену и выходит Bubblewrap. Это, по сути, setuid-реализация части возможностей пользовательских пространств имен. Акцент на "части" очень важен: он не дает полного контроля над вещами вроде iptables, тем самым обходя некоторые известные уязвимости, связанные с user namespaces.
Кому он будет полезен?
- Разработчикам фреймворков: Если вы создаете платформу для запуска приложений в изолированных средах (как Flatpak), Bubblewrap — это ваш фундамент.
- Системным администраторам: Для запуска недоверенных утилит или предоставления ограниченного доступа к системе.
- Всем, кто заботится о безопасности: Если вам нужна максимальная изоляция без избыточных привилегий.
Хирургия изоляции: как Bubblewrap строит песочницы
Bubblewrap не просто запускает приложение; он создает для него совершенно новую, чистую среду. Это как волшебная коробка, внутри которой приложение видит только то, что вы ему разрешили.
1. Изоляция файловой системы: свой мир с нуля
Главная фишка Bubblewrap — это создание нового, пустого пространства имен монтирования (mount namespace). Корневая файловая система внутри этой песочницы — это временная tmpfs, невидимая для основной системы. И, что самое приятное, она автоматически исчезнет, когда последний процесс в песочнице завершится.
Вы сами решаете, что будет видно внутри:
--ro-bind /usr /usr: Примонтировать/usrхостовой системы как только для чтения.--bind /tmp /var/tmp: Примонтировать/tmpхоста в/var/tmpпесочницы с возможностью записи.--dev /dev: Предоставить доступ к/dev.--proc /proc: Дать доступ к/proc.
Пример: Запустить bash в изолированной среде, используя /usr хоста:
bwrap \
--ro-bind /usr /usr \
--symlink usr/lib64 /lib64 \
--proc /proc \
--dev /dev \
--unshare-pid \
--new-session \
bash
Обратите внимание, как мы вручную "собираем" окружение. Это дает колоссальный контроль, но и требует внимательности.
2. Глубокое погружение: все неймспейсы Linux к вашим услугам
Bubblewrap использует мощь ядра Linux для создания глубокой изоляции:
- User namespaces (
CLONE_NEWUSER): Скрывает все UID/GID, кроме текущего, внутри песочницы. Можно даже переопределить значения UID/GID. - IPC namespaces (
CLONE_NEWIPC): Песочница получает свою собственную копию всех механизмов межпроцессного взаимодействия (SysV shared memory, семафоры). - PID namespaces (
CLONE_NEWPID): Процессы внутри песочницы не видят процессы вне ее. Bubblewrap даже запускает свой миниатюрныйpid1, чтобы избежать "проблемы зомби-процессовpid 1", знакомой по Docker. - Network namespaces (
CLONE_NEWNET): Песочница не видит внешнюю сеть, только свой loopback-интерфейс. Идеально для приложений, которым сеть не нужна или она должна быть строго контролируемой. - UTS namespace (
CLONE_NEWUTS): Позволяет песочнице иметь собственное имя хоста.
3. Последний рубеж: Seccomp фильтры
Для еще большей защиты Bubblewrap позволяет применять seccomp фильтры. Это низкоуровневый механизм, который дает вам возможность точно указать, какие системные вызовы может совершать приложение внутри песочницы. Хотите запретить доступ к файловой системе? Легко! Это как поставить сторожа на каждую дверь и попросить его проверять список разрешенных действий.
Философия безопасности Bubblewrap
Важно понимать: Bubblewrap — это не готовая "песочница из коробки" с предопределенной политикой безопасности. Это конструктор. Уровень защиты полностью зависит от аргументов, которые вы ему передадите.
Разработчики Bubblewrap уверены: их инструмент, даже в сочетании с типичным ПО дистрибутива, не позволяет повышать привилегии. Они используют PR_SET_NO_NEW_PRIVS для отключения setuid бинарников внутри песочницы – это традиционный способ предотвратить выход из chroot и подобных изоляций.
Конечно, есть нюансы, требующие внимания:
TIOCSTIкоманды без--new-sessionмогут привести к выполнению команд вне песочницы (была даже CVE-2017-5226).- Монтирование D-Bus сокета может дать возможность выполнять команды через
systemd. Для таких случаев естьxdg-dbus-proxy.
Помните, чем больше вы монтируете и разрешаете, тем больше потенциальных точек для атаки. Принцип минимальных привилегий здесь работает как часы.
Где Bubblewrap уже трудится?
Этот инструмент — настоящий работяга за кулисами. Его активно используют:
- Flatpak: Основной движок для изоляции настольных приложений. Если вы пользуетесь Flatpak, значит, вы уже знакомы с Bubblewrap!
- rpm-ostree unprivileged: Для выполнения операций без привилегий root.
- bwrap-oci: Еще один проект для работы с OCI-контейнерами.
Разработчики также видят большой потенциал для интеграции Bubblewrap в кластеры Kubernetes/OpenShift, чтобы упростить сценарии интерактивной отладки для непривилегированных пользователей.
Установка и первые шаги
Bubblewrap доступен в репозиториях большинства популярных дистрибутивов Linux. Просто установите его через ваш менеджер пакетов:
# Для Debian/Ubuntu
sudo apt install bubblewrap
# Для Fedora/CentOS
sudo dnf install bubblewrap
Если же вам нужна самая свежая версия или вы хотите собрать ее из исходников, это тоже не проблема:
meson _builddir
meson compile -C _builddir
meson test -C _builddir
meson install -C _builddir
Сравнение с "коллегами по цеху"
Интересно посмотреть, как Bubblewrap соотносится с другими инструментами:
- Firejail: Похож на Flatpak до того, как Bubblewrap был выделен в отдельный проект. Firejail объединяет
setuid-инструмент с множеством функций для изоляции десктопных приложений (знает про Pulseaudio и т.д.). Авторы Bubblewrap считают, что их подход с небольшимsetuid-кодом и вынесением специфичных для рабочего стола функций в непривилегированные процессы (как делает Flatpak) более безопасен и легче аудируется. Кроме того, Firejail использует подход "белого списка" путей к файлам, что, по мнению разработчиков Bubblewrap, чревато уязвимостями из-за сложности манипуляций с путями. - runC/binctr: Эти инструменты в основном предназначены для запуска контейнеров от имени root. Хотя
runCработает над "rootless" контейнерами, авторы Bubblewrap считают, чтоrunCиsystemd-nspawnне создавались для работы вsetuid-режиме. Bubblewrap же изначально нацелен на предоставление контейнерных функций непривилегированным пользователям.
Почему "Bubblewrap"?
Название "Bubblewrap" (пузырчатая пленка) было выбрано неслучайно. Оно призвано передать идею, что инструмент "оборачивает" (wraps) приложение, запускаясь как его родительский процесс, и создает вокруг него защитный слой — песочницу. Очень меткое название, согласитесь?

(Котик в пузырчатой пленке от dancing_stupidity)
Так стоит ли попробовать?
Если вы ищете инструмент для построения собственных, максимально контролируемых и безопасных песочниц без необходимости работать от root, то Bubblewrap — это то, что вам нужно. Он предоставляет низкоуровневые, но мощные примитивы для изоляции, давая вам полный контроль над средой выполнения. Это не "готовое решение", а скорее "строительный набор" для тех, кто хочет создавать свои контейнерные и sandbox-решения с нуля или интегрировать их в существующие фреймворки.
Он идеально подойдет разработчикам систем, где безопасность и изоляция критически важны, а также тем, кто хочет глубже понять механизмы работы контейнеров в Linux. Попробуйте, и вы поймете, почему такие проекты, как Flatpak, доверяют ему свою изоляцию!