Rastillstånd i Linux-kärnan-sopsamlaren som kan leda till privilegieskalering

Jann Horn från Google Project Zero-teamet, som en gång identifierade Spectre- och Meltdown-sårbarheterna, publicerade en teknik för att utnyttja en sårbarhet (CVE-2021-4083) i Linux-kärnan-sopsamlaren. Sårbarheten beror på ett rastillstånd när man rensar upp filbeskrivningar på unix-sockets och tillåter potentiellt en lokal oprivilegierad användare att exekvera sin kod på kärnnivå.

Problemet är intressant eftersom tidsfönstret under vilket rastillståndet inträffar uppskattades vara för litet för att skapa verkliga utnyttjande, men författaren till studien visade att även sådana initialt skeptiska sårbarheter kan bli källan till verkliga attacker om exploateringsskaparen har nödvändiga färdigheter och tid. Yann Horn visade hur man, med hjälp av filigranmanipulationer, kan minska rastillståndet som uppstår när man anropar funktionerna close() och fget() samtidigt till en fullt exploateringsbar användning-efter-fri sårbarhet och uppnå tillgång till en redan frigjord data struktur inuti kärnan.

Ett rastillstånd uppstår under processen att stänga en filbeskrivning medan close() och fget() anropas samtidigt. Anropet till close() kan ske innan fget() exekveras, vilket kommer att förvirra sopsamlaren eftersom filstrukturen enligt refcount inte kommer att ha externa referenser utan förblir kopplad till filbeskrivningen, dvs. Sophämtaren kommer att tro att den har exklusiv tillgång till strukturen, men i själva verket kommer den återstående posten i filbeskrivningstabellen under en kort tidsperiod fortfarande att peka på att strukturen frigörs.

För att öka sannolikheten att hamna i ett racetillstånd användes flera knep, som gjorde det möjligt att öka sannolikheten för exploateringsframgång till 30 % vid införande av systemspecifika optimeringar. Till exempel, för att öka tiden för åtkomst till en struktur med fildeskriptorer med flera hundra nanosekunder, togs data bort från processorcachen genom att cachen fylldes med aktivitet på en annan CPU-kärna, vilket gjorde det möjligt att hämta strukturen från minnet snarare än från den snabba CPU-cachen.

Den andra viktiga egenskapen var användningen av avbrott genererade av en hårdvarutimer för att öka tävlingstiden. Momentet valdes så att avbrottshanteraren skulle avfyra när ett tävlingstillstånd inträffade och avbryta exekveringen av koden under en tid. För att ytterligare fördröja återgången av kontrollen genererades cirka 50 tusen poster i väntekön med hjälp av epoll, vilket krävde att man sökte igenom avbrottshanteraren.

Tekniken för att utnyttja sårbarheten avslöjades efter en 90-dagars sekretessperiod. Problemet har uppstått sedan kärnan 2.6.32 och åtgärdades i början av december. Fixeringen inkluderades i kärnan 5.16 och överfördes också till LTS-grenar av kärnan och kärnpaketen som tillhandahålls i distributioner. Det är anmärkningsvärt att sårbarheten identifierades under analysen av ett liknande problem CVE-2021-0920, som visar sig i sopsamlaren vid bearbetning av MSG_PEEK-flaggan.

Källa: opennet.ru

Lägg en kommentar