NFsec Logo

Działanie fs.protected

20/03/2023 w Bezpieczeństwo Brak komentarzy.  (artykuł nr 852, ilość słów: 646)

P

ocząwszy od wersji 4.19 jądra systemu Linux możliwe jest uniemożliwienie otwierania FIFO lub zwykłych plików niebędących własnością użytkownika w globalnie zapisywalnych katalogach z ustawionym sticky bit (np. /tmp). Ochronę tę można stosować osobno dla FIFO, zwykłych plików, symlinków / hardlinków poprzez odpowiednie ustawienia z poziomu sysctl. Ustawienia te oparte są na łatce HARDEN_FIFO, która znajdowała się w projekcie Openwall Solar Designera, a ich celem jest utrudnienie ataków polegających na spoofingu danych. Poniżej znajduje się krótka lista starych luk, którym można było zapobiec dzięki tej funkcji (niektóre z nich pozwalają nawet na eskalację uprawnień):

Ochrona ta jest aktywowana automatycznie, jeśli nasz system korzysta z systemd w wersji 241 lub wyższej z wspomnianym jądrem w wersji 4.19 lub wyższej. Jeśli wersja naszego jądra Linuksa wspiera tę funkcję, ale nie używamy jeszcze systemd w odpowiedniej wersji, możemy ją aktywować samodzielnie ustawiając odpowiednie ustawienia za pomocą sysctl:

sysctl -w fs.protected_fifos=1
sysctl -w fs.protected_regular=2

Przykład zapisu przez użytkownika agresor do pliku /tmp/data będącego własnością użytkownika www-data bez działania ochrony (fs.protected_regular=0):

agresor@darkstar:~$ ls -al /tmp/data
-rwxrwxrwx 1 www-data www-data 0 Mar 20 19:44 /tmp/data
agresor@darkstar:~$ echo inject > /tmp/data
agresor@darkstar:~$ cat /tmp/data
inject

Przykład zapisu przez użytkownika agresor do pliku /tmp/data będącego własnością użytkownika www-data z pierwszym poziomem ochrony (fs.protected_regular=1):

agresor@darkstar:~$ ls -al /tmp/data
-rwxrwxrwx 1 www-data www-data 7 Mar 20 19:45 /tmp/data
agresor@darkstar:~$ echo inject_code >> /tmp/data
-bash: /tmp/data: Permission denied

Przy ustawieniu poziomu na “2” ochrona dotyczy również katalogów z ustawionym sticky bit z możliwością zapisu dla grupy. To samo tyczy się ochrony sym- i hard- linków, które w globalnie zapisywalnych katalogach umożliwiały ataki ToCToU. Częstą metodą wykorzystywania tej luki było krzyżowanie się uprawnień podczas podążania za danym dowiązaniem symbolicznym (tj. użytkownik root podążał za dowiązaniem symbolicznym należącym do innego użytkownika w systemie):

root@darkstar:~# ls -al /tmp
total 8
drwxrwxrwt  2 root    root    4096 Mar 20 20:56 .
drwxr-xr-x 19 root    root    4096 Mar 20 19:55 ..
lrwxrwxrwx  1 agresor agresor   14 Mar 20 20:56 alice_mirror -> /usr/local/bin
root@darkstar:~# cd /tmp/alice_mirror
root@darkstar:/tmp/alice_mirror#

Tutaj również rozwiązaniem było niedopuszczenie do podążania za dowiązaniami symbolicznymi, gdy użytkownik podążający i właściciel dowiązania nie są tą samą osobą w globalnie zapisywalnym katalogu z ustawionym bitem sticky:

sysctl -w fs.protected_symlinks=1
root@darkstar:~# cd /tmp/alice_mirror
-bash: cd: /tmp/alice_mirror: Permission denied

Twarde dowiązania mogą być nadużywane w podobny sposób jak te symboliczne, ale ich ochrona nie ogranicza się do katalogów zapisywalnych przez wszystkich. Jeśli katalog /etc/ i /home/ znajdują się na tej samej partycji to zwykły użytkownik może utworzyć twarde dowiązanie do /etc/shadow w swoim katalogu domowym:

agresor@darkstar:~$ ln /etc/shadow shadow
agresor@darkstar:~$ ls -al | grep shadow
-rw-r----- 2 root    shadow   1057 Nov  7 20:20 shadow

Jak widzimy plik zachowuje nadal pierwotnego właściciela i uprawnienia, ale mimo to uprzywilejowane programy, które były bezpieczne dla dowiązań symbolicznych, mogą omyłkowo uzyskać dostęp do pliku za pośrednictwem takiego twardego dowiązania. W dodatku możliwe jest przeprowadzenie lokalnego ataku odmowy usługi (ang. local Denial of Service) poprzez pominięcie przydziału (ang. quota) dyskowego i wyczerpanie miejsca na dysku wypełniając twardymi dowiązaniami katalog z globalnym zapisem dla wszystkich. Rozwiązaniem jest niedopuszczenie do tworzenia twardych dowiązań do plików, do których dany użytkownik nie byłby w stanie pierwotnie zapisywać danych:

sysctl -w fs.protected_hardlinks=1
agresor@darkstar:~$ ln /etc/shadow shadow
ln: failed to create hard link 'shadow' => '/etc/shadow': Operation not permitted

Bardziej bezpieczne ustawienia dla dowiązań działają w Linuksie 3.6 oraz wyższych i prawdopodobnie są już domyślnie włączone w Twoim systemie.

Więcej informacji: Protected FIFOs and regular files, KernelHardening

Kategorie K a t e g o r i e : Bezpieczeństwo

Tagi T a g i : , , , , , , , ,

Komentowanie tego wpisu jest zablokowane.