Závodní stav v garbage collectoru linuxového jádra, který může vést k eskalaci oprávnění

Jann Horn z týmu Google Project Zero, který kdysi identifikoval zranitelnosti Spectre a Meltdown, publikoval techniku ​​pro zneužití zranitelnosti (CVE-2021-4083) v linuxovém kernel garbage collector. Tato chyba zabezpečení je způsobena sporem při čištění deskriptorů souborů na soketech Unix a potenciálně umožňuje místnímu neprivilegovanému uživateli spouštět svůj kód na úrovni jádra.

Problém je zajímavý, protože časové okno, během kterého dochází k race condition, bylo odhadováno jako příliš malé na to, aby vytvořil skutečné exploity, ale autor studie ukázal, že i takové zpočátku skeptické zranitelnosti se mohou stát zdrojem skutečných útoků, pokud tvůrce exploitu potřebné dovednosti a čas. Yann Horn ukázal, jak pomocí filigránských manipulací můžete snížit konfliktní podmínky, ke kterým dochází při současném volání funkcí close() a fget(), na plně zneužitelnou zranitelnost bez použití po použití a získat přístup k již uvolněným datům. struktura uvnitř jádra.

Spor nastává během procesu zavírání deskriptoru souboru při současném volání close() a fget(). Volání close() může nastat před provedením fget(), což zmást garbage collector, protože podle refcountu nebude mít struktura souboru externí reference, ale zůstane připojená k deskriptoru souboru, tzn. Kolektor odpadu si bude myslet, že má výhradní přístup ke struktuře, ale ve skutečnosti bude zbývající položka v tabulce deskriptorů souborů po krátkou dobu stále ukazovat na uvolňovanou strukturu.

Aby se zvýšila pravděpodobnost, že se dostanete do závodního stavu, bylo použito několik triků, které umožnily zvýšit pravděpodobnost úspěchu zneužití na 30% při zavádění optimalizací specifických pro systém. Například, aby se prodloužila doba přístupu ke struktuře s deskriptory souborů o několik set nanosekund, byla data vytlačena z mezipaměti procesoru tím, že se mezipaměť zasypala aktivitou na jiném jádře CPU, což umožnilo načíst strukturu spíše z paměti než z rychlá mezipaměť CPU.

Druhou důležitou funkcí bylo použití přerušení generovaných hardwarovým časovačem pro prodloužení doby závodu. Okamžik byl vybrán tak, aby se obslužná rutina přerušení spustila, když dojde ke sporu a na nějakou dobu přeruší provádění kódu. K dalšímu oddálení návratu kontroly bylo pomocí epoll vygenerováno asi 50 tisíc záznamů ve frontě, což vyžadovalo hledání pomocí obsluhy přerušení.

Technika pro zneužití zranitelnosti byla zveřejněna po 90denní lhůtě pro nezveřejnění. Problém se objevuje od jádra 2.6.32 a byl opraven na začátku prosince. Oprava byla zahrnuta v jádře 5.16 a byla také přenesena do LTS větví jádra a balíčků jádra dodávaných v distribucích. Je pozoruhodné, že zranitelnost byla identifikována při analýze podobného problému CVE-2021-0920, který se projevuje v garbage collectoru při zpracování příznaku MSG_PEEK.

Zdroj: opennet.ru

Přidat komentář