Dlaczego źle jest zapisywać pliki root w katalogu, który nie jest własnością root?

28

Pojawiło się to w komentarzu do innego pytania i bardzo bym chciał, gdyby ktoś mógł mi wyjaśnić przyczyny tego.

Zasugerowałem, aby Apache zarejestrował błędy dla danego VHost w katalogu osobistym użytkownika. Zostało to zestrzelone, ponieważ było niepewne. Czemu?

Poprosiłem o wyjaśnienie w komentarzu do odpowiedzi, ale jedyne, co otrzymałem, to to, że pisanie roota w folderze nie będącym własnością roota jest niepewne. Czy ktoś mógłby to wyjaśnić?

Dzięki,

Bart.

Bart B.
źródło
4
Co robi Apache działający jako root - zasada najmniejszych przywilejów jest przeciwko temu!
Jonathan Leffler
1
Apache działa jako www, ale jest uruchamiany jako root, więc może się łączyć z portem 80 zgodnie z normą. Najwyraźniej loguje się również jako root.
Bart B

Odpowiedzi:

31

Ponieważ użytkownik zło może złośliwie próbują wskazać plik pisze w innym miejscu . To nie jest takie proste, ale naprawdę możliwe.root

Na przykład, jeśli użytkownik znajdzie sposób na utworzenie dowiązania symbolicznego z domniemanego dziennika Apache do, powiedzmy, / etc / shadow , nagle będziesz mieć bezużyteczny system. Apache ( root) nadpisze dane uwierzytelniające użytkowników, powodując awarię systemu.

ln -s /etc/shadow /home/eviluser/access.log

Jeśli plik access.log nie jest zapisywalny przez użytkownika, przejęcie go może być trudne, ale lepiej jest unikać tej możliwości!

Opcją może być użycie programu logrotate do wykonania zadania , tworząc łącze do pliku, który już nie istnieje, ale ten program logrotate zostanie nadpisany, gdy tylko dzienniki wzrosną:

ln -s /etc/shadow /home/eviluser/access.log.1

Uwaga :

Symlink metoda jest tylko jednym z możliwych ataków, biorąc pod uwagę jako dowód koncepcji.

Bezpieczeństwo musi być zapewnione przez umysł Białej Listy , a nie umieszczanie na czarnej liście tego, o czym wiemy, że jest problemem.

AlberT
źródło
Czy istnieje sposób na ustawienie uprawnień, aby mogli tylko czytać plik, a nie usuwać, edytować lub wykonywać cokolwiek innego (np. Chown, chmod itp.)?
Joshua
powinieneś wykonać tę operację na każdym możliwym pliku docelowym! ten plik do zapisu jest podobny, a nie sam link, który jest własnością atakującego podczas jego tworzenia.
drAlberT
2
@Joshua: chown można wykonać tylko przez rootowanie. chmod może wykonać każdy, kto jest właścicielem pliku. IIRC, zmiana nazwy może być dokonana przez każdego, kto jest właścicielem katalogu. Jak wspomina AlberT, utworzenie łącza przed utworzeniem pliku przez root może być wykonane przez każdego, kto może napisać do katalogu.
atk
2
@atk: Ponadto każdy, kto jest właścicielem katalogu, może na ogół usunąć z niego pliki (chyba że +tustawiony jest bit lepki ), nawet jeśli nie mają one uprawnień do zapisu do samych plików (ponieważ unlink () to zapis do katalogu, a nie plik). Nawet jeśli root utworzy plik wcześniej, właściciel katalogu nadal może go usunąć i zastąpić dowiązaniem symbolicznym do czegoś innego.
James Sneeringer
1
Jeśli eviluser może pisać w / home / eviluser (lub może zmienić uprawnienia do katalogu - są ich właścicielami, IOW), to nie ma znaczenia, jakie są uprawnienia do access.log; Zły użytkownik może (ponownie) przenieść plik i umieścić w nim swoje dowiązanie symboliczne. Kolejne pytanie dotyczy tego, czy oprogramowanie zwraca uwagę na to, co otwiera.
Jonathan Leffler
1

Ogólna zasada, zgodnie z którą procesy nie zapisują się do katalogu, którego nie są właścicielami lub którym nie ufają, jest dobra. Ale w tym konkretnym przypadku uzasadnione jest zaufanie, że kod Apache otwiera dziennik za pomocą O_NOFOLLOWetc: logowanie do katalogu domowego użytkownika to powszechna konfiguracja.

poolie
źródło