Uprawnienia do plików w systemie Linux

Cześć wszystkim. Aktywnie bierzemy się do pracy i już w styczniu przygotowujemy wiele mocnych premier. Ogłoszono między innymi zapisy na nowy stream ulubionego przez wszystkich kursu. „Administrator Linuksa”. W oczekiwaniu na premierę tradycyjnie udostępniamy tłumaczenia przydatnych materiałów.

Uprawnienia do plików w systemie Linux

Uprawnienia do plików stanowią bezpieczną alternatywę dla plików wykonywalnych SUID, ale na początku mogą wydawać się nieco mylące.


Wszyscy znamy te pliki binarne SUIDzła decyzja z punktu widzenia bezpieczeństwa. Na szczęście, jeśli Twoja aplikacja wymaga pewnych ograniczonych uprawnień, istnieje skuteczniejszy sposób uprawnienia do plików.

Zaoszczędzę ci trochę czasu, jeśli chcesz uniknąć szczegółowego czytania powyższego artykułu: Zasadniczo uprawnienia do plików pozwalają na procesy działające jako root i dlatego mogą coś zrobić, aby zachować pewne możliwości, ograniczone ta listagdy tracą uprawnienia i są uruchamiane przez nieuprzywilejowanego użytkownika. Oznacza to, że jeśli atakującemu uda się złamać zabezpieczenia procesu przy użyciu przepełnienia bufora lub innego exploita, nie będzie mógł skorzystać z niczego poza pewnymi minimalnymi uprawnieniami, których proces faktycznie potrzebuje.

Uprawnienia świetnie się sprawdzają w przypadku usług, które zazwyczaj zawsze działają jako root, ale co z narzędziami wiersza poleceń? Na szczęście jest to również obsługiwane, pod warunkiem, że masz zainstalowane odpowiednie narzędzia. Jeśli używasz Ubuntu, będziesz potrzebować na przykład pakietu libcap2-bin. Będziesz także musiał uruchomić niearchaiczne jądro (od wersji 2.6.24).

Funkcje te umożliwiają powiązanie uprawnień z plikami wykonywalnymi, podobnie jak ustawienie bitu SUID, ale tylko dla określonego zestawu uprawnień. Pożytek setcap służy do dodawania i usuwania uprawnień do pliku.

Pierwszym krokiem jest wybranie potrzebnych uprawnień. Na potrzeby tego artykułu zakładam, że istnieje narzędzie do diagnostyki sieci o nazwie tracewalk, z którego powinien móc korzystać surowe gniazda. Zwykle wymaga to uruchomienia aplikacji jako root, ale podczas przeglądania lista okazuje się, że potrzebne jest jedynie pozwolenie CAP_NET_RAW.

Zakładając, że znajdujesz się w katalogu, w którym znajduje się plik binarny tracewalk, możesz dodać to uprawnienie w ten sposób:

sudo setcap cap_net_raw=eip tracewalk

Na razie zignoruj ​​przyrostek =eip jeśli chodzi o rozwiązanie, opowiem o tym za kilka sekund. Pamiętaj, że nazwa uprawnienia jest napisana małymi literami. Możesz teraz sprawdzić, czy poprawnie skonfigurowałeś uprawnienia za pomocą:

setcap -v cap_new_raw=eip tracewalk

Możesz też wyświetlić listę wszystkich uprawnień ustawionych dla danego pliku wykonywalnego:

getcap tracewalk

Dla porównania możesz także usunąć wszystkie uprawnienia z pliku wykonywalnego za pomocą:

setcap -r tracewalk

W tym momencie powinieneś móc uruchomić plik wykonywalny jako użytkownik nieuprzywilejowany i powinien on móc pracować z surowymi gniazdami, ale nie powinien mieć żadnych innych uprawnień, jakie posiada użytkownik root.

Co więc oznacza ten dziwny przyrostek? =eip? Wymaga to pewnego zrozumienia natury uprawnień. Każdy proces ma trzy zestawy uprawnień − skuteczne, dziedziczne i dozwolone:

  • Skuteczny Uprawnienia to te, które definiują, co faktycznie może zrobić proces. Na przykład nie może poradzić sobie z surowymi gniazdami if CAP_NET_RAW nie należy do zestawu efektywnego.
  • Dostępny uprawnienia to te, które proces może posiadać, jeśli zażąda ich za pomocą odpowiedniego wywołania. Uniemożliwiają procesowi faktyczne wykonanie czegokolwiek, chyba że został on specjalnie napisany z prośbą o wspomniane pozwolenie. Pozwala to na zapisanie procesów w celu dodania uprawnień krytycznych do zestawu efektywnego tylko na okres, w którym są one faktycznie wymagane.
  • Dziedziczny uprawnienia to te, które można odziedziczyć w dostępnym zestawie zrodzonego procesu potomnego. Podczas operacji fork() lub clone() proces potomny zawsze otrzymuje kopię uprawnień procesu nadrzędnego, ponieważ w tym momencie nadal uruchamia ten sam plik wykonywalny. Zestaw dziedziczny jest używany, gdy exec() (lub równoważny) jest wywoływany w celu zastąpienia pliku wykonywalnego innym. W tym momencie dostępny zestaw procesu jest maskowany przez zestaw dziedziczny, aby uzyskać dostępny zestaw, który będzie używany w nowym procesie.

Zatem użyteczność setcap pozwala nam dodać uprawnienia tych trzech zestawów niezależnie dla danego pliku wykonywalnego. Należy pamiętać, że znaczenie grup jest interpretowane nieco inaczej w przypadku uprawnień do plików:

  • Dostępne uprawnienia do plików to te, które są zawsze dostępne dla pliku wykonywalnego, nawet jeśli proces nadrzędny, który go wywołał, ich nie posiadał. Nazywano je zezwoleniami „przymusowymi”.
  • Dziedziczny uprawnienia do plików definiują dodatkową maskę, której można również użyć do usunięcia uprawnień z zestawu wywołującego procesu. Mają one zastosowanie dodatkowo do zestawu odziedziczonego przez proces wywołujący, więc uprawnienia są dziedziczone tylko wtedy, gdy istnieją w obu zestawach.
  • Efektywny uprawnienia do plików to właściwie pojedynczy bit, a nie zestaw, a jeśli ustawione, oznacza to, że cały dostępny zestaw jest również kopiowany do efektywnego zestawu nowego procesu. Można tego użyć do dodania uprawnień do procesów, które nie zostały napisane specjalnie w celu ich zażądania. Ponieważ jest to jeden bit, jeśli ustawisz go dla dowolnego uprawnienia, musi być ustawiony dla wszystkich uprawnień. Można o tym myśleć jako o starszej wersji, ponieważ służy do umożliwienia korzystania z uprawnień aplikacjom, które ich nie obsługują.

Podczas określania uprawnień poprzez setcap trzy litery e, i и p odnoszą się do skuteczne, dziedziczne i dostępne zestawy odpowiednio. Zatem wcześniejsza specyfikacja:

sudo setcap cap_net_raw=eip tracewalk

...wskazuje, że rozdzielczość CAP_NET_RAW należy dodać do dostępnych i dziedzicznych zestawów oraz że musi być również ustawiony bit efektywny. Spowoduje to zastąpienie wszelkich wcześniej ustawionych uprawnień do pliku. Aby ustawić wiele uprawnień jednocześnie, użyj listy oddzielonej przecinkami:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Przewodnik po uprawnieniach omawia to wszystko bardziej szczegółowo, ale mam nadzieję, że ten post nieco wyjaśnił, co się dzieje. Pozostało tylko wspomnieć o kilku zastrzeżeniach i trikach.

Po pierwsze, możliwości plików nie działają z dowiązaniami symbolicznymi - musisz je zastosować do samego pliku binarnego (tj. celu dowiązania symbolicznego).

Po drugie, nie działają z interpretowanymi skryptami. Na przykład, jeśli masz skrypt w języku Python, do którego chcesz przypisać uprawnienia, musisz przypisać je do samego interpretera języka Python. Oczywiście jest to potencjalny problem bezpieczeństwa, ponieważ wtedy wszystkie skrypty wykonane za pomocą tego interpretera będą miały określone uprawnienia, chociaż jest to nadal znacznie lepsze niż ustawienie SUID. Najczęstszym obejściem wydaje się napisanie osobnego pliku wykonywalnego w języku C lub jego odpowiedniku, który może wykonać niezbędne operacje i wywołać go ze skryptu. Jest to podobne do podejścia stosowanego przez Wireshark, który wykorzystuje plik binarny /usr/bin/dumpcap aby wykonać uprzywilejowane operacje:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Po trzecie, uprawnienia do plików są wyłączone, jeśli używasz zmiennej środowiskowej LD_LIBRARY_PATH z oczywistych względów bezpieczeństwa(1). To samo dotyczy LD_PRELOAD, o ile mi wiadomo.

1. Ponieważ atakujący może oczywiście zastąpić jedną ze standardowych bibliotek i użyć LD_LIBRARY_PATHwymusić wywoływanie biblioteki zamiast biblioteki systemowej i w związku z tym wykonanie własnego dowolnego kodu z tymi samymi uprawnieniami, co aplikacja wywołująca.

To wszystko. Więcej szczegółów na temat programu kursu można znaleźć na stronie webinarium, które odbędzie się 24 stycznia.

Źródło: www.habr.com

Dodaj komentarz