Czy jest jakiś sposób, aby atakujący mógł użyć mkdir do złamania zabezpieczeń systemu?

22

Konfiguruję konto użytkownika z ograniczeniami dla użytkownika ricardo, kłopotliwego użytkownika w moim systemie. Chcę mu przyznać prawo do korzystania z katalogów sudo, co czasami musi zrobić. Rozważam tę zasadę w moim /etc/sudoerspliku:

ricardo   ALL=(root) NOPASSWD: /bin/mkdir

Korzystając tylko z tej zasady, czy Ricardo mógłby umyślnie lub przypadkowo narazić system na szwank?

Ricardo Altamirano
źródło
2
Jeśli masz system plików ze statyczną liczbą i-węzłów, może zużyć wszystkie twoje i-węzły.
jordanm
2
@schaiba Lubi majsterkować i sprawdzać, czy może wykorzystać system i nie zawsze czyta strony podręcznika tak często, jak powinien.
Ricardo Altamirano
8
Właściwa edukacja użytkowników w połączeniu z brakiem sudo byłaby zalecana ode mnie.
schaiba
2
Jak mówi @schaiba, możesz korzystać z takich użytkowników, ucząc ich i powierzając im obowiązki (pod ścisłym nadzorem). Widziałem wojny między sysdaminami a użytkownikami, ponieważ pierwsi próbowali zbyt mocno zablokować system. Liczba sysadminów przekroczyła liczbę użytkowników 10 do 1, a nawet wtedy ( bez dzisiejszego dostępu do Internetu!) Porażka sysdaminów była upokarzająca. Nigdy nie zajmuj takiej pozycji!
vonbrand
2
Tak jest w przypadku jednego Ricardo za dużo. A przynajmniej tak powiedział BOFH ...
Deer Hunter

Odpowiedzi:

21

Podejrzewam, że taki atak zadziałałby, gdy „coś” to moduł jądra, który spróbuje załadować po zamontowaniu rootfs:

$ sudo mkdir -m 777 /lib/modules/`uname -r`/a
$ cp evil.ko /lib/modules/`uname -r`/a/«something».ko

Zauważ też, że możesz użyć innych nazw, w zależności od aliasów zadeklarowanych w module. Domyślam się, że nie zostanie załadowany, dopóki nie uruchomi się depmod, co nastąpi następnym razem, gdy pojawi się aktualizacja jądra - więc mkdirnie pojawi się nawet ostatnio w dzienniku sudo.

W / etc jest wiele rzeczy, które czytają wszystkie pliki w katalogu, czasem rekurencyjnie. Co gorsza, niektóre z tych katalogów domyślnie nie istnieją, a jedynym sposobem na ich poznanie jest przeczytanie strony podręcznika, skryptów inicjujących itp. Dla programu, który ich używa. Niektóre, nawet gorzej, są przestarzałe i nie są już udokumentowane.

edytuj: Myśl o kilku innych katalogach, w tym w /usr/local:

  • /usr/local/lib/perl/5.14.2(różni się w zależności od wersji Perla, spróbuj perl -Vsię dowiedzieć). Utwórz tam Filepodkatalog i umieść Find.pmw nim. Teraz, gdy ktokolwiek użyje File::Find, będzie używał wersji atakującego. Podobnie, zrób to samo z Getopt::Long. Narzędzia systemowe są często pisane w Perlu, więc prawdopodobnie daje to root. (Spróbuj ack-grep --color -a 'use.+::' /usr/sbin | less -R)
  • Myślę, że Python, Ruby itp. Mają podobne katalogi. Narzędzia systemowe są również napisane w języku Python.
  • Obal wiele rzeczy, które ktoś kompiluje, z podkatalogami /usr/local/include.
derobert
źródło
Och, ale jeśli <zły użytkownik> może skopiować moduły do ​​miejsca, w którym jądro je załaduje, gra się kończy przed startem.
vonbrand
1
@vonbrand <zły użytkownik> zwykle nie może, ale użył swojego sudo mkdirdo stworzenia nowego katalogu, w którym mógłby.
derobert
20

Działając mkdirjako root, użytkownik może zablokować innym procesom / użytkownikom tworzenie nowych plików i katalogów, tworząc wcześniej katalogi o identycznych nazwach (i / lub złych prawach).

Może to mieć znaczenie z punktu widzenia bezpieczeństwa, zwłaszcza w przypadku plików dziennika i plików blokujących .

Jak zauważył Jordan , można również wykorzystać maksymalną liczbę i- węzłów, które mogą zablokować cały system.

Dodając użytkownika do określonych grup (lub używając list ACL ), powinieneś być w stanie rozwiązać problemy bez przyznawania jakichkolwiek praw przez sudo.

Jofel
źródło
Świetne punkty. Prawdopodobnie opuszczę mkdirlistę poleceń, których Ricardo może używać.
Ricardo Altamirano
Jeśli chodzi o wyczerpywanie i-węzłów, zwykły for((i = 0;; i++)); do touch $i; doneda sobie radę (bashism, przepraszam; ale masz pomysł).
vonbrand
@vonbrand Z wyjątkiem tego, że nie jest to root, więc zostanie zatrzymany przez przydział. Oczywiście, inne sudopolecenia rozważane przez OP mogą również pozwolić na wyczerpanie i-węzłów; OP musi być świadomy tego wektora DoS.
derobert
11

Powinieneś go przekierować do więzienia chroot. Lub jeszcze lepiej, dla małej maszyny wirtualnej, że może się zawiesić raz na godzinę. Wszystko, co musisz zrobić, to dostarczyć nową kopię.

ott--
źródło
Bardzo to polecam. Daj mu dostęp do roota na własnej maszynie wirtualnej.
emory
do chroota ^ H ^ H ^ H ^ H ^ Hounty więzienia ...
Deer Hunter
6

Istnieją możliwości tworzenia katalogów z dostępem do zapisu. Dzięki mkdir -m 777 blahtemu ricardoużytkownik może pisać, co chce, w nowym katalogu. Potrzebny byłby w systemie proces już działający jako inny użytkownik, który ponownie uruchomi drzewo katalogów, aby załadować config, skrypty lub moduły. Następnie użytkownik może ewentualnie dodać własne rzeczy do załadowania lub uruchomienia. Pierwszą rzeczą, o której mogę pomyśleć, jest uruchomienie serwera WWW, który może wykonywać php lub cgi. Następnie możesz uruchamiać skrypty jako ten użytkownik. Staram się wymyślić więcej przykładów z prawdziwego świata, zwłaszcza roottych, ale jestem pewien, że są.

ssh jest przykładem demona, który przechwytuje tego rodzaju scenariusz. Jeśli utworzyłeś .sshkatalog dla użytkownika, który go nie miał i umieściłeś własny authorized_hostsplik na swoim miejscu. sshdzauważa, że ​​uprawnienia do katalogów są zbyt otwarte i ignoruje klucz publiczny.

Na pewno możesz sprawić sobie kłopot, tworząc katalogi, w których mają się pojawiać pliki (takie jak przejściowe pliki tmp lub swap), których wiele programów nie poradziłoby sobie dobrze.

Możesz stworzyć wiele grup, ale wygląda na to, że nic z nimi nie robisz. Być może będziesz w stanie sprowadzić system przynajmniej na kolana. Zabranie sshd przez zabójcę OOM zajęło około 10000 grup na pudełku z 256M .

Jeśli kontrolujesz -mopcję mkdiri UMASK sudośrodowiska, myślę, że wróciło to do uciążliwości.

Matt
źródło