LINUX.ORG.RU

Безопасное выполнение чужого исполняемого файла.


0

0

Есть такая задача - пользователи присылают некоторые исходные коды программ, написанных на одном из нескольких заданных языков. Для компилируемых языков происходит компиляция в обычный Linux ELF бинарник. После чего бинарники и интерпретируемые программы выполняются. Пользователи могут быть очень небезопасными и прилагать все усилия для взлома системы. Какой лучший вариант защиты применять? Граничные условия - очень критична производительность, то есть запускать под bochs каждую программу абсолютно невозможно.

Для некоторых скриптовых языков есть sandbox'ы. А как решать задачу в общем случае? Запускать под пользователями с минимальными правами, в chroot, под vserver? Есть ли возможность безопасной компиляции Си кода? Например, не допускающую применение ассемблера, выполнения сегмента данных и модификации сегмента кода и линкующегося с урезанной libc, без опасных функций?

Относительно безопасной libc - программы носят вычислительный характер, так что нужен только основной ввод/вывод, потоки, синхронизация. Точнее на данный момент требования сказать не могу. Систему только проектирую.

★★

Проще всего под chroot отдельным пользователем. Многое зависит от самих программ, есть ли там интерфейс или нет, соответственно если нет то можно выключить иксы и другие сервисы по тому же принципу. Настроить лимиты на диск, память процессорное время, тогда не придется искать зловредный код на ассемблере. Существуют же public shell серверы, там любой может запускать свои программки в рамках ограничений сервиса.

Lucky1 ★★★ ()

Я не силен в таких вопросах,но мне интересно, нельзя ли все это замутить через паравиртуализацию?

pathfinder ★★★★ ()

виртуалка со снапшотом и откатом после перезагрузки.

программы носят вычислительный характер

под kvm потери производительности 1-2%

sdio ★★★★★ ()

Выше уже сказали - выполнять бинарники в виртуальной машине. ИМХО это лучший вариант.

Есть ли возможность безопасной компиляции Си кода?

Искаропки скорее всего нет. Но можно взять какой-нибудь маленький C-компилятор, например tcc, и модифицировать его. Но опять же, очень сложно предугадать и отрезать все пути к выполнению «запрещённых действий».

Deleted ()

Вроде получается, что

выполнения сегмента данных и модификации сегмента кода

сначала требует системных вызовов, а без ассемблера системный вызов будет только через libc, которую можно урезать. Правда, готового не знаю.

Если задача чисто счётная, то, SeLinux не должен особо её затормозить. Хотя не совсем понятно, от чего закрываемся, то-ли от того, что программа нагадит обычными средствами, то-ли от ещё не выявленных в ядре/библиотеках уязвимостей.

mky ★★★★★ ()
Ответ на: комментарий от Lucky1

>Многое зависит от самих программ, есть ли там интерфейс или нет,

Интерфейса нет. Ввод вывод - дан файл/stdin/socket из него читаем, работаем, пишем в файл/stdout/socket.

Существуют же public shell серверы, там любой может запускать свои программки в рамках ограничений сервиса.

Ну да, интересен и их опыт.

wieker ★★ ()
Ответ на: комментарий от sdio

Если нет сильных потерь, то вполне пойдет. Наверное, самый простой вариант.

wieker ★★ ()
Ответ на: комментарий от mky

>выполнения сегмента данных и модификации сегмента кода

сначала требует системных вызовов

ой ли? разве бех NXbit простой call <data_address> не работает? я сам не знаю точно

wieker ★★ ()
Ответ на: комментарий от pathfinder

pathfinder> Это достоверные сведения, а то уж больно все красиво звучит?

Предложи вычислительный тест, я тебе его прогоню в хосте и в госте на выбор

  - squeeze              shut off
  - centos54_1           shut off
  - centos54_2           shut off
  - etch1                shut off
  - lenny32              shut off

sdio ★★★★★ ()

Здесь подойдет SELinux, но решения «из коробки» нет. Придется пилить самому. Виртуалка намного проще.

Macil ★★★★★ ()

> Есть ли возможность безопасной компиляции Си кода?

Есть google native client. Делает песочницу для браузера. Ну и там же можно посмотреть некотрые рассуждения на эту тему. А погуглив можно найти мнение народа об этих рассуждениях.

Если не заморачиваться с патчеными компиляторами то chroot.

antares0 ★★★★ ()

OpenVZ. Порезать можно всё что угодно, при этом доступ к фс контейнера и всему что там находится (типа сокетов, пайпов и прочих симлинков) можно осуществлять прямо с хоста и прямо в процессе работы этого самого контейнера (ибо оно и есть часть фс хоста, отдельные образы ему не нужны).

INFOMAN ★★★★★ ()
Ответ на: комментарий от antares0

>Есть google native client.

Да, нагуглил, когда искал. Но остановлюсь на виртуалке для первой реализации. Потом можно будет усложнять.

wieker ★★ ()
Ответ на: комментарий от Deleted

[quote] Искаропки скорее всего нет. Но можно взять какой-нибудь маленький C-компилятор, например tcc, и модифицировать его. Но опять же, очень сложно предугадать и отрезать все пути к выполнению «запрещённых действий». [/quote]

не сложно, а невозможно, иначе это будет уже не C. Даже бональный buffer overflow далеко не всегда можно автоматическим код-анализором выловить, а где buffer overflow - там и любой другой бинарный код произвольный.

a_nan ()
Ответ на: комментарий от sdio

Плюсую виртуалку со снапшотом и откатом по окончании выполнения

Внутри виртуалки - исполнять только о имени непривилегированного пользователя. Так будет тяжелее её разэксплоитить.

Manhunt ★★★★★ ()
Ответ на: комментарий от a_nan

не сложно, а невозможно, иначе это будет уже не C.

Да, действительно, если такое всё-таки реализовать, то это уже будет далеко не Си =).

Deleted ()
Ответ на: комментарий от sotlef

Нет, этим я уже не занимаюсь. Хотя почти угадали - делаю контест, но не для олимпиад по информатике.

wieker ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.