
Warunek wyścigu w Netlink prowadzący do UAF w jądrze
Omówienie jednodniowego UAF w jądrze Linuksa osiągalnego z nieuprzywilejowanej przestrzeni nazw użytkownika, z deterministycznym prymitywem exploita.
· 3 min czytania
#kernel#linux#exploit#re
Podsumowanie
Podwójne zwolnienie w podsystemie netlink staje się use-after-free pod presją współbieżności, dając arbitralny prymityw zapisu do jądra.
Przyczyna
Licznik referencji nlk->groups jest dekrementowany, zanim ponownie pozyskany zostanie lock gniazda, co pozwala równoległemu bind() zaobserwować i ponownie użyć zwolnionej pamięci.
spin_unlock(&nlk->lock);
kfree(nlk->groups); // zwolnione tutaj
// okno wyścigu
spin_lock(&nlk->lock);
nlk->groups[grp] = ...; // UAFEksploatacja
Zwolniony slab jest ponownie wykorzystany przez spryskany obiekt msg_msg. Nadpisanie m_ts daje OOB read; pivot przez pipe_buffer daje kontrolę nad RIP.
Łata
Trzymaj lock gniazda wokół zwolnienia i ponownie waliduj nlk->groups po ponownym jego pozyskaniu.