CVE-2025-40271 w jądrze Linux: lokalna eskalacja uprawnień przez błąd use-after-free w procfs - Security Bez Tabu

CVE-2025-40271 w jądrze Linux: lokalna eskalacja uprawnień przez błąd use-after-free w procfs

Cybersecurity news

Wprowadzenie do problemu / definicja

W jądrze Linux ujawniono podatność CVE-2025-40271, która może prowadzić do lokalnej eskalacji uprawnień. Problem dotyczy systemu plików procfs, a konkretnie błędu use-after-free w funkcji proc_readdir_de(). Oznacza to, że lokalny użytkownik może w określonych warunkach doprowadzić do użycia przez jądro pamięci, która została już zwolniona, a następnie wykorzystać ten stan do uzyskania uprawnień roota.

W skrócie

CVE-2025-40271 to lokalna podatność w jądrze Linux, obecna w wielu gałęziach rozwojowych i stabilnych. Jej źródłem jest nieprawidłowa obsługa usuwania wpisów z wewnętrznej struktury procfs, co pozostawia nieaktualne wskaźniki i umożliwia dereferencję zwolnionej struktury proc_dir_entry.

  • typ podatności: use-after-free,
  • wektor ataku: lokalny,
  • skutek: eskalacja uprawnień do roota lub destabilizacja systemu,
  • warunek: możliwość uruchamiania kodu lokalnie,
  • priorytet działań: szybka aktualizacja jądra.

Kontekst / historia

Podatność została powiązana z warstwą fs/proc, odpowiedzialną za prezentowanie informacji o stanie systemu i procesach przez procfs. Problem ujawnił się podczas scenariuszy współbieżnych operacji, w których równolegle wykonywano odczyt wpisów katalogów oraz dynamiczne usuwanie obiektów związanych z interfejsami sieciowymi.

Choć nie jest to luka zdalna, jej znaczenie pozostaje wysokie. W praktyce wystarczy wcześniej uzyskany dostęp do zwykłego konta użytkownika, kompromitacja usługi albo uruchomienie kodu w kontenerze, aby próbować wykorzystać błąd jako drugi etap ataku. To czyni CVE-2025-40271 szczególnie istotnym w środowiskach wielodostępnych, serwerach współdzielonych oraz infrastrukturze kontenerowej.

Analiza techniczna

Źródłem problemu jest sposób usuwania elementu proc_dir_entry z drzewa czerwono-czarnego używanego przez procfs. Samo usunięcie węzła nie czyściło w pełni jego stanu, przez co zwolniona struktura mogła nadal wyglądać jak aktywny element drzewa. Jeśli inny wątek w tym samym czasie wykonywał odczyt wpisów katalogu przez getdents64(), iterator mógł wejść na już zwolniony obiekt.

W praktyce daje to klasyczny scenariusz use-after-free w przestrzeni jądra. Publicznie opisany łańcuch eksploatacji zakładał równoczesne przeglądanie katalogów w /proc oraz usuwanie interfejsów sieciowych. Następnie zwolniona pamięć mogła zostać ponownie zajęta przez kontrolowane obiekty z tych samych cache slab, co umożliwiało wyciek informacji z pamięci jądra.

Kolejny etap polegał na przejściu od wycieku do uzyskania prymitywu zapisu. W opisywanym scenariuszu wykorzystano nadpisanie modprobe_path, co jest znaną techniką eskalacji uprawnień w Linuksie. Taka ścieżka ataku nie opiera się na bezpośrednim wykonaniu kodu w jądrze, lecz na manipulacji danymi, dlatego część klasycznych mechanizmów ochronnych nie zatrzymuje jej wprost.

Poprawka eliminuje problem przez bezpieczniejsze usuwanie wpisu i wyczyszczenie stanu węzła po operacji usunięcia z drzewa. Dzięki temu iterator nie traktuje już usuniętego elementu jako ważnego wpisu i nie próbuje do niego wracać.

Konsekwencje / ryzyko

Najpoważniejszym skutkiem CVE-2025-40271 jest możliwość lokalnej eskalacji uprawnień do poziomu roota. W przypadku skutecznego wykorzystania atakujący może uzyskać pełną kontrolę nad hostem, co oznacza dostęp do danych, możliwość wyłączania mechanizmów ochronnych i dalsze poruszanie się w infrastrukturze.

Drugą kategorią ryzyka jest stabilność systemu. Błędy use-after-free w jądrze często prowadzą także do awarii, zawieszeń i panik kernela. Nawet nieudana próba eksploatacji może więc skutkować odmową usługi, szczególnie w systemach o dużej liczbie procesów i intensywnym wykorzystaniu namespace’ów lub wirtualnych interfejsów sieciowych.

  • wysokie ryzyko dla hostów wieloużytkownikowych,
  • istotne zagrożenie dla środowisk kontenerowych,
  • możliwość wykorzystania po wstępnej kompromitacji aplikacji,
  • ryzyko awarii operacyjnych i niedostępności usług.

Rekomendacje

Podstawowym działaniem ochronnym jest niezwłoczna aktualizacja jądra Linux do wersji zawierającej poprawkę. Organizacje powinny potwierdzić, które linie utrzymaniowe są używane w środowisku produkcyjnym, testowym i developerskim, a następnie zaplanować szybkie wdrożenie aktualizacji na wszystkich hostach.

Warto również ograniczyć możliwości budowania warunków potrzebnych do eksploatacji. Szczególnie ważna jest weryfikacja, czy w systemach aktywne są nieuprzywilejowane przestrzenie nazw użytkownika oraz czy zwykli użytkownicy mogą swobodnie tworzyć i usuwać obiekty sieciowe.

  • przeprowadzić inwentaryzację wersji jądra na serwerach, maszynach wirtualnych i węzłach kontenerowych,
  • nadać priorytet łataniu systemów współdzielonych, bastionów i środowisk CI/CD,
  • monitorować logi pod kątem panik kernela, awarii i anomalii związanych z /proc,
  • ograniczyć lokalne wektory wykonania kodu oraz uprawnienia użytkowników,
  • wykonać testy regresyjne po wdrożeniu zaktualizowanego kernela.

Podsumowanie

CVE-2025-40271 pokazuje, że lokalne błędy w jądrze Linux nadal stanowią bardzo poważne zagrożenie, zwłaszcza w nowoczesnych środowiskach opartych na kontenerach i współdzielonych zasobach. Błąd use-after-free w proc_readdir_de() umożliwia uzyskanie dostępu do zwolnionej pamięci jądra, a w sprzyjających warunkach także przejęcie uprawnień roota.

Z perspektywy obrony kluczowe pozostają szybkie aktualizacje, ograniczanie zbędnych mechanizmów lokalnej izolacji tam, gdzie nie są konieczne, oraz bieżące monitorowanie hostów pod kątem prób eskalacji uprawnień i nietypowych awarii kernela.

Źródła

  1. Exploit Database – Linux Kernel proc_readdir_de() 6.18-rc5 – Local Privilege Escalation
  2. NVD – CVE-2025-40271 Detail
  3. Linux Kernel Commit 895b4c0c79b092d732544011c3cecaf7322c36a1