Uruchom niezaufany program C w piaskownicy w Linuksie, który zapobiega otwieraniu plików, rozwidlaniu itp.?
Zastanawiałem się, czy istnieje sposób na uruchomienie niezaufanego programu C pod sandboxem w Linuksie. Coś, co uniemożliwiłoby programowi otwieranie plików, połączeń sieciowych, rozwidlania, exec itp.?
Byłby to mały program, zadanie domowe, który jest przesyłany na serwer i ma wykonywane testy jednostkowe. Więc program byłby krótkotrwały.
11 answers
Użyłem Systrace do sandboxa niezaufanych programów zarówno interaktywnie, jak i w trybie automatycznym. Posiada ptrace()
-oparty backend, który pozwala na jego użycie w systemie Linux bez specjalnych uprawnień, a także znacznie szybszy i bardziej wydajny backend, który wymaga łatania jądra.
Możliwe jest również utworzenie piaskownicy na systemach uniksopodobnych za pomocą chroot(1)
, chociaż nie jest to tak łatwe i bezpieczne. kontenery Linuksa i FreeBSD więzienia są lepszą alternatywą dla chroot. Inną alternatywą dla Linuksa jest użycie frameworka bezpieczeństwa, takiego jak SELinux lub AppArmor , co chciałbym zaproponować dla systemów produkcyjnych.
EDIT:
Systrace sprawdziłoby się w Twoim przypadku, ale myślę, że coś opartego na modelu bezpieczeństwa Linuksa Jak AppArmor czy SELinux jest bardziej standardowa, a więc preferowana, alternatywna, w zależności od twojej dystrybucji.
Edytuj 2:
While chroot(1)
jest dostępny na większości(wszystkich?) Systemów uniksopodobnych, ma sporo problemów:
Można go wyrwać. Jeśli zamierzasz skompilować lub uruchomić niezaufane Programy C w swoim systemie, jesteś szczególnie podatny na ten problem. A jeśli Twoi uczniowie są jak moi, ktoś spróbuje wyrwać się z Więzienie.
Musisz stworzyć w pełni niezależną hierarchię systemu plików ze wszystkim, co jest niezbędne do twojego zadania. Nie musisz mieć kompilatora w chroot, ale wszystko, co jest wymagane do uruchomienia skompilowanych programów powinno być zawarte. Chociaż istnieją narzędzia, które pomagają w tym, nadal nie jest to trywialne.
Musisz utrzymać chroot. Ponieważ jest niezależny, pliki chroot nie będą aktualizowane wraz z dystrybucją. Będziesz miał aby albo regularnie odtwarzać chroot, albo dołączać do niego niezbędne narzędzia aktualizacji, co zasadniczo wymagałoby, aby była to pełna dystrybucja Linuksa. Będziesz również musiał synchronizować dane systemu i Użytkownika (hasła, pliki wejściowe itp.) z systemem hosta.
chroot()
chroni tylko system plików. Nie przeszkadza to złośliwemu programowi w otwieraniu gniazd sieciowych ani źle napisanemu w zasysaniu każdego dostępnego zasobu.
The problem wykorzystania zasobów jest powszechny wśród wszystkich alternatyw. parytety systemu plików zapobiegną zapełnieniu dysku przez programy. Właściwe ulimit
(setrlimit()
W C) ustawienia mogą chronić przed nadużywaniem pamięci i wszelkich fork bomb, a także położyć kres wieprz CPU. nice(1)
Może obniżyć priorytet tych programów, dzięki czemu komputer może być używany do wszelkich zadań, które są uważane za ważniejsze bez problemu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 23:39:54
Ostatnio napisałem przegląd technik sandboxingu w Linuksie. Myślę, że najprostszym podejściem byłoby użycie kontenerów Linuksa (lxc), jeśli nie masz nic przeciwko rozwidlaniu itp., co tak naprawdę nie ma znaczenia w tym środowisku. Możesz dać procesowi rootowy system plików tylko do odczytu, izolowane połączenie sieciowe loopback i nadal możesz go łatwo zabić i ustawić limity pamięci itp.
Seccomp będzie trochę trudny, ponieważ kod nie może nawet przydzielić pamięć.
Selinux jest inną opcją, ale myślę, że może to być więcej pracy niż kontener.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 16:33:15
Możesz użyć Qemu do szybkiego testowania zadań. Ta procedura trwa mniej niż 5 sekund na moim 5-letnim laptopie.
Załóżmy, że uczeń musi opracować program, który zajmie niepodpisane wejścia, każdy na własnej linii, dopóki nie pojawi się linia z "-1". Program powinien następnie uśrednić wszystkie wejścia i wyjść "Average: % f". Oto jak można przetestować program całkowicie odizolowany:
-
Najpierw pobierz
root.bin
z Jslinux, użyjemy go jako userland (ma tcc C-kompilator):wget https://github.com/levskaya/jslinux-deobfuscated/raw/master/root.bin
-
Chcemy umieścić zgłoszenie ucznia w
root.bin
, więc skonfiguruj urządzenie pętli:sudo losetup /dev/loop0 root.bin
(do tego też możesz użyć fuseext2, ale nie jest zbyt stabilny. Jeśli się ustabilizuje, nie będziesz potrzebował do tego roota) {]}
-
Stwórz pusty katalog:
mkdir mountpoint
-
root.bin
:sudo mount /dev/loop0 mountpoint
-
Enter the mounted system plików:
cd mountpoint
. -
Prawa naprawcze:
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
-
Skopiuj zgłoszenie do VM:
cp ~/student_assignment.c root/assignment.c
-
Nie jest to jednak możliwe.]}
cd ..
sudo umount mountpoint
- teraz obraz jest gotowy, musimy go tylko uruchomić. Skompiluje i uruchomi zgłoszenie po booting.
mkfifo /tmp/guest_output
-
Otwórz oddzielny terminal i zacznij nasłuchiwać wyjścia gościa:
dd if=/tmp/guest_output bs=1
-
W innym terminalu:
qemu-system-i386 -kernel vmlinuz-3.5.0-27-generic -initrd root.bin -monitor stdio -nographic -serial pipe:/tmp/guestoutput
(Właśnie użyłem jądra Ubuntu tutaj, ale wiele jąder będzie działać) -
Gdy wyjście gościa pokazuje "READY", możesz wysyłać Klucze do maszyny Wirtualnej z monitu qemu. Na przykład, aby przetestować to zadanie, możesz wykonać
(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
Teraz
Average = 12.000000
powinien pojawić się na gościu rura wyjściowa. Jeśli nie, uczeń oblał.- Quit qemu:
quit
Program zdający test jest tutaj: https://stackoverflow.com/a/14424295/309483. wystarczy użyć tcclib.h
zamiast stdio.h
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:17
Spróbuj User-mode Linux . Ma około 1% narzutu wydajności dla zadań wymagających dużej wydajności procesora, ale może być 6 razy wolniejszy Dla zadań wymagających dużej wydajności We/Wy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-10 18:59:21
Uruchomienie go wewnątrz maszyny wirtualnej powinno zapewnić Ci wszystkie zabezpieczenia i ograniczenia, które chcesz.
QEMU byłoby do tego odpowiednie i cała praca (pobieranie aplikacji, aktualizowanie obrazu dysku, uruchamianie QEMU, uruchamianie aplikacji w środku i zapisywanie danych wyjściowych do późniejszego pobrania) mogłaby być skryptowana do automatycznego uruchamiania testów.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-22 21:15:33
Gdy chodzi o sanboxing na podstawie ptrace (strace):
"sydbox " Sandbox i "pinktrace" biblioteka programowania ( to C99, ale są powiązania z Pythonem i Rubim, o ile wiem).
Zebrane linki związane z tematem:
Http://www.diigo.com/user/wierzowiecki/sydbox
(sorry, że nie linki bezpośrednie, ale za mało punktów reputacji jeszcze)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-31 00:27:44
Seccomp i seccomp-bpf wykonują to przy najmniejszym wysiłku: https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 20:35:00
Firejail jest jednym z najbardziej wszechstronnych narzędzi do tego celu-obsługuje seccomp, kontenery systemu plików, możliwości i wiele innych:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 23:40:31
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-22 18:52:14
To również wydaje się obiecujące. Sandbox systemu plików dla Linuksa z wykorzystaniem syscall.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 12:24:35
Ok dzięki wszystkim odpowiedziom bardzo mi pomogły. Ale nie sugerowałbym żadnego z nich jako rozwiązania dla osoby, która zadała pierwotne pytanie. Wszystkie wymienione narzędzia wymagają dużo pracy w celu przetestowania kodu uczniów jako nauczyciela, nauczyciela, profesora. najlepszym sposobem w tym przypadku byłby moim zdaniem virtualbox. Ok, its emuluje kompletny system x68 i nie ma nic wspólnego ze znaczeniem sandboxingu w ten sposób, ale jeśli wyobrażam sobie mojego nauczyciela programowania, byłoby to najlepsze dla niego. Więc "apt-get install virtualbox" w systemach opartych na Debianie, wszystkie inne kierują się do http://virtualbox.org / , Utwórz maszynę wirtualną, dodaj iso, kliknij Zainstaluj, poczekaj trochę czasu i miej szczęście. Będzie to znacznie łatwiejsze w użyciu, jak skonfigurowanie trybu użytkownika-Linuksa lub robienie ciężkich rzeczy strace...
A jeśli masz obawy, że Twoi uczniowie Cię hakują, to chyba masz problem z autorytetem i rozwiązaniem na to byłoby zastraszenie im, że pozwiesz ich do sądu, jeśli udowodnisz tylko jeden kęs maleware w pracy, którą ci dają...
Również jeśli jest klasa i 1% z niej jest tak dobre, jak mógłby robić takie rzeczy, nie zanudzaj ich tak prostymi zadaniami i daj im jakieś duże, gdzie muszą jeszcze trochę kodować. Uczenie się integracyjne jest najlepsze dla wszystkich, więc nie przekazuj na starych blokach...
I dlatego nigdy nie używaj tego samego komputera do ważnych rzeczy( jak pisanie zaświadczeń i egzaminów), których używasz do przeglądania Internetu i testowanie oprogramowania.
Używaj komputera off-line do ważnych rzeczy i komputera on-line do wszystkich innych rzeczy.
Jednak dla wszystkich innych, którzy nie są paranoicznymi nauczycielami (nie chcę nikogo obrażać, jestem tylko opinią, że powinieneś nauczyć się podstaw bezpieczeństwa i naszego społeczeństwa, zanim zaczniesz być nauczycielem programistów...)
... na czym skończyłem ?.. dla wszystkich innych:
Happy hacking !!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 21:55:25