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] = ...; // UAF

Eksploatacja

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.


sharelinkedinx / twitter