Racetilstand i Linux-kernens skraldeopsamler, der kan føre til privilegieeskalering

Jann Horn fra Google Project Zero-teamet, der engang identificerede Spectre- og Meltdown-sårbarhederne, udgav en teknik til at udnytte en sårbarhed (CVE-2021-4083) i Linux-kernens skraldeopsamler. Sårbarheden skyldes en racetilstand ved oprydning af filbeskrivelser på unix-sockets og tillader potentielt en lokal uprivilegeret bruger at udføre deres kode på kerneniveau.

Problemet er interessant, fordi det tidsvindue, hvor løbet tilstanden opstår, blev estimeret til at være for lille til at skabe reelle udnyttelser, men forfatteren af ​​undersøgelsen viste, at selv sådanne oprindeligt skeptiske sårbarheder kan blive kilden til virkelige angreb, hvis udnyttelsesskaberen har de nødvendige færdigheder og tid. Yann Horn viste, hvordan man ved hjælp af filigranmanipulationer kan reducere racetilstanden, der opstår, når man kalder funktionerne close() og fget() samtidigt til en fuldt udnyttelig use-after-free sårbarhed og opnå adgang til en allerede frigivet data struktur inde i kernen.

En race-tilstand opstår under processen med at lukke en filbeskrivelse, mens du kalder close() og fget() på samme tid. Kaldet til close() kan forekomme før fget() udføres, hvilket vil forvirre skraldeopsamleren, fordi filstrukturen ifølge refcount ikke vil have eksterne referencer, men forbliver knyttet til filbeskrivelsen, dvs. Skraldesamleren vil tro, at den har eksklusiv adgang til strukturen, men faktisk vil den resterende post i filbeskrivelsestabellen i en kort periode stadig pege på, at strukturen er frigivet.

For at øge sandsynligheden for at komme i en løbstilstand blev der brugt flere tricks, som gjorde det muligt at øge sandsynligheden for udnyttelsessucces til 30 % ved indførelse af systemspecifikke optimeringer. For at øge adgangstiden til en struktur med filbeskrivelser med flere hundrede nanosekunder, blev data f.eks. fjernet fra processorcachen ved at fylde cachen med aktivitet på en anden CPU-kerne, hvilket gjorde det muligt at hente strukturen fra hukommelsen i stedet for fra den hurtige CPU-cache.

Den anden vigtige egenskab var brugen af ​​interrupts genereret af en hardware-timer for at øge løbets tilstandstid. Øjeblikket blev valgt, så interrupt-handleren ville fyre, når en løbstilstand opstod, og afbryde udførelsen af ​​koden i nogen tid. For yderligere at forsinke tilbageleveringen af ​​kontrollen blev omkring 50 poster i ventekøen genereret ved hjælp af epoll, hvilket krævede søgning gennem interrupt-handleren.

Teknikken til at udnytte sårbarheden blev afsløret efter en 90-dages tavshedsperiode. Problemet dukker op siden kerne 2.6.32 og blev rettet i begyndelsen af ​​december. Rettelsen blev inkluderet i kerne 5.16 og blev også overført til LTS-grene af kernen og kernepakker leveret i distributioner. Det er bemærkelsesværdigt, at sårbarheden blev identificeret under analysen af ​​et lignende problem CVE-2021-0920, som manifesterer sig i garbage collector, når MSG_PEEK-flaget behandles.

Kilde: opennet.ru

Tilføj en kommentar