В настоящее время я использую часть программного обеспечения «песочницы» на моем компьютере 14.04, которая изолирует двоичные файлы Linux друг от друга (используя специальный тип изоляции пространства имен, отличный от AppArmor)
В настоящее время способ вызова песочницы выглядит следующим образом:
/usr/local/bin/sandbox /path/to/binary --optional-arguments
Моя проблема в том, что я хочу вызвать определенные произвольные двоичные файлы и выполнить их в песочнице.безнеобходимо добавить эту /usr/local/bin/sandbox
часть к моей команде оболочки. То есть:
/usr/local/bin/sandbox /path/to/binary --optional-arguments --> *new process*
Становится:
/path/to/binary --optional-arguments --> *binfmt-misc* --> *new process*
Я подумал, что смогу легко сделать это благодаря binfmt-misc, однако после прочтения документации он, похоже, поддерживает только запрос интерпретатора либо через магические биты в самом файле, либо через расширение файла. Поскольку в этом конкретном случае невозможно сделать ни одну из этих вещей, я поискал опцию в binfmt-misc, которая позволила бы мне указать расширенные атрибуты для определенных двоичных файлов, которые я хочу запустить в песочнице, которые binfmt-misc затем мог бы прочитать и использовать для определения того, что эти двоичные файлы должны запускаться /usr/local/bin/sandbox
«интерпретатором». Однако я пока не нашел в нем такой функции, которая позволила бы мне это сделать.
Есть ли способ автоматически запускать произвольные двоичные файлы ELF без расширения, скомпилированные для той же архитектуры, что и мой компьютер, используя песочницу?
решение1
Я не знаю способа сделать это через binfmt-misc и xattrs, но я предложу другой подход. Я не пробовал, но не вижу, почему это не сработает.
Идея состоит в том, чтобы использоватькрепление для союзачтобы скрыть реальные двоичные файлы с помощью скрипта-обертки, который вызывает песочницу. Нам нужно объединенное монтирование, где верхний каталог в основном читается, а запись в нетеневой файл переходит в нижний каталог, что поддерживается не всеми системами объединения монтирования. В частности, это исключает OverlayFS, который теперь встроен в ядро Linux.
Напишите универсальный скрипт-обертку:
#!/bin/sh
exec /usr/local/bin/sandbox "${0#/sandboxed}" "$@"
Создайте каталог /sandbox
и создайте объединенное монтирование, которое затеняет корневую файловую систему. Я буду использоватьауфс(Убунту:aufs-tools
), от которого, к сожалению, недавно отказались; возможно, есть лучший выбор.
mount -t aufs -o br:/,br:/sandbox aufs-sandbox /
Для каждого исполняемого файла, который вы хотите поместить в песочницу, создайте ссылку /sandbox/path/to/foo
на скрипт-оболочку (предварительно создав необходимые каталоги /path/to
в /sandbox
).