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


110

Мені було цікаво, чи існує спосіб запустити ненадійну програму C під пісочницю в Linux. Щось, що заважає програмі відкривати файли, мережеві з'єднання, або розщеплювати, виконувати і т.д.?

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


Це як одна програма C, яку потрібно запускати 1 раз за 5 хвилин, чи щось потрібно постійно запускати?
bwawok

Це буде невелика програма, яка завантажується і на ній виконуються одиничні тести. Таким чином, програма була б нетривалою.
Френк

Який розподіл використовує система? У деяких дистрибутивах є готові інструменти для пісочниць. Чи увімкнено у вашій системі будь-яку модель безпеки на зразок SELinux чи AppArmor?
thkala

Я використовую Fedora 13. Я вивчаю політику SELinux Sandbox. Мені цікаво, які ще варіанти існують.
Френк

6
Подібні Qs на Пісочниця / садить в тюрму процесів в Linux або Unix: * unix.stackexchange.com/q/6433/4319 * stackoverflow.com/q/3859710/94687 * stackoverflow.com/q/4410447/94687 * stackoverflow.com/q / 1019707/94687
імз - Іван Захарящев

Відповіді:


47

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

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

Ми могли б допомогти вам більше, якби ви сказали, як саме це ви хочете зробити.

Редагувати:

Systrace буде працювати для вашого випадку, але я вважаю, що щось, що базується на моделі безпеки Linux, наприклад, AppArmor або SELinux, є більш стандартною і, таким чином, бажаною альтернативою, залежно від вашого розповсюдження.

EDIT 2:

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

  • Це може бути вибито з. Якщо ви збираєтеся насправді компілювати або запускати недовірені програми на вашій системі, ви особливо вразливі до цього питання. І якщо ваші студенти чимось схожі на моїх, хтось спробує вирватися із в'язниці.

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

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

  • chroot()захищає лише файлову систему. Це не заважає шкідливій програмі відкривати мережеві сокети або погано написаній програмі висмоктувати кожен доступний ресурс.

Проблема використання ресурсів поширена серед усіх альтернатив. Квоти файлової системи не дозволять програмам заповнити диск. Правильні налаштування ulimit( setrlimit()в С) можуть захищати від надмірного використання пам’яті та будь-яких бомб на вилки, а також зупиняти процесори. nice(1)можна знизити пріоритет цих програм, щоб комп'ютер можна було використовувати для будь-яких завдань, які вважаються важливішими без проблем.


systrace працював для мене для простих, програм, але застряг нескінченно, коли GNU як (1) під керівництвом GCC. Тому я відмовився від цього. Це нефіксована помилка у systrace: forum.soft32.com/linux/…
пт

Чи є спосіб забезпечити, щоб спільна пам’ять, черги повідомлень і семафори не поділялися між процесами з пісочним сценарієм?
daveagp

1
Системна ланка розірвана.
Collin

2
Що з Firejail? Вам більше не потрібно підтримувати fs, використовуючи його.
м3нда

18

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

Seccomp буде трохи складним, оскільки код навіть не може виділити пам'ять.

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


6

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

Припустимо, студент повинен розробити програму, яка приймає неподписані вставки, кожен по своєму рядку, доки не з’явиться рядок з "-1". Потім програма повинна середньо середньо входити та виводити "Середнє:% f". Ось як можна випробувати програму повністю ізольованою:

  1. По-перше, root.binдістаньтеся від Jslinux, і ми використовуватимемо це як userland (у ньому є компілятор tcc C):

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

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

    sudo losetup /dev/loop0 root.bin

    (ви можете використовувати fuseext2 і для цього, але він не дуже стабільний. Якщо він стабілізується, вам не знадобиться корінь для цього)

  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 VM:

    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

Спробуйте Linux в режимі користувача . Він має близько 1% накладних витрат на робочі місця, що вимагають процесора, але це може бути в 6 разів повільніше для інтенсивно працюючих вводу-виводу.


4

Firejail - це один із найповніших інструментів для цього - він підтримує seccomp, контейнери файлової системи, можливості та багато іншого:

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


Ця відповідь є відмінною, вона дійсно заслуговує на більшу суму, враховуючи, що firejail активно ведеться з великою документацією, охоплює більшість, якщо не всі інші відповіді, і розроблений таким, що є досить простим у використанні.
Джефф Хайкін

3

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

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


2
Я не знаю про ОП, але запуск ВМ за тестовою програмою було б неприйнятним у багатьох випадках. У моєму середовищі (я - TA) може бути близько 200 студентів, які подають 10-12 програм кожний протягом 2-годинного періоду. Жодна програма не працює за процесором більше 10 секунд, але коли зібрання подається, ми отримуємо час повороту 15 хв і більше. Введення VM для кожної програми призведе до того, що час процесора складе 60 сек і більше за програму, і я взагалі не хочу думати про час повороту. Можливо, VM за сеанс, але жодним чином ми не могли це зробити за програмою ...
thkala

@thkala Це хороший момент. Мені подобається ідея QEMU, але запускати VM для кожного подання - це не добре.
Френк

Ну, і в такому випадку постійно підтримуйте той самий VM.
Лоран Паренто

Не могли б ви зробити щось за допомогою знімка vm, який завантажений і готовий до компіляції та запуску коду? FYI, vm's не обов'язково імунізовані до пірсингу. Ви також можете побудувати апаратну версію цього - невелику систему, яка завантажує резюме зображення з медіа-читання або через мережу та забезпечує вихід через мережу або серіал, а потім перезавантажується для наступного. Забезпечено швидке вдосконалення завантаження, яке за лічені секунди піднімає Linux.
Кріс Страттон

@thkala: Це означає, що вам потрібно буде менше 3 секунд за кожну подачу, якщо ви будете проводити їх послідовно. Підхід, який я розмістив, мабуть, займає близько 3 секунд на сучасній машині (серійно). Якщо паралелізувати (що ви також можете), це буде досить швидко.
Янус Троельсен

3

Коли мова йде про sanboxing на основі виїзду з ptrace (strace):

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

Зібрані посилання, пов'язані з темою:

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

(вибачте, що не прямі посилання, але ще недостатньо репутаційних балів)



1

Ця бібліотека повинна добре відповідати вашим цілям

http://sandbox.sourceforge.net

Удачі!


8
Здається, це не підтримується активно. Також, здається, потрібен патч ядра Linux, що зробило б його здебільшого марним, враховуючи, що його остання версія починається з 2003 року.
thkala


-1

ок, дякую за всі відповіді, вони мені дуже допомогли. Але я б не запропонував жоден з них як рішення для людини, яка задала оригінальне запитання. Всі згадані інструменти потребують великої роботи для того, щоб перевірити код учнів як викладача, репетитора, проф. Найкращим способом у цьому випадку був би, на мій погляд, virtualbox. Гаразд, його емуляція повноцінної системи x68 і не має нічого спільного зі значенням пісочниці таким чином, але якщо я уявляю свого вчителя програмування, це було б найкраще для нього. Тож "apt-get install virtualbox" на системах на базі debian, всі інші переходять на http://virtualbox.org/ перейдіть , створіть vm, додайте iso, натисніть встановити, почекайте деякий час і пощастить. Це буде набагато простіше використовувати, як налаштувати користувальницький режим-linux або зробити якісь важкі страйкові речі ...

І якщо у вас є побоювання щодо того, що ваші студенти зламуть вас, я думаю, у вас є проблема з авторитетом, і рішення цього могло б загрожувати їм, що ви будете подавати до суду на живі денні світила, якщо ви зможете довести лише один укус зловмисного програмного забезпечення в роботі, яку вони дають ти...

Крім того, якщо є клас, і 1% його настільки хороший, як він міг би робити такі речі, не обтяжуйте їх такими простими завданнями і не дайте їм великих, де їм доведеться ще кодувати. Інтегративне навчання найкраще для всіх, тому не переймайтесь старими тупиковими структурами ...

І з цього приводу ніколи не використовуйте той самий комп’ютер для важливих речей (наприклад, для написання атестатів та іспитів), які ви використовуєте для таких речей, як перегляд Інтернету та тестування програмного забезпечення.

Використовуйте автономний комп'ютер для важливих речей, а он-лайн-комп’ютер - для всіх інших речей.

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

... де я був ... для всіх інших:

щасливий злом !!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.