Bezpiecznie używaj find z sudo

10

Na serwerze Linux muszę usunąć uprawnienia roota z grupy użytkowników. Ale ci użytkownicy mają uzasadnione powody, aby móc używać narzędzia „znajdź” do wyszukiwania plików na podstawie nazw plików, dat modyfikacji i innych metadanych.

Na serwerze nazwy plików nie są wrażliwe, ale zawartość pliku może być.

Chciałbym użyć sudo, aby umożliwić użytkownikom wyszukiwanie plików w dowolnym miejscu na serwerze. Narzędzie „znajdź” jest świetne, ale pozwala na wszelkiego rodzaju efekty uboczne, takie jak używanie „-exec” do odradzania dowolnych poleceń.

Czy mogę dostać się finddo pracy z moimi ograniczeniami?

Troels Arvin
źródło
14
Zazwyczaj nie chcesz, aby wyniki wyszukiwania wzorców nazw plików zawierały pliki, do których w rzeczywistości nie masz dostępu. Pod tym względem twoje wymagania są nieco dziwne.
HBruijn
2
Nikt nie zmusza cię do zaangażowania się w pytanie. Myślę, że jednym z celów usługi Server Fault jest służyć jako forum dla nieparzystych sytuacji.
Troels Arvin
2
Błąd serwera nie jest forum, a próby odwrotnej psychologii nie zmieniają ważności obserwacji HBruijna (która, jestem pewien, była próbą pomocy).
Wyścigi lekkości na orbicie

Odpowiedzi:

19

Co z lokalizacją ?

locate odczytuje jedną lub więcej baz danych przygotowanych przez updatedb (8) i zapisuje nazwy plików pasujące co najmniej do jednej z WZORÓW na standardowe wyjście, po jednej w wierszu. Jeśli nie podano opcji --regex, WZORY mogą zawierać znaki globowania. Jeśli jakikolwiek WZÓR nie zawiera znaków globowania, locate zachowuje się tak, jakby wzorzec był WZOREM .

Domyślnie locate nie sprawdza, czy pliki znalezione w bazie danych nadal istnieją. locate nigdy nie może zgłaszać plików utworzonych po ostatniej aktualizacji odpowiedniej bazy danych.

A może nawet slocate :

Bezpieczna lokalizacja zapewnia bezpieczny sposób indeksowania i szybkiego wyszukiwania plików w systemie. Używa kodowania inkrementalnego, tak jak GNU locate, aby kompresować bazę danych, aby przyspieszyć wyszukiwanie, ale będzie także przechowywać uprawnienia do plików i własność, aby użytkownicy nie widzieli plików, do których nie mają dostępu.

Ta strona podręcznika dokumentuje wersję GNU slocate. slocate Umożliwia użytkownikom systemu przeszukiwanie całych systemów plików bez wyświetlania nieautoryzowanych plików.

Lenniey
źródło
Dobry pomysł. Nie wiem, dlaczego o tym nie pomyślałem. Ale obawiam się, że parametr „-d” mógłby zostać w jakiś sposób wykorzystany do wczytania dowolnych plików, jeśli reguły sudo pozwalają użytkownikowi na uruchomienie dowolnej komendy „locate”?
Troels Arvin
2
@TroelsArvin: locatenie potrzebuje sudo; tylko jego updatedbpraca wymaga specjalnych uprawnień. W związku z tym użytkownicy nigdy nie powinni być uruchomieni ani mieć możliwości uruchamiania sudo locate.
jwodder
1
@jwodder: Na serwerze RHEL 7: Powiedzmy, że użytkownik nie ma dostępu do / data / foo. W / data / foo znajduje się plik „somefile.csv”. Teraz, kiedy wykonasz „locate somefile.csv”, dane wyjściowe z „locate” nie obejmują /data/foo/somefile.csv - chyba że użytkownik wykona „locate” przez sudo. (Użycie argumentu „--nofollow” nie pomaga.)
Troels Arvin
1
@TroelsArvin, ale -dflaga ustawia tylko ścieżkę do bazy danych? Może źle cię zrozumiałem.
Lenniey
21

Według man 7 capabilities

   CAP_DAC_READ_SEARCH
          * Bypass file read permission checks and directory read and execute permission checks;
          * Invoke open_by_handle_at(2).

To zadziałało dla mnie. (linie zaczynające się od „#” są rootem, linie z „$” nie są rootem) w tym przypadku użytkownik inny niż root jest w wheelgrupie.

# cp /usr/bin/find /usr/bin/sudofind
# chmod 710 /usr/bin/sudofind
# chown root:wheel /usr/bin/sudofind
# setcap cap_dac_read_search+ep /usr/bin/sudofind
# exit
$ find /root 
find: ‘/root’: Permission denied
$ sudofind /root
/root /root 
/root/Testbed 
...
... 
$ sudofind /root -exec cat {} \;
cat: /root: Permission denied 
cat: /root/Testbed: Permission denied
$ sudofind /root -printf "%u %g %m %c %p\n"
root root 644 Mon Apr 20 09:20:48.0457518493 2015 /root
root root 755 Fri Dec  4 02:34:03.0016294644 2015 /root/Testbed
...
...
$ # Capability inheritance test..
$ sudofind /root -exec /bin/sleep 10 \; &
[1] 17017
$ getpcaps $(pgrep find)
Capabilities for `17017': = cap_dac_read_search+ep
$ getpcaps $(pgrep sleep)
Capabilities for `17019': =

Biorąc pod uwagę to, co zapewnia zdolność, pasuje dokładnie do tego, czego chcesz. Nie wyczerpująco sprawdziłem, czy findma funkcję, która pozwala na odczyt bajtów wewnątrz plików, ale oczywiste rzeczy, takie jak LD_PRELOADataki typu shim w bibliotece, nie powinny działać ze względu na naturę kontroli setuid w Linuksie, a bity możliwości nie dostają odziedziczone przez procesy potomne (w przeciwieństwie do surowego setuida), więc to kolejna premia.

Pamiętaj, że to, co chcesz zrobić, budzi potencjalne obawy dotyczące prywatności związane z tworzeniem lub dostępem do plików tymczasowych, a program może służyć jako podstawa do podjęcia próby eskalacji warunków wyścigu / przywilejów (w stosunku do programów, które tworzą znane nazwy plików ale nie wykonuj poprawnych kontroli bezpieczeństwa).

Ponadto niektóre źle napisane aplikacje mogą polegać na metadanych pliku lub strukturze drzewa jako sposobie przekazywania znaczenia lub ukrywania danych. Może to spowodować udostępnienie ograniczonych informacji lub ujawnienie uprzywilejowanych dokumentów, o których nie wiadomo inaczej (wiem o bezpieczeństwie poprzez niejasność, ale jest to rzecz, którą szczególnie lubią robić dostawcy z zamkniętym źródłem).

Dlatego uważaj i rób to ostrożnie i zrozum, że wiąże się to z ryzykiem, nawet jeśli oczywiste rzeczy nie działają.

Och, chciałbym sprawdzić, czy ktoś ma atak koncepcyjny, który wykorzystuje ten mechanizm jako podstawę do eskalacji uprawnień w komentarzach!

Matthew Ife
źródło
5
To naprawdę wygląda całkiem interesująco!
Sven
Lubię to? Cóż, nie ma PoC, ale mimo to interesujące: forums.grsecurity.net/…
Lenniey
Podoba mi się ten pomysł, ale ma znaczną wadę: sudofind jest teraz plikiem binarnym, który nie jest częścią żadnego pakietu oprogramowania (np. RPM) w systemie. Więc jeśli dystrybucja wyśle ​​łatkę dla „find”, to sudofind nie zostanie zaktualizowany.
Troels Arvin
2
@TroelsArvin To niekoniecznie zła rzecz. Jeśli dodajesz funkcje typu setuid do istniejącego narzędzia, które nie zostało zaprojektowane dla tych możliwości, nie chciałbyś żadnych aktualizacji w podstawowym narzędziu, zanim nie sprawdzisz, czy zaktualizowanego narzędzia można bezpiecznie używać z niestandardowym narzędziem możliwości. Wyobraź sobie, że w tym przypadku aktualizacja miałaby findumożliwić bezpośrednie wykonanie kodu dostarczonego przez użytkownika, podobnie jak to, co awkmożna zrobić.
Andrew Henle
4
Największy problem, jaki mogę z tym zobaczyć, polega na tym, że można nagle zapisać katalogi do zapisu na świecie, które znajdują się pod katalogami, których nie można przeszukiwać.
Tavian Barnes
2

Dałbym użytkownikom odpowiednie uprawnienia.

Domyślnie, jeśli umask jest 022, katalogi są tworzone, aby każdy mógł wyświetlać i statystować pliki w nich zawarte. Jeśli nie, możesz ręcznie zmienić uprawnienia katalogu na bitowe lub jego stare uprawnienia i 0555:

chmod +0555 foo

A jeśli ci użytkownicy nie mają uprawnień do wykonywania wszystkich rodziców tego katalogu (na przykład katalogu domowego innego użytkownika), prawdopodobnie oznacza to, że pierwszy katalog należy umieścić gdzie indziej.

Jeśli chcesz pozwolić tylko niektórym użytkownikom na odczytanie i wykonanie tego katalogu, możesz zmienić jego tryb na 0750, umieścić tych użytkowników w grupie i zmienić właściciela grupy katalogu na tę grupę:

groupadd can_read_foo
chmod 0750 foo
chgrp can_read_foo foo
gpasswd -a alice can_read_foo
gpasswd -a bob can_read_foo
yt7b97q-
źródło