Sandboxing w Linuksie

Chcę stworzyć aplikację internetową, która pozwoli użytkownikowi wgrać jakiś kod C i zobaczyć wyniki jego wykonania (kod zostanie skompilowany na serwerze). Użytkownicy są niezaufani, co oczywiście ma ogromne konsekwencje dla bezpieczeństwa.

Więc muszę stworzyć jakiś sandbox dla aplikacji. Na najbardziej podstawowym poziomie chciałbym ograniczyć dostęp do systemu plików do określonych katalogów. Nie mogę bezpośrednio używać chroot, ponieważ aplikacja internetowa nie działa jako uprzywilejowana użytkownik. Domyślam się, że można użyć pliku wykonywalnego suid, który ustawia Więzienie.

Załadowane programy byłyby raczej małe, więc powinny działać szybko (najwyżej kilka sekund). W związku z tym mogę zabić proces po określonym czasie, ale w jaki sposób mogę się upewnić, że nie pojawią się nowe procesy? A jeśli nie, to czy zabicie całego pgid to niezawodna metoda?

Jaki byłby najlepszy sposób na to-inny niż "nie rób tego w ogóle"? :) Jakie inne rażące problemy z bezpieczeństwem spudłowałem?

FWIW, aplikacja internetowa zostanie napisana w Pythonie.

Author: imz -- Ivan Zakharyaschev, 2009-06-19

12 answers

Wraz z innymi sugestiami może okazać się to przydatne.

Http://www.eelis.net/geordi/

To jest z http://codepad.org/about, codepad.org 's about page.

 5
Author: Sweeney,
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-03-08 06:23:37

Kilka szczegółów, które podajesz, sugeruje, że masz kontrolę administracyjną nad samym serwerem, więc moja sugestia zakłada takie założenie.

Potraktowałbym to jako system wsadowy. Serwer WWW akceptuje Przesyłanie pliku źródłowego, proces sprawdza katalog przesłanych plików, przetwarza plik, a następnie przesyła wynik do innego katalogu, który aplikacja internetowa bada, aż znajdzie wynik i wyświetli go.

Zabawa polega na tym, jak bezpiecznie radzić sobie z egzekucja.

Mój system operacyjny to FreeBSD, więc skonfigurowałbym wstępnie skonfigurowany jail (nie mylić z Vanilla chroot jail), który kompilowałby, uruchamiał i zapisywał wyjście. Następnie, dla każdego przesłanego pliku źródłowego, Uruchom nieskazitelną kopię więzienia dla każdego wykonania, z kopią pliku źródłowego w środku.

Pod warunkiem, że więzienie /dev jest przycięte prawie do niczego, limity zasobów systemowych są ustawione bezpiecznie, a ruch nie może prowadzić z więzienia (związany z nieroutable adres lub po prostu Firewall), osobiście byłbym wygodny uruchamiając to na serwerze pod moją opieką.

Ponieważ używasz Linuksa, zbadałbym tryb użytkownika Linux lub Linux-VServer, które są bardzo podobne w koncepcji do FreeBSD (sam nigdy ich nie używałem, ale czytałem o nich). Istnieje kilka innych takich systemów wymienionych tutaj .

Ta metoda jest o wiele bezpieczniejsza niż waniliowe Więzienie chroot i jest o wiele bardziej lekka niż korzystanie z pełnej wirtualizacji takiej jako qemu / kvm lub VMware.

Nie jestem programistą, więc nie wiem, jakiego AJAX-a można użyć do sondowania wyników, ale jestem pewien, że da się to zrobić. Jako admin, uznałbym ten fajny projekt do wzięcia udziału. Baw się dobrze. :)

 4
Author: Geoff Fritz,
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
2009-06-19 21:24:28

Powiedziałbym, że jest to bardzo niebezpieczne na wielu poziomach. Zasadniczo otwierasz się na każdy exploit, który można znaleźć w Twoim systemie (podczas gdy Zwykle ograniczasz się do tych, które ludzie mogą wykorzystać zdalnie). Nie rób tego, jeśli możesz tego uniknąć.

Jeśli chcesz to zrobić, możesz użyć jakiejś maszyny Wirtualnej do uruchomienia kodu użytkownika. Używając czegoś takiego jak KVM można skonfigurować kilka maszyn wirtualnych używając tego samego obrazu bazowego (można nawet przechowuj migawkę w już uruchomionym stanie, choć nie jestem pewien, jak poradzi sobie z klonowaniem). Następnie można tworzyć maszyny wirtualne na żądanie, uruchamiać kod użytkownika, zwracać wyniki, a następnie usuwać maszynę wirtualną. Jeśli utrzymasz maszyny wirtualne w izolacji od siebie i od sieci, użytkownicy mogą siać dowolne spustoszenie, co nie zaszkodzi Twojemu fizycznemu serwerowi. Jedynym zagrożeniem, na jakie się narażasz w tych warunkach, będzie jakiś exploit, który pozwoli im uciec z maszyny wirtualnej... są one niezwykle rzadkie i będą rzadsze w miarę poprawy wirtualizacji sprzętu.

 3
Author: rmeador,
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
2009-06-19 19:46:09

Chociaż jest on wciąż w fazie rozwoju i nie jest jeszcze uważany za Bezpieczny, możesz sprawdzić technologię stojącą za natywnym klientem Google . Został zaprojektowany tak, aby umożliwić uruchamianie niezaufanego kodu natywnego w przeglądarce internetowej, ale prawdopodobnie może być dostosowany do użytku na serwerze WWW. Możesz użyć czegoś takiego oprócz innych technik, takich jak maszyna wirtualna, dla dodatkowego bezpieczeństwa.

 3
Author: mark4o,
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
2009-06-19 21:00:31

Na Fedorze 11 znajduje się SELinux Sandbox , który wydaje się robić dokładnie to, co chcesz (może poza ograniczeniem spawania nowych procesów; linkowany post na blogu o tym nie wspomina).

Oczywiście, zawsze istnieje ryzyko wystąpienia błędów jądra; nawet w przypadku SELinux, części jądra są nadal narażone na działanie wszystkich procesów.

 2
Author: CesarB,
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
2009-06-19 21:01:57

Zobacz tę stronę o metodach sandboxingu Google Chrome dla Linuksa. Jak widać, istnieje wiele metod, ale żadna z nich nie nadaje się do dystrybucji aplikacji takich jak Chrome, ponieważ niektóre dystrybucje mogą ich nie zawierać. Nie jest to jednak problem dla aplikacji internetowej, ponieważ możesz kontrolować to, co jest zainstalowane na twoim serwerze.

Osobiście moim ulubionym jest Seccomp , ponieważ ma bardzo niski koszt w porównaniu do innych narzędzi, takich jak ptrace (Przełącz spacje adresowe na co syscall!) lub KVM (big memory hungry virtual machine) i jest niewiarygodnie prosty w porównaniu do narzędzi takich jak SELinux(a więc bardziej prawdopodobny).

 2
Author: Zifre,
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
2009-06-19 22:17:47

Myślę, że libsandbox służy twojemu celowi. Jego podstawowa Biblioteka jest napisana dla C / C++, ale posiada również wrapper dla programów Pythona. Zapewnia opcje dostosowywania, które wywołania systemowe mogą być dozwolone, ile pamięci może być używane, jak długo może być uruchomiony program gościa, itp. Jest już używany w kilku internetowych jurorach, takich jak HOJ .

 2
Author: Aghoree,
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-07-25 20:26:19

Istnieje narzędzie o nazwie strace - monitoruje wywołania systemowe wykonywane przez dany proces. Musisz tylko uważać na konkretne wywołania sugerujące "nielegalny" dostęp do funkcji. AFAIK, to metoda stosowana w zawodach programistycznych do programów uczestników piaskownicy.

 1
Author: Mike Hordecki,
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
2009-06-19 19:39:42

Myślę, że Twoje rozwiązania muszą skoncentrować się na analizie kodu źródłowego. Nie znam żadnych narzędzi i myślę, że byłoby to dość trudne z C, ale na przykład program Pascal, który nie zawiera żadnych modułów, byłby moim zdaniem całkiem nieszkodliwy.

 0
Author: ilya n.,
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
2009-06-22 20:45:42

Spawanie nowej maszyny wirtualnej pod KVM lub qemu w celu skompilowania i uruchomienia kodu wygląda jak droga do zrobienia. Uruchomienie kodu w jail/LXC może zagrozić maszynie, jeśli wykorzysta niezabezpieczone części systemu operacyjnego, takie jak kod sieciowy. Korzyści z pracy pod maszyną wirtualną są oczywiste. Można zhakować tylko maszynę wirtualną, ale nie samą maszynę. Ale efektem ubocznym jest to, że potrzebujesz dużo zasobów (CPU i pamięci), aby wywołać maszynę wirtualną dla każdego żądania.

 0
Author: Anand Bhat,
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-03-25 06:42:47

Ogranicznik Ptrace dla niezaufanych programów może być używany jak ten opisany w http://www.cs.vu.nl / ~ rutger / publikacje / jailer. pdf, http://www.cs.vu.nl/ ~ guido/Dwór / publikacje / ps / secrypt07. pdf.

Mają regułę zmiany root-ING, CHRDIR, której działanie jest podobne do chroot. (Sekcja "Polityka więzienia")

Mogli jednak nie opublikować swojego kodu źródłowego (częściowo opartego na zmodyfikowanej strace http://www.liacs.nl/ ~ wichert / strace / -- Sekcja "implementacja")...

Zobacz także inne dostępne metody oparte na ptrace do chroot-in-userpace: https://unix.stackexchange.com/a/72697/4319

 0
Author: imz -- Ivan Zakharyaschev,
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-04-13 12:36:24

O jedyną szansą jest uruchomienie VirtualMachine i te mogą mieć luki. Jeśli chcesz, aby Twoja maszyna została zhakowana w krótkim czasie, użyj uprawnień i stwórz specjalnego użytkownika z dostępem do może jednego katalogu. Jeśli chcesz odłożyć hakowanie do pewnego momentu w przyszłości, uruchom serwer WWW wewnątrz maszyny wirtualnej i przeprowadź do tego Port. Będziesz chciał zachować kopię zapasową tego, ponieważ prawdopodobnie będziesz miał to zhakowane w mniej niż godzinę i chcesz ponownie uruchomić świeżą kopię co kilka godzin. Będziesz również chciał zachować obraz całej maszyny, aby po prostu odtworzyć całość raz w tygodniu lub tak, aby przezwyciężyć cotygodniowe włamania. Nie pozwól, aby ta maszyna rozmawiała z żadną inną maszyną w Twojej sieci. Wszędzie na czarnej liście. Mówię o wirtualnej maszynie i fizycznych adresach IP maszyny. Przeprowadzaj regularne audyty bezpieczeństwa na innych maszynach na innych maszynach w sieci. Proszę zmienić nazwy maszyn IHaveBeenHacked1 i IHaveBeenHacked2 i zapobiec dostęp do tych z list hostów i zapór sieciowych.

W ten sposób możesz zatrzymać swój poziom hakowania na jakiś czas.

 -2
Author: dude,
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
2009-06-19 20:53:23