Мне было интересно, существует ли способ запустить ненадежную программу C в песочнице в Linux. Что-то, что могло бы помешать программе открывать файлы, сетевые соединения, разветвлять, выполнять и т. Д.?
Это будет небольшая программа, домашнее задание, которое загружается на сервер и на нем выполняются модульные тесты. Так что программа будет недолгой.
Ответы:
Я использовал Systrace для изолирования ненадежных программ как в интерактивном, так и в автоматическом режиме. Он имеет
ptrace()
серверную часть на основе, которая позволяет использовать ее в системе Linux без особых привилегий, а также гораздо более быструю и мощную бэкэнд, которая требует исправления ядра.Также можно создать песочницу в Unix-подобных системах, используя
chroot(1)
, хотя это не так просто и безопасно. Контейнеры Linux и тюрьмы FreeBSD - лучшая альтернатива chroot. Другой альтернативой в Linux является использование инфраструктуры безопасности, такой как SELinux или AppArmor , что я бы предложил для производственных систем.Мы могли бы помочь вам больше, если бы вы сказали, что именно вы хотите делать.
РЕДАКТИРОВАТЬ:
Systrace подойдет для вашего случая, но я думаю, что что-то, основанное на модели безопасности Linux, например AppArmor или SELinux, является более стандартной и, следовательно, предпочтительной альтернативой в зависимости от вашего дистрибутива.
РЕДАКТИРОВАТЬ 2:
Хотя
chroot(1)
он доступен в большинстве (всех?) Unix-подобных системах, он имеет ряд проблем:Его можно вырвать. Если вы действительно собираетесь компилировать или запускать ненадежные программы на C в своей системе, вы особенно уязвимы для этой проблемы. И если ваши ученики чем-то похожи на моих, кто-нибудь БУДЕТ пытаться вырваться из тюрьмы.
Вы должны создать полную независимую иерархию файловой системы со всем необходимым для вашей задачи. Вам не обязательно иметь компилятор в chroot, но все, что требуется для запуска скомпилированных программ, должно быть включено. Хотя есть утилиты, которые помогают в этом, это все же нетривиально.
Вы должны поддерживать chroot. Поскольку он независим, файлы chroot не будут обновляться вместе с вашим дистрибутивом. Вам придется либо регулярно воссоздавать chroot, либо включать в него необходимые инструменты обновления, для чего по существу потребуется, чтобы это был полноценный дистрибутив Linux. Вам также необходимо синхронизировать системные и пользовательские данные (пароли, входные файлы и т. Д.) С хост-системой.
chroot()
защищает только файловую систему. Это не мешает вредоносной программе открывать сетевые сокеты или плохо написанной программе поглощать все доступные ресурсы.Проблема использования ресурсов является общей для всех альтернатив. Квоты файловой системы не позволят программам заполнить диск. Правильные
ulimit
(setrlimit()
в C) настройки могут защитить от чрезмерного использования памяти и любых «бомб вилки», а также положить конец «перегрузке» ЦП.nice(1)
может снизить приоритет этих программ, чтобы компьютер можно было без проблем использовать для любых задач, которые считаются более важными.источник
Недавно я написал обзор методов песочницы в Linux . Я думаю, что ваш самый простой подход - использовать контейнеры Linux (lxc), если вы не возражаете против разветвления и т. Д., Что на самом деле не имеет значения в этой среде. Вы можете предоставить процессу корневую файловую систему только для чтения, изолированное сетевое соединение с обратной связью, и вы все равно можете легко убить его, установить ограничения памяти и т. Д.
Seccomp будет немного сложнее, так как код не может даже выделить память.
Selinux - другой вариант, но я думаю, что это может быть больше работы, чем контейнер.
источник
Вы можете использовать Qemu для быстрой проверки заданий. Эта процедура ниже занимает менее 5 секунд на моем ноутбуке 5-летней давности.
Предположим, что ученику нужно разработать программу, которая принимает беззнаковые целые числа, каждая в отдельной строке, пока не появится строка с «-1». Затем программа должна усреднить все целые числа и вывести «Среднее:% f». Вот как можно полностью изолировать программу:
Во-первых, возьмите
root.bin
из Jslinux, мы будем использовать его как пользовательскую среду (у него есть C-компилятор tcc):wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin
Мы хотим поместить представление студента
root.bin
, поэтому настройте устройство цикла:sudo losetup /dev/loop0 root.bin
(вы также можете использовать fuseext2 для этого, но он не очень стабилен. Если он стабилизируется, вам не понадобится root для всего этого)
Сделайте пустой каталог:
mkdir mountpoint
Крепление
root.bin
:sudo mount /dev/loop0 mountpoint
Войдите в смонтированную файловую систему:
cd mountpoint
.Исправить права:
sudo chown -R `whoami` .
mkdir -p etc/init.d
vi etc/init.d
:chmod +x etc/init.d/rcS
Скопируйте отправку в виртуальную машину:
cp ~/student_assignment.c root/assignment.c
Выйдите из корневой FS ВМ:
cd ..
sudo umount mountpoint
mkfifo /tmp/guest_output
Откройте отдельный терминал и начните прослушивать гостевой вывод:
dd if=/tmp/guest_output bs=1
В другом терминале:
qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
(Я использовал здесь только ядро Ubuntu, но многие ядра будут работать)Когда выходные данные гостя показывают «READY», вы можете отправить ключи виртуальной машине из командной строки qemu. Например, чтобы проверить это задание, вы можете сделать
Теперь
Average = 12.000000
должен появиться на гостевом выходном канале. В противном случае ученик проиграл.quit
Программа, прошедшая тест, находится здесь: https://stackoverflow.com/a/14424295/309483 . Просто используйте
tcclib.h
вместоstdio.h
.источник
Попробуйте Linux в пользовательском режиме . При этом накладные расходы на производительность составляют около 1% для задач с интенсивным использованием ЦП, но могут быть в 6 раз медленнее для задач с интенсивным вводом-выводом.
источник
Firejail - один из наиболее полных инструментов для этого - он поддерживает seccomp, контейнеры файловой системы, возможности и многое другое:
https://firejail.wordpress.com/features-3/
источник
Запуск его внутри виртуальной машины должен предложить вам все необходимые ограничения и безопасность.
QEMU хорошо подходит для этого, и вся работа (загрузка приложения, обновление образа диска, запуск QEMU, запуск приложения внутри него и сохранение вывода для последующего извлечения) могут быть написаны для автоматизированных запусков тестов.
источник
Когда речь идет о sanboxing на основе проверки ptrace (strace):
« Sydbox » песочница и « pinktrace » программирование библиотеки (это C99 , но есть привязка к питона и рубиновый, насколько я знаю).
Собраны ссылки по теме:
http://www.diigo.com/user/wierzowiecki/sydbox
(извините, что не прямые ссылки, но пока недостаточно очков репутации)
источник
seccomp и seccomp-bpf достигают этого с наименьшими усилиями: https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
источник
Эта библиотека должна хорошо служить вашей цели
http://sandbox.sourceforge.net
Удачи!
источник
Это тоже кажется многообещающим. Песочница файловой системы для Linux, использующая перехват системных вызовов.
https://github.com/adtac/fssb
источник
хорошо, спасибо за все ответы, они мне очень помогли. Но я бы не предложил ни один из них в качестве решения для человека, задавшего исходный вопрос. Все упомянутые инструменты требуют большой работы для проверки кода студентов в качестве преподавателя, репетитора, проф. На мой взгляд, лучшим выходом в этом случае будет виртуальный бокс. Хорошо, он имитирует полную x68-систему и не имеет ничего общего с понятием «песочница» таким образом, но если я представляю себе моего учителя программирования, это было бы для него лучше всего. Итак, "apt-get install virtualbox" в системах на базе debian, все остальные переходят на http://virtualbox.org/ , создают виртуальную машину, добавляют iso, нажимают "установить", подождите некоторое время и пусть вам повезет. Будет намного проще использовать для настройки пользовательского режима linux или выполнения каких-то тяжелых вещей strace ...
И если у вас есть опасения, что ваши ученики взломают вас, я думаю, у вас есть проблема с авторитетом, и решение для этого будет угрожать им тем, что вы подадите в суд на них, если вы сможете доказать хотя бы один укус вредоносного ПО в работе, которую они дают ты...
Также, если есть класс, и 1% его настолько хорош, насколько он мог бы делать такие вещи, не утомляйте их такими простыми задачами и давайте им несколько больших, где им придется еще написать код. Интегративное обучение лучше всего подходит для всех, поэтому не полагайтесь на старые тупиковые структуры ...
И, конечно же, никогда не используйте один и тот же компьютер для важных вещей (таких как написание аттестатов и экзаменов), которые вы используете для таких вещей, как просмотр веб-страниц и тестирование программного обеспечения.
Используйте автономный компьютер для важных дел и онлайн-компьютер для всего остального.
Однако всем остальным, кто не является параноидальным учителем (не хочу никого обидеть, я просто считаю, что вам следует изучить основы безопасности и нашего общества, прежде чем вы начнете быть учителем программистов ...)
... где я был ... для всех остальных:
удачного взлома !!
источник