Działanie fs.protected
Napisał: Patryk Krawaczyński
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ń):
- CVE-2000-1134
- CVE-2007-3852
- CVE-2008-0525
- CVE-2009-0416
- CVE-2011-4834
- CVE-2015-1838
- CVE-2015-7442
- CVE-2016-7489
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