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.

 104
Author: Community, 2010-11-22

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.

Bylibyśmy w stanie pomóc ci bardziej, gdybyś powiedział, co dokładnie chcesz zrobić.

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.

 44
Author: thkala,
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.

 15
Author: Justin Cormack,
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:

  1. 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

  2. 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) {]}

  3. Stwórz pusty katalog:

    mkdir mountpoint

  4. root.bin:

    sudo mount /dev/loop0 mountpoint

  5. Enter the mounted system plików:

    cd mountpoint.

  6. Prawa naprawcze:

    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. Skopiuj zgłoszenie do VM:

    cp ~/student_assignment.c root/assignment.c

  11. Nie jest to jednak możliwe.]}

    cd ..

  12. sudo umount mountpoint
  13. teraz obraz jest gotowy, musimy go tylko uruchomić. Skompiluje i uruchomi zgłoszenie po booting.
  14. mkfifo /tmp/guest_output
  15. Otwórz oddzielny terminal i zacznij nasłuchiwać wyjścia gościa:

    dd if=/tmp/guest_output bs=1

  16. 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ć)

  17. 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
    
  18. Teraz Average = 12.000000 powinien pojawić się na gościu rura wyjściowa. Jeśli nie, uczeń oblał.

  19. Quit qemu: quit

Program zdający test jest tutaj: https://stackoverflow.com/a/14424295/309483. wystarczy użyć tcclib.h zamiast stdio.h.

 6
Author: Janus Troelsen,
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.

 5
Author: pts,
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.

 3
Author: Laurent Parenteau,
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)

 3
Author: Grzegorz Wierzowiecki,
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

 3
Author: cptaffe,
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:

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

 2
Author: Federico,
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

Ta biblioteka powinna dobrze służyć Twojemu celowi

Http://sandbox.sourceforge.net

Powodzenia!

 1
Author: thoaionline,
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.

Https://github.com/adtac/fssb

 1
Author: mauron85,
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 !!

 -1
Author: rohySeentrusted,
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