Jak „uwięzić” proces bez rootowania?


26

Gdybym był rootem, mógłbym po prostu stworzyć fikcyjnego użytkownika / grupę, odpowiednio ustawić uprawnienia do plików i wykonać proces jako ten użytkownik. Jednak nie jestem, więc czy jest jakiś sposób na osiągnięcie tego bez rootowania?


1
@alex: Mam skrypt wykonujący wiele symulacji (w różnych katalogach) i chcę się upewnić, że bez względu na to, jak złe jest programowanie, mogą uzyskiwać dostęp tylko do plików we własnym katalogu i nie modyfikować przypadkowo np. wyników innych symulacji
Tobias Kienzler

2
@Tobias: Mam twój punkt widzenia. chrootnaturalnie by się tam zmieściło, ale znowu nie jesteś rootem.
alex

1
Myślę, że selinux, apparmor i grsecurity mogą to zrobić, ale nie jestem pewien. ale jeśli nie są one dostępne lub skonfigurowane przez administratora systemu, masz na to ochotę.
ksenoterrakid

4
Przez lata zastanawiałem się nad takim pytaniem. Wydaje się, że jest to naturalne życzenie: nie będąc rootem, aby móc uruchamiać procesy z odrzuconymi częściami uprawnień użytkownika, tj. Móc ograniczać proces do „więzienia” ustawionego przez użytkownika, co dałoby procesowi nawet mniej praw niż użytkownik. Szkoda, że ​​zwykłe jednorożce nie oferowały tego standardowo!
imz - Ivan Zakharyaschev

2
Spróbuj poprosić administratora systemu o utworzenie drugiego konta użytkownika.
LawrenceC

Odpowiedzi:


23

Więcej podobnych pytań z większą liczbą odpowiedzi wartych uwagi:

UWAGA: Niektóre odpowiedzi wskazują na konkretne rozwiązania, które nie zostały jeszcze tutaj wymienione.

W rzeczywistości istnieje wiele narzędzi więziennych o różnej implementacji, ale wiele z nich albo nie jest bezpiecznych z założenia (jak fakeroot, LD_PRELOADoparte na), albo nie jest kompletnych (jak fakeroot-ng, ptraceopartych na), lub wymagałoby rootowania ( chrootlub plashwspomnianych w fakechroot etykieta ostrzegawcza ).

To tylko przykłady; Pomyślałem o wyświetleniu ich wszystkich obok siebie, ze wskazaniem tych dwóch funkcji („można zaufać?”, „Wymaga skonfigurowania konta root?”), Być może w implementacjach wirtualizacji na poziomie systemu operacyjnego .

Zasadniczo odpowiedzi tam obejmują pełny zakres możliwości, a nawet więcej:

maszyny wirtualne / system operacyjny

rozszerzenie jądra (jak SELinux)

  • (wspomniane w komentarzach tutaj),

chroot

Pomocniki oparte na chroot (które jednak muszą być ustawione jako root root, ponieważ chrootwymagają roota, a może chrootmogą działać w izolowanej przestrzeni nazw - patrz poniżej):

[powiedzieć trochę więcej o nich!]

Znane narzędzia do izolacji oparte na chroot:

  • hasher z jego poleceniami hsh-runi hsh-shell. ( Hasher został zaprojektowany do budowania oprogramowania w bezpieczny i powtarzalny sposób).
  • schroot wspomniany w innej odpowiedzi
  • ...

ptrace

Innym rozwiązaniem izolacji wiarygodne (oprócz w seccompopartym na jednym ) byłaby pełna syscall-przechwycenie przez ptrace, jak to opisano w podręczniku systemowym fakeroot-ng:

W przeciwieństwie do poprzednich implementacji, fakeroot-ng korzysta z technologii, która nie pozostawia śledzonemu procesowi wyboru, czy będzie korzystał z „usług” fakeroot-ng. Kompilowanie programu statycznie, bezpośrednie wywoływanie jądra i manipulowanie własną przestrzenią adresową to wszystkie techniki, które można w trywialny sposób ominąć kontrolę nad procesem opartą na LD_PRELOAD i nie mają zastosowania do fakeroot-ng. Teoretycznie możliwe jest formowanie fakerootingu w taki sposób, aby uzyskać całkowitą kontrolę nad śledzonym procesem.

Chociaż jest to teoretycznie możliwe, nie zostało to zrobione. Fakeroot-ng zakłada pewne „ładnie zachowujące się” założenia dotyczące śledzonego procesu, a proces, który je złamie, może, jeśli nie całkowicie, uciec, to przynajmniej obejść część „fałszywego” środowiska narzuconego mu przez fakeroot- ng. W związku z tym odradza się używanie fakeroot-ng jako narzędzia bezpieczeństwa. Raporty o błędach, które twierdzą, że proces może celowo (w przeciwieństwie do nieumyślnie) uniknąć kontroli nad fałszywym rootowaniem, zostanie albo zamknięty jako „nie błąd”, albo oznaczony jako niski priorytet.

Możliwe, że ta polityka zostanie ponownie przemyślana w przyszłości. Na razie jednak zostałeś ostrzeżony.

Jednak, jak można to przeczytać, fakeroot-ngsama nie jest przeznaczona do tego celu.

(BTW, zastanawiam się, dlaczego zdecydowali się zastosować seccomppodejście oparte na Chromium zamiast ptraceopartego na ...)

Z narzędzi niewymienionych powyżej zauważyłem dla siebie Geordi , ponieważ podobało mi się, że program kontrolny jest napisany w języku Haskell.

Znane narzędzia izolacji oparte na ptrace:

seccomp

Jednym ze znanych sposobów osiągnięcia izolacji jest zastosowanie piaskownicowania seccomp w Google Chromium . Ale takie podejście zakłada, że ​​piszesz pomocnika, który przetworzy niektóre (dozwolone) z dostępu do plików „przechwyconych” i innych wywołań systemowych; a także, oczywiście, staraj się „przechwytywać” wywołania systemowe i przekierowywać je do pomocnika (być może oznaczałoby to nawet zastąpienie przechwyconych wywołań systemowych w kodzie kontrolowanego procesu; więc nie brzmi mówiąc prosto: jeśli jesteś zainteresowany, lepiej przeczytaj szczegóły, a nie tylko moją odpowiedź).

Więcej powiązanych informacji (z Wikipedii):

(Ostatni element wydaje się interesujący, jeśli ktoś szuka ogólnego seccomprozwiązania poza Chromium. Istnieje również post na blogu, który warto przeczytać od autora „seccomp-nurse”: SECCOMP jako rozwiązanie Sandboxing? ).

Ilustracja tego podejścia z projektu „seccomp-nurse” :

                      wprowadź opis zdjęcia tutaj

Czy „elastyczny” seccomp jest możliwy w przyszłości Linuksa?

W 2009 r. Pojawiały się również sugestie dotyczące łatania jądra Linux, aby zapewnić większą elastyczność seccomptrybu - aby „uniknąć wielu akrobatyki, których obecnie potrzebujemy”. („Akrobatyka” odnosi się do komplikacji związanych z pisaniem pomocnika, który musi wykonać wiele potencjalnie niewinnych wywołań systemowych w imieniu procesu w więzieniu i zastępowania ewentualnie niewinnych wywołań systemowych w procesie w więzieniu.) Artykuł LWN napisał w tym miejscu:

Jedną z sugestii, które się pojawiły, było dodanie nowego „trybu” do seccomp. Interfejs API został zaprojektowany z myślą, że różne aplikacje mogą mieć różne wymagania bezpieczeństwa; zawiera wartość „mode”, która określa ograniczenia, które należy wprowadzić. Zaimplementowano tylko tryb oryginalny, ale z pewnością można dodać inne. Utworzenie nowego trybu, który umożliwiłby procesowi inicjalizacji określenie, które wywołania systemowe będą dozwolone, uczyniłoby to narzędzie bardziej użytecznym w sytuacjach takich jak piaskownica Chrome.

Adam Langley (również z Google) opublikował łatkę, która właśnie to robi. Nowa implementacja „mode 2” akceptuje maskę bitów opisującą, które wywołania systemowe są dostępne. Jeśli jedną z nich jest prctl (), wówczas kod w trybie piaskownicy może dodatkowo ograniczyć własne wywołania systemowe (ale nie może przywrócić dostępu do wywołań systemowych, które zostały odrzucone). Podsumowując, wygląda na rozsądne rozwiązanie, które może ułatwić życie deweloperom piaskownicy.

To powiedziawszy, ten kod nigdy nie może zostać scalony, ponieważ dyskusja przeszła na inne możliwości.

Ten „elastyczny seccomp” zbliżyłby możliwości Linuksa do zapewnienia pożądanej funkcji w systemie operacyjnym, bez potrzeby pisania skomplikowanych pomocników.

(Blog zamieszczający posty zasadniczo o tej samej treści, co ta odpowiedź: http://geofft.mit.edu/blog/sipb/33 .)

przestrzenie nazw ( unshare)

Izolowanie poprzez przestrzenie nazw ( unsharerozwiązania oparte na bazach danych ) - nie wymienione tutaj - np. Nieudostępnianie punktów montowania (w połączeniu z FUSE?) Może być częścią działającego rozwiązania, jeśli chcesz ograniczyć dostęp systemu plików do niezaufanych procesów.

Więcej na temat przestrzeni nazw, ponieważ ich implementacja została zakończona (ta technika izolacji znana jest również pod nme „Linux Containers” lub „LXC” , prawda?):

„Jednym z ogólnych celów przestrzeni nazw jest wspieranie wdrażania kontenerów, narzędzia do lekkiej wirtualizacji (a także innych celów)” .

Możliwe jest nawet utworzenie nowej przestrzeni nazw użytkownika, dzięki czemu „proces może mieć normalny nieuprzywilejowany identyfikator użytkownika poza obszarem nazw użytkownika, a jednocześnie mieć identyfikator użytkownika 0 w obszarze nazw. Oznacza to, że proces ma pełne uprawnienia root dla operacji w przestrzeni nazw użytkownika, ale nie jest uprzywilejowany dla operacji poza przestrzenią nazw ".

Aby zobaczyć prawdziwe działające polecenia, zobacz odpowiedzi na:

oraz specjalne programowanie / kompilowanie przestrzeni użytkownika

Ale cóż, oczywiście pożądane gwarancje „więzienia” można wdrożyć przez programowanie w przestrzeni użytkownika ( bez dodatkowego wsparcia dla tej funkcji z systemu operacyjnego ; być może dlatego ta funkcja nie została uwzględniona na pierwszym miejscu w projektowaniu systemów operacyjnych ); z mniej lub bardziej komplikacjami.

Wspomniane ptrace- lub seccompoparte na piaskownicy piaskownicy można postrzegać jako niektóre warianty wdrażania gwarancji, pisząc pomocnika piaskownicy, który kontrolowałby twoje inne procesy, które byłyby traktowane jako „czarne skrzynki”, dowolne programy uniksowe.

Innym podejściem może być zastosowanie technik programowania, które mogą dbać o efekty, których należy zabronić. (To ty musisz wtedy pisać programy; nie są już czarnymi skrzynkami.) Aby wspomnieć o jednym, użycie czystego języka programowania (który zmusiłby cię do programowania bez efektów ubocznych), takiego jak Haskell , po prostu wywoła wszystkie efekty program jest jawny, więc programista może łatwo upewnić się, że nie wystąpią niedozwolone efekty.

Sądzę, że istnieją narzędzia piaskownicy dla programistów w innym języku, np. Java.


Niektóre strony zawierające informacje na ten temat zostały również wskazane w odpowiedziach tam:


Bezkorzeniowy GoboLinux może być również opcją ...
Tobias Kienzler,

@tobias Ale czy Rootless Gobolinux daje gwarancję, że program napisany przez użytkownika nie uzyska dostępu do zewnętrznego środowiska? ..
imz - Ivan Zakharyaschev

1
Nie bardzo - w pewnym sensie miałem błędne przekonanie, że pozwoliłoby to również zostać „lokalnym” użytkownikiem root, który następnie mógłby po prostu stworzyć użytkowników wirtualnych dla takiego procesu - chociaż możliwe byłoby jego użycie chroot, ale prawdopodobnie nadal wymagałoby prawdziwe uprawnienia roota ...
Tobias Kienzler

8

Jest to podstawowe ograniczenie unikatowego modelu uprawnień: delegować może tylko root.

Nie musisz być rootem, aby uruchomić maszynę wirtualną (co nie jest prawdą we wszystkich technologiach VM), ale jest to rozwiązanie ciężkie.

Tryb użytkownika Linux jest stosunkowo lekkim rozwiązaniem do wirtualizacji Linux-on-Linux. Konfiguracja nie jest taka łatwa; trzeba wypełnić partycji root (w katalogu) z co najmniej minimum niezbędnego do bagażnika (kilka plików /etc, /sbin/inita jego zależnościami, program logowania, muszli i użyteczności publicznej).


1

Myślę, że możesz mieć trochę szczęścia, LD_PRELOADaby przechwycić dostęp do niektórych plików, ale może to być naprawdę trudne.


Seccomp piaskownica Google Chromium działa bardziej niezawodnie - skutecznie przechwytuje syscall. - unix.stackexchange.com/questions/6433/…
imz - Ivan Zakharyaschev

Różnica między próbą przechwycenia czegoś a sanboxingiem (jak w przypadku Chromium) jest gwarancją izolacji.
imz - Ivan Zakharyaschev

1
Przechwytywania poprzez LD_PRELOADnie można ufać (można go obejść), ale przechwytywania poprzezptrace można.
imz - Ivan Zakharyaschev

1
Prosty przykład przedstawiono tutaj < joey.kitenet.net/blog/entry/fakechroot_warning_label >, który pokazuje, że LD_PRELOADrozwiązaniom opartym na rozwiązaniach nie można ufać jako środka bezpieczeństwa.
imz - Ivan Zakharyaschev

0

Z pełnej listy chciałbym tylko dodać:

  • fakeroot (od opiekuna pakietów debian): ma na celu zbudowanie pakietu przy pomocy „przyjaznych” narzędzi. Nie jest to pełna izolacja, ale pomaga budować pakiety z różnymi użytkownikami i fałszywymi urządzeniami i innymi specjalnymi pseudo-plikami.

  • fakechroot (który używa fakeroot). Ten program ma wiele błędów. Na przykład „/ etc / hosts” jest zakodowany na stałe w glibc: nie można go zmienić za pomocą tego narzędzia.

  • qemu: musisz skompilować jądro Linuksa, ale wynik jest bardzo szybki i jest to „fałszywa” (tj. wirtualna) maszyna z prawdziwymi uprawnieniami roota. Możesz zbudować i zamontować dowolny obraz rozruchowy.


0

Firejail to miłe narzędzie do więzienia dowolnego procesu, z dostępem do roota lub bez niego, z wieloma opcjami i bardzo elastycznym:


2
Przydałoby się nieco więcej szczegółów na temat korzystania z Firejail. Po zerwaniu tego linku treść informacji o twoich odpowiedziach spadnie do samej nazwy narzędzia. (dołącz tutaj, jeśli jest to dostępne pakiety dotyczące dystrybucji, jak go używać itp.).
Anthon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.