Запустить ненадежную C-программу в песочнице в Linux, которая мешает ей открывать файлы, разветвляться и т. Д.? - PullRequest
106 голосов
/ 22 ноября 2010

Мне было интересно, существует ли способ запустить ненадежную программу на C в песочнице в Linux. Что-то, что помешало бы программе открыть файлы, или сетевые подключения, или разветвление, exec и т. Д.?

Это будет небольшая программа, домашнее задание, которое загружается на сервер и на нем выполняются модульные тесты. Так что программа будет недолгой.

Ответы [ 11 ]

45 голосов
/ 22 ноября 2010

Я использовал Systrace для песочницы ненадежных программ как в интерактивном, так и в автоматическом режиме.У него есть ptrace() бэкэнд, который позволяет использовать его в системе Linux без особых привилегий, а также гораздо более быстрый и более мощный бэкэнд, который требует исправления ядра.

ItТакже возможно создать «песочницу» в Unix-подобных системах, используя chroot(1), хотя это не так просто и безопасно. Контейнеры Linux и Тюрьмы FreeBSD - лучшая альтернатива chroot.Другой альтернативой для Linux является использование инфраструктуры безопасности, такой как SELinux или AppArmor , что я бы предложил для производственных систем.

Мы сможем вам помочьбольше, если бы вы сказали, что именно вы хотите сделать.

РЕДАКТИРОВАТЬ:

Systrace будет работать для вашего случая, но я думаю, что что-то на основе Модель безопасности Linux , как AppArmor или SELinux, является более стандартной и, следовательно, предпочтительной альтернативой, в зависимости от вашего дистрибутива.

РЕДАКТИРОВАТЬ 2:

Хотя chroot(1) доступно на большинстве (всех?) Unix-подобных системах, у него довольно много проблем:

  • Его можно устранить.Если вы собираетесь на самом деле компилировать или запускать ненадежные программы на Си в своей системе, вы особенно уязвимы для этой проблемы.И если ваши ученики похожи на меня, кто-то попытается вырваться из тюрьмы.

  • Вы должны создать полностью независимую иерархию файловой системы со всем, что необходимо для вашей задачи.Вам не нужно иметь компилятор в chroot, но все, что требуется для запуска скомпилированных программ, должно быть включено.Хотя есть утилиты, которые помогают с этим, это все же не тривиально.

  • Вы должны поддерживать chroot.Поскольку файлы chroot независимы, они не будут обновляться вместе с вашим дистрибутивом.Вам придется либо регулярно воссоздавать chroot, либо включать в него необходимые инструменты обновления, что, по сути, потребует, чтобы это был полноценный дистрибутив Linux.Вам также необходимо будет синхронизировать системные и пользовательские данные (пароли, входные файлы и т. Д.) С хост-системой.

  • chroot() защищает только файловую систему.Это не препятствует тому, чтобы вредоносная программа открывала сетевые сокеты, а плохо написанная - высасывала все доступные ресурсы.

Проблема использования ресурсов распространена среди всех альтернатив. Квоты файловой системы не позволят программам заполнять диск.Правильные ulimit (setrlimit() в C) настройки могут защитить от чрезмерного использования памяти и любых вилочных бомб, а также положить конец нагрузкам на процессор.nice(1) может снизить приоритет этих программ, так что компьютер можно использовать для любых задач, которые считаются более важными без проблем.

18 голосов
/ 11 апреля 2011

Недавно я написал обзор методов песочницы в Linux .Я думаю, что ваш самый простой подход - использовать контейнеры Linux (lxc), если вы не возражаете против разветвления и т. Д., Которые не имеют большого значения в этой среде.Вы можете предоставить процессу доступную только для чтения корневую файловую систему, изолированное петлевое сетевое соединение, и вы все равно можете легко его отключить и установить ограничения памяти и т. Д.

Seccomp будет немного сложным, так как код не можетдаже выделить память.

Selinux - другой вариант, но я думаю, что это может быть больше работы, чем контейнер.

6 голосов
/ 19 мая 2013

Вы можете использовать Qemu для быстрого тестирования заданий. Эта процедура ниже занимает менее 5 секунд на моем 5-летнем ноутбуке.

Давайте предположим, что студент должен разработать программу, в которой используются целые числа без знака, каждая на своей строке, пока не появится строка с «-1». Затем программа должна усреднить все значения и вывести «Среднее:% f». Вот как вы можете протестировать программу полностью изолированной:

  1. Во-первых, получите root.bin из Jslinux, мы будем использовать его в качестве пользовательского пространства (у него есть tcc-компилятор):

    wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin

  2. Мы хотим поместить представление студента в root.bin, поэтому настройте устройство цикла:

    sudo losetup /dev/loop0 root.bin

    (вы также можете использовать fuseext2 для этого, но он не очень стабилен. Если он стабилизируется, вам не нужен root для всего этого)

  3. Сделать пустой каталог:

    mkdir mountpoint

  4. Крепление root.bin:

    sudo mount /dev/loop0 mountpoint

  5. Введите смонтированную файловую систему:

    cd mountpoint.

  6. Права на исправление:

    sudo chown -R `whoami` .

  7. mkdir -p etc/init.d
  8. vi etc/init.d

    #!/bin/sh
    cd /root
    echo READY 2>&1 > /dev/ttyS0
    tcc assignment.c 2>&1 > /dev/ttyS0
    ./a.out 2>&1 > /dev/ttyS0
    
  9. chmod +x etc/init.d/rcS

  10. Скопировать отправку на виртуальную машину:

    cp ~/student_assignment.c root/assignment.c

  11. Выход из корневой виртуальной машины FS:

    cd ..

  12. sudo umount mountpoint
  13. Теперь изображение готово, нам просто нужно запустить его. Он скомпилирует и запустит отправку после загрузки.
  14. mkfifo /tmp/guest_output
  15. Открыть отдельный терминал и начать прослушивание гостевого выхода:

    dd if=/tmp/guest_output bs=1

  16. В другом терминале:

    qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput (Я только что использовал ядро ​​Ubuntu, но многие ядра будут работать)

  17. Когда гостевой вывод показывает «ГОТОВ», вы можете отправлять ключи на ВМ из приглашения qemu. Например, чтобы проверить это назначение, вы можете сделать

    (qemu) sendkey 1
    (qemu) sendkey 4
    (qemu) sendkey ret
    (qemu) sendkey 1
    (qemu) sendkey 0
    (qemu) sendkey ret
    (qemu) sendkey minus
    (qemu) sendkey 1
    (qemu) sendkey ret
    
  18. Теперь Average = 12.000000 должно появиться на гостевом выходном канале. Если этого не произойдет, студент потерпел неудачу.

  19. Выйти из QEMU: quit

Программа для прохождения теста находится здесь: https://stackoverflow.com/a/14424295/309483. Просто используйте tcclib.h вместо stdio.h.

5 голосов
/ 10 декабря 2010

Попробуйте Пользовательский режим Linux . При выполнении задач, интенсивно использующих ЦП, производительность возрастает примерно на 1%, но для заданий с интенсивным вводом-выводом она может быть в 6 раз медленнее.

3 голосов
/ 23 июня 2016

seccomp и seccomp-bpf выполняют это с наименьшими усилиями: https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt

3 голосов
/ 31 декабря 2010

Когда речь идет о sanboxing на основе проверки ptrace (strace):

" sydbox " песочница и библиотека программирования " pinktrace " (это C99, нонасколько я знаю, есть привязки к python и ruby.

Собранные ссылки, связанные с темой:

http://www.diigo.com/user/wierzowiecki/sydbox

(извините, что не прямые ссылки, но очков репутации пока недостаточно)

3 голосов
/ 23 ноября 2010

Запуск его на виртуальной машине должен предложить вам всю необходимую безопасность и ограничения.

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

2 голосов
/ 19 января 2017

Firejail является одним из наиболее полных инструментов для этого - он поддерживает seccomp, контейнеры файловой системы, возможности и многое другое:

https://firejail.wordpress.com/features-3/

1 голос
/ 05 марта 2018

Это также кажется многообещающим. Песочница файловой системы для Linux с использованием перехватов syscall.

https://github.com/adtac/fssb

1 голос
/ 22 ноября 2010

Эта библиотека должна хорошо служить вашей цели

http://sandbox.sourceforge.net

Удачи!

...