Pretekársky stav v zberači odpadu jadra Linuxu, ktorý môže viesť k eskalácii privilégií

Jann Horn z tímu Google Project Zero, ktorý kedysi identifikoval zraniteľnosti Spectre a Meltdown, zverejnil techniku ​​na zneužitie zraniteľnosti (CVE-2021-4083) v zberači odpadu linuxového jadra. Zraniteľnosť je spôsobená konfliktom pri čistení deskriptorov súborov na soketoch Unix a potenciálne umožňuje miestnemu neprivilegovanému používateľovi spustiť svoj kód na úrovni jadra.

Problém je zaujímavý, pretože časové okno, počas ktorého dochádza k pretekom, bolo odhadnuté ako príliš malé na vytvorenie skutočných exploitov, ale autor štúdie ukázal, že aj takéto pôvodne skeptické zraniteľnosti sa môžu stať zdrojom skutočných útokov, ak má tvorca exploitu potrebné zručnosti a čas. Yann Horn ukázal, ako pomocou filigránskych manipulácií môžete znížiť rasový stav, ktorý sa vyskytuje pri súčasnom volaní funkcií close() a fget() na plne zneužiteľnú zraniteľnosť bez použitia po použití a dosiahnuť prístup k už uvoľneným údajom. štruktúru vo vnútri jadra.

Spor sa vyskytuje počas procesu zatvárania deskriptora súboru pri súčasnom volaní close() a fget(). Volanie close() sa môže vyskytnúť pred vykonaním funkcie fget(), čo pomýli zberač odpadu, pretože podľa refcountu štruktúra súboru nebude mať externé referencie, ale zostane pripojená k deskriptoru súboru, t.j. Zberač odpadu si bude myslieť, že má exkluzívny prístup k štruktúre, ale v skutočnosti bude zostávajúci záznam v tabuľke deskriptorov súborov na krátku dobu stále ukazovať na uvoľnenú štruktúru.

Na zvýšenie pravdepodobnosti, že sa dostanete do pretekárskeho stavu, sa použilo niekoľko trikov, ktoré umožnili zvýšiť pravdepodobnosť úspechu využívania na 30% pri zavádzaní optimalizácií špecifických pre systém. Napríklad, aby sa predĺžil čas prístupu k štruktúre s deskriptormi súborov o niekoľko stoviek nanosekúnd, údaje sa vytlačili z vyrovnávacej pamäte procesora zasypaním vyrovnávacej pamäte aktivitou na inom jadre CPU, čo umožnilo získať štruktúru skôr z pamäte ako z rýchla vyrovnávacia pamäť CPU.

Druhou dôležitou vlastnosťou bolo použitie prerušení generovaných hardvérovým časovačom na zvýšenie času pretekov. Moment bol vybraný tak, aby sa obsluha prerušenia spustila, keď dôjde k súbehu a na nejaký čas preruší vykonávanie kódu. Na ďalšie oddialenie návratu kontroly bolo pomocou epoll vygenerovaných asi 50 XNUMX záznamov v čakacej rade, čo si vyžadovalo vyhľadávanie cez obsluhu prerušení.

Technika na využitie zraniteľnosti bola zverejnená po 90-dňovom období nezverejnenia. Problém sa objavuje od jadra 2.6.32 a bol opravený začiatkom decembra. Oprava bola zahrnutá v jadre 5.16 a bola prenesená aj do LTS vetiev jadra a balíčkov jadra dodávaných v distribúciách. Je pozoruhodné, že zraniteľnosť bola identifikovaná počas analýzy podobného problému CVE-2021-0920, ktorý sa prejavuje v zberači odpadu pri spracovaní príznaku MSG_PEEK.

Zdroj: opennet.ru

Pridať komentár