Luka w standardowej bibliotece Rusta

W standardowej bibliotece Rusta zidentyfikowano lukę (CVE-2022-21658) wynikającą z wyścigu w funkcji std::fs::remove_dir_all(). Jeśli ta funkcja zostanie użyta do usunięcia plików tymczasowych w uprzywilejowanej aplikacji, osoba atakująca może usunąć dowolne pliki systemowe i katalogi, do których normalnie osoba atakująca nie miałaby dostępu.

Luka wynika z nieprawidłowej implementacji sprawdzania dowiązań symbolicznych przed rekursywnym usuwaniem katalogów. Zamiast zapobiegać śledzeniu dowiązań symbolicznych, Remove_dir_all() najpierw sprawdza, czy plik jest dowiązaniem symbolicznym. Jeśli zdefiniowano łącze, to jest ono usuwane jako plik, a jeśli jest to katalog, to wywoływana jest rekursywna operacja usuwania treści. Problem polega na tym, że między sprawdzeniem a rozpoczęciem operacji usuwania występuje niewielkie opóźnienie.

W momencie, gdy kontrola została już przeprowadzona, ale operacja wyliczania katalogów do usunięcia jeszcze się nie rozpoczęła, atakujący może zastąpić katalog plikami tymczasowymi z dowiązaniem symbolicznym. Jeśli trafi w odpowiednim momencie, funkcja usuwania_dir_all() potraktuje dowiązanie symboliczne jako katalog i rozpocznie usuwanie treści, na którą wskazuje łącze. Pomimo tego, że powodzenie ataku zależy od dokładności wybranego momentu zamiany katalogu i trafienie we właściwy moment za pierwszym razem jest mało prawdopodobne, podczas eksperymentów badaczom udało się osiągnąć powtarzalny, skuteczny atak po wykonaniu exploita w ciągu kilka sekund.

Dotyczy to wszystkich wersji Rusta od 1.0.0 do 1.58.0 włącznie. Problem został na razie rozwiązany w formie łatki (poprawka zostanie uwzględniona w wersji 1.58.1, która ma nastąpić w ciągu kilku godzin). Możesz monitorować eliminację luki w dystrybucjach na tych stronach: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Wszystkim użytkownikom programów Rust działających z podwyższonymi uprawnieniami i korzystających z funkcji usuwania_dir_all zaleca się pilną aktualizację Rusta do wersji 1.58.1. Co ciekawe, wydana łatka nie rozwiązuje problemu na wszystkich systemach, np. w systemie REDOX OS i wersjach macOS wcześniejszych niż 10.10 (Yosemite) luka nie jest blokowana ze względu na brak flagi O_NOFOLLOW, która wyłącza śledzenie symboli spinki do mankietów.

Źródło: opennet.ru

Dodaj komentarz