Rasetilstand i Linux-kjernens søppelsamler som kan føre til privilegieeskalering

Jann Horn fra Google Project Zero-teamet, som en gang identifiserte Spectre- og Meltdown-sårbarhetene, publiserte en teknikk for å utnytte en sårbarhet (CVE-2021-4083) i Linux-kjernens søppelsamler. Sårbarheten skyldes en rasetilstand når du rydder opp i filbeskrivelser på unix-sockets og lar potensielt en lokal uprivilegert bruker kjøre koden sin på kjernenivå.

Problemet er interessant fordi tidsvinduet som rasetilstanden oppstår i ble estimert til å være for lite til å skape ekte utnyttelser, men forfatteren av studien viste at selv slike i utgangspunktet skeptiske sårbarheter kan bli kilden til reelle angrep hvis utnyttelsesskaperen har nødvendige ferdigheter og tid. Yann Horn viste hvordan du ved hjelp av filigran-manipulasjoner kan redusere rasetilstanden som oppstår når du kaller funksjonene close() og fget() samtidig til en fullt utnyttelig bruk-etter-fri sårbarhet og oppnå tilgang til en allerede frigjort data struktur inne i kjernen.

En rasetilstand oppstår under prosessen med å lukke en filbeskrivelse mens du kaller close() og fget() samtidig. Anropet til close() kan skje før fget() kjøres, noe som vil forvirre søppelsamleren fordi filstrukturen ifølge refcount vil ikke ha eksterne referanser, men vil forbli knyttet til filbeskrivelsen, dvs. Søppelsamleren vil tro at den har eksklusiv tilgang til strukturen, men faktisk vil den gjenværende oppføringen i filbeskrivelsestabellen i en kort periode fortsatt peke på at strukturen frigjøres.

For å øke sannsynligheten for å komme i en løpstilstand ble det brukt flere triks, som gjorde det mulig å øke sannsynligheten for utnyttelsessuksess til 30 % ved innføring av systemspesifikke optimaliseringer. For å for eksempel øke tiden for tilgang til en struktur med filbeskrivelser med flere hundre nanosekunder, ble data fjernet fra prosessorens cache ved å forsøple cachen med aktivitet på en annen CPU-kjerne, noe som gjorde det mulig å hente strukturen fra minnet i stedet for fra den raske CPU-cachen.

Den andre viktige funksjonen var bruken av avbrudd generert av en maskinvaretidtaker for å øke løpstilstandstiden. Øyeblikket ble valgt slik at avbruddsbehandleren skulle avfyre ​​når en løpstilstand oppstod og avbryte kjøringen av koden i en stund. For ytterligere å forsinke tilbakeføringen av kontrollen, ble rundt 50 tusen oppføringer i ventekøen generert ved hjelp av epoll, som krevde søk gjennom avbruddsbehandleren.

Teknikken for å utnytte sårbarheten ble avslørt etter en 90-dagers taushetsperiode. Problemet dukker opp siden kjernen 2.6.32 og ble løst i begynnelsen av desember. Rettelsen ble inkludert i kjerne 5.16 og ble også overført til LTS-grener av kjernen og kjernepakkene levert i distribusjoner. Det er bemerkelsesverdig at sårbarheten ble identifisert under analysen av et lignende problem CVE-2021-0920, som manifesterer seg i søppelsamleren når MSG_PEEK-flagget behandles.

Kilde: opennet.ru

Legg til en kommentar