Ks. Br. George powiedział w jednym ze swoich wykładów (po rosyjsku), że istnieją pewne prawa dostępu, których administrator nie może naruszyć. Oznacza to, że istnieją pewne prawa dostępu, które mogą zabronić administratorowi robienia czegoś.
Nie udało mi się znaleźć tych informacji w Internecie i jestem ciekawy, czym one są. Jest to prawdopodobnie związane z rdzeniem systemu, prawda? Może nie może zatrzymać niektórych procesów systemowych? A może nie może uruchomić procesu w trybie rzeczywistym?
To pytanie nie ma związku z SELinux (George mówił o tym tuż przed pytaniem).
root
privileges
access-control
Kolyunya
źródło
źródło
root
, a zatem nie można odebrać żadnego prawaroot
.SECBIT_NOROOT
, a bycie uid 0 nie daje już automatycznie jednej możliwości.Odpowiedzi:
acess odmowa rootowania :
root
można odmówić bezpośredniego dostępu do sieci. Funkcja ta jest przydatna w Internecie podłączonych hostów, gdyż wymaga, aby zalogować się jakosmith
, a następniesudo
.niektóre rzeczy root nie mogą zrobić :
NIE jest to spowodowane brakiem przywilejów. Nie widzę nic, co root nie mógłby zrobić, jednak niektóre problemy techniczne mogą być postrzegane jako „zabronione”.
Jesteś na udziale NFS / samba i nie udzielono Ci konkretnej (
access=
) autoryzacji. Zwykły użytkownik nie przestrzega powszechnego prawa. (patrz lokalny vs zdalny root poniżej)Oczekuje na we / wy, a napęd fizyczny / zdalna jednostka LUN zostały odłączone, proces można zabić tylko poprzez ponowne uruchomienie.
Możesz
su - archemar
wszystko zmienić lub zmienić hasło Archemara, nie znając poprzedniego, ale nie możesz go odczytać (bez rejestratora kluczy), ponieważ hasła są przechowywane przy użyciu skrótu jednokierunkowego.lokalny vs zdalny root
Teraz
wystarczy zalogować się na serwerze NFS, uruchomić
./bash
i jesteś rootem na serwerze firmy / uniwersytetu.źródło
root
lokalnie, niekoniecznie w innych systemach. Przypadki 2 i 3 nie są uprawnieniami (nie można ich nikomu przyznać). Więc +1, twoje pierwsze zdanie wydaje się poprawne.root
na komputerze lokalnym można robić wszystko, co się chce, z takim samym przywilejem jak użytkownik lokalny,su - username
jeśli nic innego. Nigdy nie jestem pewien, dlaczego nie zadawali sobie trudu, abyroot
nie móc pisać takich udziałów sieciowych; wydaje się to raczej bezcelowe.root
hasło może utworzyć nawet on nie może uzyskać dostępu?”root
dostępu do udziałów NFS, jest zapobieganie tworzeniu plików binarnych „suid root” na zdalnym serwerze, co można wykorzystać w celu uzyskania pełnego zdalnego dostępu do serwera.W zwykłym przypadku jest to niepoprawne - administrator ma uprawnienia / uprawnienia do dowolnej funkcji zapewnianej przez system (1). Ta reguła się psuje, gdy włączysz SELinux do miksu. Dzięki SELinux można ograniczyć nawet uprawnienia roota, aby zabronić pewnych działań. Jednak konkretne niedozwolone działania są w dużym stopniu zależne od konfiguracji SELinuksa na komputerze lokalnym, więc nawet w przypadku SELinuksa na to pytanie nie można odpowiedzieć w sensie ogólnym.
(1) - jeśli system nie zapewnia danej funkcji, np. Nie ma funkcji jądra w czasie rzeczywistym, uważam, że stwierdzenie „root nie ma dostępu do tej funkcji” jest fałszywe, ponieważ oświadczenie to opiera się na fałszywe założenie (mianowicie, że dana funkcja jest dostępna dla każdego w tym systemie)
źródło
Z jednej strony są rzeczy, których żaden użytkownik nie może zrobić, takie jak
Ale to nie są przywileje, ponieważ nie można ich przyznać, po prostu nie są możliwe dla nikogo.
Następnie istnieją ograniczenia dla całego systemu lub jego części, które można włączyć lub wyłączyć.
Na przykład w systemie OS X istnieje możliwość zezwolenia na uruchomienie kodu tylko wtedy, gdy został podpisany przez Apple.
Nie uważam tego za faktyczny przywilej, ponieważ żaden użytkownik nie może go mieć, jeśli administrator nie może. Możesz to tylko globalnie wyłączyć.
Edycja:
Twój pomysł na plik bez bitu wykonywalnego również należałby do tej kategorii, ponieważ dosłownie nikt nie jest w stanie tego zrobić i nikt nie może uzyskać tego uprawnienia.
I nawet jeśli dajesz innemu użytkownikowi lub grupie uprawnienia do wykonania tego pliku, ale nie ma roota lub roota grupy użytkowników, root nadal będzie mógł wykonać ten plik (testowany na OS X 10.10, 10.11 i serwerze Ubuntu 15.04).
Poza tymi przypadkami, root nie ma prawie nic.
Istnieje jednak funkcja zwana trybem jądra (w przeciwieństwie do trybu użytkownika).
O ile mi wiadomo, w zdrowym systemie tylko jądro, rozszerzenia jądra i sterowniki działają w trybie jądra, a wszystko inne (w tym powłoka, z której logujesz się jako root) działa w trybie użytkownika.
Można zatem argumentować, że „samo rootowanie to za mało”. Jednak w większości systemów użytkownik root może załadować moduły jądra, które z kolei będą działać w trybie jądra, skutecznie dając rootowi sposób uruchamiania kodu w trybie jądra.
Istnieją jednak systemy (np. IOS), w których nie jest to (arbitralnie) możliwe, przynajmniej nie bez wykorzystania zabezpieczeń. Wynika to głównie ze zwiększonego bezpieczeństwa, takiego jak wymuszanie podpisywania kodu.
Na przykład w procesorach iDevices wbudowane są klucze szyfrujące AES , do których można uzyskać dostęp tylko z trybu jądra. Moduły jądra mogą uzyskać do nich dostęp, ale kod w tych modułach jądra musiałby zostać podpisany przez Apple, aby jądro je zaakceptowało.
W systemie OS X od wersji 10.11 (El Capitan) istnieje także tak zwany „tryb bez rootowania” (choć nazwa wprowadza w błąd, ponieważ root nadal istnieje), który skutecznie zabrania rootowania niektórych rzeczy, które instalatorzy mogą nadal robić.
Cytując tę doskonałą odpowiedź na AskDifferent :
źródło
gcc -o hello hello.c && chmod 400 hello && /lib64/ld-linux-x86-64.so.2 ./hello
daje oczekiwanyHello, World!
wynik,/lib64/ld-linux-x86-64.so.2
to plik wykonywalny, a./hello
tylko argument? Bo to jak przekazywanie pliku tekstowego zawierającego kod PHP do interpretera PHP ... lub uruchamianie skryptu bash przy użyciubash ./my_script
...Wspomniane „wykonanie rdzenia systemu” znajduje się pod
root
kontrolą, np. Poprzez moduły jądra z możliwością ładowania. Oczywiście przy założeniu, że ładowanie modułów jądra jest obsługiwane przez jądro, nikt nie może wykonywać akcji, które są niewykonalne, nawetroot
.To samo dotyczy procesów systemowych.
root
wolno zabijać dowolny proces, ale nie można zatrzymać procesu działającego w trybie jądra bez naruszenia integralności jądra, więc natychmiastowe zatrzymanie takiego przetwarzania jest po prostu niemożliwe. Zauważ, żeroot
nie będzie odmowa zabicia tych procesów, samo zabicie po prostu nie przyniesie żadnego efektu.Wreszcie tryb rzeczywisty: jądro Linuksa nie obsługuje go, więc ponownie nikt nie może zrobić tego, co niemożliwe, nawet
root
.@Siguza wspomniał o wykonywaniu plików bez
x
pozwolenia, co jest całkiem możliwe dlaroot
użytkownika:źródło
/proc/kmem
) poprzez odwołanie możliwości.Jednym z przykładów może być zmodyfikowanie o niezmiennej pliku: Można ustawić atrybut pliku
i
zchattr
sprawia, że niezmienne plików nawet do korzenia. Na przykład:Zauważ, że plik wygląda jako normalny zapisywalny plik na
ls -l
wyjściu:Aby zobaczyć
i
atrybut, musisz użyćlsattr
:Strona podręcznika chattr zawiera następujące informacje na temat
i
atrybutu:Jednak root może łatwo cofnąć niezmienność:
źródło
W FreeBSD nie można używać
gmirror
na już zamontowanej partycji, nawet jako root:Musisz ustawić
sysctl
(kern.geom.debugflags=16
), aby móc to zrobić.root
jest uprzywilejowanym użytkownikiem, ale prawa te są nadawane przez jądro. Jądro ma więcej uprawnień niżroot
.źródło
Zakładając współpracę od samego użytkownika root,
root
można uniemożliwić dostęp do mocowań FUSE (z opcjamiallow_other
luballow_root
), ale dzieje się tak, ponieważ FUSE został zaprojektowany w taki sposób. Ponieważ FUSE znajduje się na warstwie wirtualnej, może zwracać dowolny błąd, który mu się podoba, w oparciu o logikę, w przeciwieństwie do zwykłych modułów urządzeń blokowych, które starają się być tak przezroczyste i cienkie, jak to możliwe, delegując uprawnienia na inną warstwę.Nie zapobiega to wyłączeniu opcji przez użytkownika root lub zamianie modułu FUSE na moduł, który dyskretnie odrzuca opcję, chyba że system plików zostanie ustawiony jako tylko do odczytu. Prowadzi to jednak tylko do sytuacji „kto obserwuje stróżów”: w jaki sposób można potwierdzić, że system nie kłamie? Twoja powłoka może nawet siedzieć w chroocie, który pokazuje ci legalny moduł FUSE, podczas gdy jądro faktycznie uruchamia jego złowrogą wersję.
źródło
Powiedziałbym, że niemożność wykonywania plików niewykonywalnych jest trywialnie ograniczeniem, ponieważ zależy od uprawnień do plików. (Można to obejść za pomocą /lib64/ld-linux-x86-64.so.2 dla pliku, którego nie można wykonać, ale nie pliku na montowaniu bez wykonania)
Istnieje również kwestia obowiązkowych blokad plików, które uniemożliwiają edycję pliku, jeśli plik jest aktualnie używany przez proces, chociaż superużytkownik może go zabić.
W pewnym momencie superużytkownik nie mógł odmontować urządzenia, gdy było ono zajęte, ale można to teraz zrobić za pomocą leniwego umountu.
Inne ograniczenia to:
nie może modyfikować niezmiennych plików i może dołączać tylko do plików tylko do dołączania (linux pozwala superużytkownikowi na usunięcie niezmiennych i dołączanie tylko flag na dowolnym poziomie działania, jednak częściowo pokonując ich cel)
nie może pisać na montowaniu tylko do odczytu ani wykonywać niczego na montowaniu bez wykonania
nie może powiązać niemożliwego do wiązania wierzchowca
nie może ponownie zamontować systemu plików jako do odczytu i zapisu, jeśli jego urządzenie blokowe jest tylko do odczytu
nie może statować niczego na zamontowanym bezpieczniku będącym własnością innego użytkownika, chyba że jest on zamontowany jako allow-other lub allow-root
nie może naruszać ustawień SELinux
celowe ograniczenia właściwe dla samego systemu, które wpływają na rootowanie:
nie można bezpośrednio ustawić czasu c pliku (ani czasu urodzenia, jeśli kiedykolwiek został zaimplementowany)
nie można wyświetlić haseł jako zwykłego tekstu
źródło