
Профиль песочницы без привилегий для BubbleWrap
Многие инструменты времени выполнения контейнеров, такие как SystemD-NSPAWN, Dockeretc., Сфокусируются на предоставлении инфраструктуры для системных администраторов и инструментов оркестровки (например, Kubernettes) для выполнения контейнеров.
Эти инструменты не подходят для предоставления им пользователям без привилегий, потому что это тривиально преобразовать такой доступ в корневую оболочку с полными привилегиями на хосте.
На уровне ядра Linux есть система изоляции, называемое пространствами пользователя «пространства пользовательских имен», которые пытаются позволить пользователям без привилегий использовать функции контейнера. Хотя значительный прогресс был достигнут, в этом отношении по -прежнему существуют проблемы и недоступны для пользователей без привилегий в нескольких распределениях производства, таких как Centos / Red Hat Enterprise Linux 7, Debian Jessie и т. Д.
См., Например, CVE-2016-3135, который является локальной уязвимостью корней, введенной пользователями. В марте 2016 года публикация имеет больше дискуссий.
BubbleWrap можно рассматривать как целую реализацию подмножества пространств имен пользователя. Акцент на подмножества - специально для предыдущего CVE, BubbleWrap не позволяет контролировать iptables.
Оригинальный код BubbleWrap существовал перед пространствами имен пользователей: наследует вспомогательный код XDG -App, который, в свою очередь, нарушается Linux-User-Chroot.
Содействия этого инструмента считают, что, даже при использовании в сочетании с типичным программным обеспечением, установленным в этом распределении, оно не позволяет эскалация привилегий. Тем не менее, это может увеличить емкость пользователя, который вошел в систему для проведения атак с отказом в обслуживании.
В частности, BubbleWrap используется PR_SET_NO_NEW_PRIVS для деактивации бинарного файла SETUID, который является традиционным способом выйти из таких вещей, как Chroots.
Эта программа может быть передана всеми инструментами -контейнерами, которые не кормят операции, например:
Flatpak RPM-Ostree без привилегий BWRAP-OCI Мы также хотели бы, чтобы это было доступно в кластерах Kubernetes / On Shift. Возможность того, что пользователи без привилегий используют функции контейнера, значительно облегчало бы реализацию интерактивных и аналогичных сценариев очистки.
BubbleWrap работает, создавая новое, совершенно пустое пространство имен сборки, где корень находится в TMPF, который невидим для хоста, и будет автоматически очищаться, когда заканчивается последний процесс. Затем вы можете использовать параметры командной строки для создания корневой файловой системы и среды процесса и команды для выполнения в пространстве имен.
В исходном коде существует большая последовательность команды демонстрации, но здесь есть небольшая версия, которая выполняет новую оболочку, повторную использующую файл /usr.
Bwrap-ro-bind /usr /usr-symlink usr /lib64 /lib64-proc /proc-dev /dev-share-pid Bash Это неполный пример, но полезен для иллюстративных целей. Чаще всего, вместо создания контейнера, используя дерево файловой системы хоста, вы хотите зарегистрироваться на Chroot. Там, вместо создания символической ссылки Lib64 -> USR/LIB64, TMPFS, возможно, уже создал ее в корневище.
Целью BubbleWrap является выполнение приложения в песочнице, где оно имеет ограниченный доступ к частям операционной системы или пользовательских данных, таких как стартовый каталог.
BubbleWrap всегда создает новое пространство имен сборки, и пользователь может точно указать, какие части файловой системы должны быть видны в песочнице. Любой из указанных каталогов будет установлен предопределенной формой и может быть выполнена только чтение.
Кроме того, вы можете использовать эти функции ядра:
Пространства имен пользователя (CLONE_NEWUSER): это скрывает все, кроме текущего UID и песочницы. Это также может изменить то, что должно быть значение UID / GID в песочнице.
Spaces IPC Spaces (CLONE_NEWIPC): Песчаная коробка получит свою собственную копию всех различных форм ИПЦ, таких как SYSV -общая память и светофоры.
PID -Spaces (CLONE_NEWPID): Песочница не увидит какого -либо процесса вне песочницы. Кроме того, BubbleWrap выполнит тривиальную PID1 в своем контейнере, чтобы справиться с требованиями пожинания детей в песчаной коробке. Это избегает того, что сейчас известно как проблема Docker Pid 1.
Пространства dehttp: //linux.die.net/man/2/clone Network имена (CLONE_NEWNET): Песочница не увидит сеть. Вместо этого у вас будет собственное пространство имен сети только с перевернутым контуром.
Имена UTS (CLONE_NEWUTS): Песчаная коробка будет иметь свое собственное имя хоста.
Фильтры SECCOMP: SECCOMP -фильтры, которые ограничивают вызовы в систему, которые могут быть выполнены в зоне тестирования, могут пройти. Для получения дополнительной информации см. Seccomp.
Firejail похож на Flatpak до того, как BubbleWrap была разделена на смысл, что он объединяет инструмент SetUID со многими конкретными функциями песочницы настольных столов. Например, Firejail знает Pulseaudio, в то время как BubbleWrap №.
Авторы BubbleWrap считают, что гораздо проще проверять небольшую программу SetUID и поддерживать такие характеристики, как фильтрация PulseAudio в качестве процесса без привилегий, как и сейчас в FlatPak.
Кроме того, @cgwalters считает, что попытка включить маршруты файлов в белый список - это плохая идея, учитывая бесчисленные способы, которыми пользователи должны манипулировать маршрутами и бесчисленными способами, которыми системные администраторы могут настроить систему. Подход BubbleWrap заключается в том, чтобы сохранить только некоторые конкретные возможности Linux, такие как CAP_SYS_ADMIN, но всегда доступ к файловой системе, такой как UID. Это полностью закрывает атаки Tocttou и других.
Sandstorm.io требует пробелов для имен пользователей без привилегий для настройки песочницы, хотя он также может легко адаптироваться для работы в режиме SetUid. @Cgwalters считает, что его код довольно хороший, но все равно может иметь смысл объединиться в BubbleWrap. Тем не менее, @kentonv (из песчаной бури) считает, что, хотя это имеет смысл в принципе, стоимость изменений на данный момент превышает практические выгоды. Это решение может быть переоценено в будущем, но сегодня оно не будет активно применяться.
Runc в настоящее время работает над поддержкой контейнеров без root, без необходимости какой -либо другой привилегии во время установки Runc (используя пространства имен пользователя без привилегий вместо setUID), создания и администрирования контейнеров. Тем не менее, стандартный режим использования Runc аналогичен SystemD nSpawn, в котором он предназначен для вызова корнем.
Авторы BubbleWrap считают, что RUNC и SystemD-NSPAWN не предназначены для того, чтобы стать настройкой и далеки от этого способа. Однако, с контейнерами без корня, Runc может соответствовать определенным вариантам использования, допущенных BubbleWrap (с дополнительным преимуществом того, что он является полным и стандартизированным временем выполнения OCI).
Binctr - это просто конверт для Runc, поэтому он унаследовал все свои компенсации дизайна.