xenon
@xenon
Too drunk to fsck

Можно ли безопасно запустить программу (только stdin/stdout, легковесная виртуализация, jail)?

Контекст и предыстория:
Когда-то в давние времена я решил посмотреть ключи команды reboot и логично запустил reboot --help. Машина перегрузилась. (Ну просто ребут тогда был простой, его вызывают - он перегружает, без этих ваших -h, --help).

Сам вопрос:
Можно ли как-то вызвать бинарь заведомо изолированно и безопасно, чтобы даже если он системный, "злой", если он действует не по правилам, чтобы он бы просто был изолирован от всего (может быть, в том числе, и от сети даже). Но мы могли бы получить его stdout/stderr (и может скормить ему stdin)?

Варианты с запуском его внутри LXC/kvm/vagrant/virtualbox - сработали бы, но как-то уж очень сложно. Jail - уже лучше, но тоже надо подготавливать ему среду. Может быть есть что-то более простое, типа:

isolate /usr/sbin/mke2fs /dev/sda

(я тут придумал, что утилита называется isolate, т.к. не знаю, как она называется) - и вот этот вызов заведомо будет безопасным, т.к. "изолятор" сразу изолирует программу от системы, и она может только писать stdout/stderr.
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 4
ky0
@ky0 Куратор тега Системное администрирование
Миллиардер, филантроп, патологический лгун
Создайте отдельного пользователя без админских прав - и запускайте ваши бинари из-под него. Если там внутри не 0-day уязвимость с повышением привелегий - этого будет достаточно, чтобы не огрести непоправимых последствий.
Ответ написан
Комментировать
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Есть же докер, ВМ и прочие системы виртуализации. Например докер из коробки может выполнять команду внутри контейнера. Там, где такого нет из коробки - легко делается через SSH:
ssh user@server command
Пишется простой скрипт, который копирует указанное приложение/каталог в контейнер или расшаренный каталог, запускает приложение в контейнере/ВМ и выдает его результат.
Ответ написан
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
man chroot
Но от перезагрузки и форматирования устройств это не спасет. ВМ затем и были придуманы, что необратимое повреждение происходит только с виртуальными устройствами. Или как советуют - создайте юзера без админских прав - тогда просто ничего не произойдет.
Ответ написан
Комментировать
xenon
@xenon Автор вопроса
Too drunk to fsck
Помимо известных проектов (chroot, docker, podman, apparmor, selinux) ChatGPT посоветовал:
- firejail
- bubblewrap

Я потестил firejail:

mir ~ $ firejail --private --net=none dd if=/dev/zero of=BREAK bs=1K count=1
Reading profile /etc/firejail/default.profile
Reading profile /etc/firejail/disable-common.inc
Reading profile /etc/firejail/disable-passwdmgr.inc
Reading profile /etc/firejail/disable-programs.inc
Warning: networking feature is disabled in Firejail configuration file

** Note: you can use --noprofile to disable default.profile **

Parent pid 2406028, child pid 2406029
Child process initialized in 55.43 ms
1+0 records in
1+0 records out
1024 bytes (1.0 kB, 1.0 KiB) copied, 6.4323e-05 s, 15.9 MB/s

Parent is shutting down, bye...
mir ~ $ ls -l BREAK
ls: cannot access 'BREAK': No such file or directory

под firejail dd "записал" файл виртуально, на диске его нет, как видим. (но в /tmp будет писать на диск, а под рутом где-нибудь в /usr/lib - выругается, что read-only). Можно поиграть с настройками.

Сеть тоже не работает (если отключить):

mir ~ $ firejail --private --net=none ping 1.1.1.1
ping: connect: Network is unreachable
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы