Запустите ненадежную программу C в песочнице в Linux, которая предотвращает ее открытие файлов, разворачивание и т.д.?

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

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

Ответ 1

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

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

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

EDIT:

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

ИЗМЕНИТЬ 2:

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Предположим, что учащийся должен разработать программу, которая принимает неподписанные ints, каждый в своей собственной строке, до тех пор, пока не появится строка с "-1". Затем программа должна усреднить все int и вывести "Average:% 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

  • Mount root.bin:

    sudo mount /dev/loop0 mountpoint

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

    cd mountpoint.

  • Исправить права:

    sudo chown -R `whoami` .

  • mkdir -p etc/init.d
  • 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
    
  • chmod +x etc/init.d/rcS

  • Скопировать представление на виртуальную машину:

    cp ~/student_assignment.c root/assignment.c

  • Выход из корня VM 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. Например, чтобы проверить это назначение, вы можете сделать

    (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
    
  • Теперь Average = 12.000000 должен появиться на выходном канале гостя. Если это не так, студент потерпел неудачу.

  • Quit qemu: quit

Программа, проходящая тест, находится здесь: fooobar.com/questions/60255/.... Просто используйте tcclib.h вместо stdio.h.

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

Ответ 8

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

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

Ответ 10

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

https://github.com/adtac/fssb

Ответ 11

ok благодаря всем ответам, которые они мне очень помогли. Но я бы не предложил ни одного из них в качестве решения для человека, который задал первоначальный вопрос. Все упомянутые инструменты требуют много работы для тестирования студенческого кода как учителя, преподавателя, профессора. Лучший способ в этом случае - это, на мой взгляд, виртуальный бокс. Хорошо, он эмулирует полную x68-систему и не имеет никакого отношения к значению песочницы таким образом, но если я представляю своего учителя программирования, это будет для него лучше. Таким образом, "apt-get install virtualbox" в дебианских системах, все остальные переходят к http://virtualbox.org/, создают vm, добавляют iso, click установить, подождать некоторое время и повезти. Это будет намного проще в использовании, чтобы настроить пользовательский режим-linux или сделать некоторые тяжелые вещи...

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

Кроме того, если есть класс, и 1% от него так же хорош, как он мог бы делать такие вещи, не утомляйте их такими простыми задачами и дайте им некоторые большие, где они должны закодировать еще кое-что. Интегративное обучение лучше для всех, поэтому не ретранслируйте старые тупиковые структуры...

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

Используйте автономный компьютер для важных задач и онлайн-компьютера для всех остальных.

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

... где был i... для всех остальных:

счастливый взлом!!