2010-12-10 10 views
9

Rozważam kilka opcji dla procesu piaskownicy w systemie Linux. Używanie clone() z CLONE_NEWNET (itp.) Jest jedną z opcji. CLONE_NEWNET zapewnia, że ​​proces piaskownicy nie może wykonywać lub akceptować rzeczywistych połączeń sieciowych. Ale chciałbym całkowicie wyłączyć gniazda dla tego procesu, nawet bind() do dowolnego portu na 0.0.0.0 i powiązać z uniksowym gniazdem unixowym (nawet anonimowym). Chciałbym to zrobić, aby zapobiec wykorzystaniu zbyt dużej ilości zasobów jądra przez powiązanie z tysiącami portów. Jak mogę to zrobić?Jak wyłączyć tworzenie gniazda dla procesu Linux, dla piaskownicy?

Ogólnie interesuję się wieloma podejściami do piaskownicy (tj. Dostarczonymi przez jądro Linuksa i egzekwowanymi przez ptrace()), ale w tym pytaniu interesuje mnie tylko aspekt tworzenia gniazda w podejściu do piaskownicy (tak jeśli sugerujesz podejście do piaskownicy, wyjaśnij również, jak zapobiec tworzeniu gniazda za pomocą tego narzędzia) i nie interesują mnie podejścia, które wymagają łatania jądra lub które wymagają załadowania modułu jądra, który nie jest częścią domyślnego pakietu jądra systemu Ubuntu Lucid lub które wpłynęłyby na każdy proces w systemie.

+2

Podobny Qs na procesy Sandboxing/uwięzienie w systemie Linux lub UNIX: * http://unix.stackexchange.com/q/6433/4319 * http://stackoverflow.com/q/3859710/94687 * http://stackoverflow.com/q/4249063/94687 * http://stackoverflow.com/q/1019707/94687 –

Odpowiedz

8

ptrace wydaje się być najbardziej oczywistym narzędziem, ale poza tym ...

util-linux [-NG] ma polecenie unshare, która wykorzystuje clone/unshare interfejsy jądra. Jeśli uruchomisz nowy proces przez unshare -n (lub clone(CLONE_NEWNET)), wszystkie utworzone przez niego gniazda sieciowe znajdują się w innym obszarze nazw. To nie rozwiązuje problemu z zasobami jądra, ale działa w trybie piaskownicy.

Jądro Linux obsługuje również seccomp, tryb wszedł z prctl(PR_SET_SECCOMP, 1) która uniemożliwia proces (dobrze, nici, naprawdę) z wywołaniem żadnych syscalls inny niż read, write, exit i sigreturn. To całkiem skuteczna piaskownica, ale trudna w użyciu z niezmodyfikowanym kodem.

Można zdefiniować domenę SELinux, która uniemożliwia dostęp do domeny socket/bind/etc. dzwoni i wykonuje dynamiczne przejście do tego typu. To (oczywiście) wymaga systemu z aktywnie egzekwującymi politykę SELinux. (Możliwe z AppArmor i Tomoyo są prawdopodobnie podobne rzeczy, ale nie jestem bardzo obeznany z żadnym z nich.)

+1

Dziękujemy za skomponowanie tak obszernej listy. Przyjąłem twoją odpowiedź. Próbowałem już AppArmor i mogę potwierdzić, że może to uniemożliwić tworzenie gniazd. Wspomniałem już o 'CLONE_NEWNET' w pytaniu (i dlaczego nie jest to rozwiązanie). seccomp nie jest dobrą odpowiedzią na moje pytanie, ponieważ ogranicza więcej (na przykład fork()) niż to, co chcę. – pts

4

Spójrz na systrace - nie ogranicza się do gniazd, ale ogólny generatora zasad/egzekutora syscall. Cytat:

Port GNU/Linux został zakończony, a łatka jądra jest aktywnie konserwowana przez Marius Eriksen. Może być uruchamiany bez zmian jądra za pomocą mechanizmu ptrace.

Disclamer - Nigdy nie próbowałem go na Linuksie.

+1

Dziękuję za wzmiankę o systrace. Właśnie rzuciłem okiem na Linuksa i386 i wygląda on potężnie pod względem funkcji: może uniemożliwić tworzenie gniazd i wiele więcej. Miałem około pięciu małych problemów podczas jego kompilacji, ale kiedy już to zrobiłem, wydawało mi się, że działa to na piaskownicy prostych programów, ale nie mogłem piaskować GCC wywołując GNU jako (1) z systrace: systrace utknął w nieskończoność w wywołaniu systemowym wait4. Poza tym jest nieobsadzone przez 2 lata. Więc zrezygnowałem z tego. ponieważ wcześniejsze zgłoszenie błędu wait4 nie zostało odebrane: http://forum.soft32.com/linux/strace-wait4-pending-SIGALRM-ftopict484715.html – pts

+0

FYI Głosowałem za twoją odpowiedzią, ale skoro systrace nie są dla mnie stabilne , Nie mogę zaakceptować tej odpowiedzi. – pts

2

Spróbuj seccomp (patrz strona podręcznika podręcznika), może ograniczyć proces tylko do dostępu do gniazd, które pozostały otwarte w czasie wykonywania połączenia prctl.

+1

Wiem o seccomp, ale to nie jest dobra odpowiedź na moje pytanie, ponieważ ogranicza więcej (na przykład fork()) niż to, co chcę. – pts

+1

pkt. Zgadzam się. Stycznie, dlatego seccomp2 powinien zostać zaakceptowany w głównym Linuksie, zamiast być urażony. –

+0

Gdzie jest ten seccomp2, o którym mówisz? Link do archiwum listy mailingowej z postem? – user562374

2

Możesz być zainteresowany z „sydbox” piaskownicy lub „pinktrace” Biblioteka:

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

+1

Dzięki za wzmiankę o tych dwóch. Odrzuciłem je wcześniej, ponieważ są okropnie nieudokumentowane. Być może poprawią się w przyszłości. – pts

+1

Miałem takie samo uczucie na początku. Lucky, postanowiłem sprawdzić źródła i posty na listach mailingowych i odkryłem, że ten projekt wygląda interesująco i wreszcie, nie jest tak mały, że czuje się na żebraniu i oferuje wiele sposobów wygodnego "filtrowania" wywołań systemowych - w elastyczny sposób! :) –

+2

W moim obciążeniu (działającym w g ++), sydbox był o 50% wolniejszy od trybu użytkownika w systemie Linux, więc trzymam się teraz Linuksa w trybie użytkownika, ponieważ dzięki temu mogę nie tylko korzystać z piaskownicy, ale także ograniczać zużycie pamięci. – pts

2

Jeśli Twoim głównym celem jest ograniczenie liczby gniazd uruchamianych przez łagodny proces P zastosowany na łagodnych wejściach, wówczas setrlimit(RLIMIT_NOFILE, ...) zrobi mniej więcej tyle, ile chcesz.

Jednakże, jeśli założono, że P jest szkodliwe, a nie łagodne, lub jeśli szukasz silnej pewności, że P będzie się zachowywać w obliczu potencjalnie złośliwych danych wejściowych, prawdopodobnie masz pecha: np. najlepiej, dzięki dostępnym dzisiaj narzędziom, możesz stworzyć tor przeszkód dla atakujących.

(W takiej sytuacji, jeśli tor przeszkód działa dla Ciebie, to może trochę więcej dobrych pomysłów przez wywiercenie tu na sandboxing.org lub wysyłając pytania na przyjaznych ludzi na [email protected].)

Powiązane problemy