Skupina výzkumníků z ETH Zurich identifikovala nový útok na mechanismus spekulativního provádění nepřímých přechodů v CPU, který umožňuje extrahovat informace z paměti jádra nebo organizovat útok na hostitelský systém z virtuálních strojů. Chyby mají kódové označení Retbleed (CVE-2022-29900, CVE-2022-29901) a svou povahou jsou blízké útokům Spectre-v2. Rozdíl spočívá v organizaci spekulativního provádění libovolného kódu při zpracování instrukce „ret“ (return), která načte adresu pro skok ze zásobníku, namísto nepřímého skoku pomocí instrukce „jmp“, načtení adresy z paměti nebo registru CPU.
Útočník může vytvořit podmínky pro nesprávnou predikci přechodu a zorganizovat cílený, spekulativní přechod na blok kódu, který není zajištěn logikou provádění programu. Nakonec procesor určí, že předpověď větvení nebyla oprávněná a vrátí operaci do původního stavu, ale data zpracovaná během spekulativního provádění skončí v mezipaměti a mikroarchitektonických bufferech. Pokud chybně provedený blok přistoupí k paměti, pak jeho spekulativní provedení povede k uložení dat načtených z paměti do sdílené mezipaměti.
K určení dat zbývajících v mezipaměti po spekulativních operacích může útočník použít techniky postranního kanálu k určení zbytkových dat, jako je analýza změn v časech přístupu k datům uloženým v mezipaměti a datům bez mezipaměti. K účelovému extrahování informací z oblastí na jiné úrovni oprávnění (například z paměti jádra) se používají „gadgety“ - sekvence příkazů přítomných v jádře, které jsou vhodné pro spekulativní čtení dat z paměti v závislosti na vnějších podmínkách, které mohou být ovlivněny útočníka.
K ochraně před klasickými útoky třídy Spectre, které používají instrukce podmíněného a nepřímého skoku, používá většina operačních systémů techniku „retpoline“, která je založena na nahrazení operací nepřímého skoku instrukcí „ret“, pro kterou procesory používají samostatnou jednotku predikce stavu zásobníku. nepoužíváte blok predikce větvení. Když byla v roce 2018 představena retpoline, věřilo se, že manipulace s adresou podobné Spectre nejsou praktické pro spekulativní větvení pomocí instrukce „ret“.
Výzkumníci, kteří vyvinuli metodu útoku Retbleed, prokázali možnost vytvoření mikroarchitektonických podmínek pro zahájení spekulativního přechodu pomocí instrukce „ret“ a publikovali hotové nástroje pro identifikaci sekvencí instrukcí (gadgetů) vhodných pro zneužití zranitelnosti v jádře Linuxu, ve kterých se takové stavy projevují.
Během výzkumu byl připraven pracovní exploit, který umožňuje na systémech s CPU Intel extrahovat libovolná data z paměti jádra z neprivilegovaného procesu v uživatelském prostoru rychlostí 219 bajtů za sekundu a 98% přesností. U procesorů AMD je efektivita exploitu mnohem vyšší – rychlost úniku je 3.9 KB za sekundu. Jako praktický příklad ukážeme, jak použít navrhovaný exploit k určení obsahu souboru /etc/shadow. Na systémech s procesory Intel byl útok na určení hash hesla uživatele root proveden za 28 minut a na systémech s procesory AMD za 6 minut.
Útok byl potvrzen pro generace 6-8 procesorů Intel, které byly vydány před 3. čtvrtletím 2019 (včetně Skylake), a procesory AMD založené na mikroarchitekturách Zen 1, Zen 1+ a Zen 2, které byly vydány před 2021. čtvrtletím 3. V novějších modelech procesorů, jako jsou AMD ZenXNUMX a Intel Alder Lake, stejně jako v procesorech ARM, je problém blokován stávajícími ochrannými mechanismy. Například použití instrukcí IBRS (Indirect Branch Restricted Speculation) pomáhá chránit před útoky.
Pro linuxové jádro a hypervizor Xen je připravena sada změn, které zablokují problém v softwaru na starších CPU. Navrhovaný patch pro linuxové jádro změní 68 souborů, přidá 1783 řádků a odstraní 387 řádků. Bohužel ochrana vede ke značným režijním nákladům - v textech vedených na procesorech AMD a Intel je pokles výkonu odhadován ze 14 % na 39 %. Je vhodnější použít ochranu založenou na instrukcích IBRS, která je dostupná v nových generacích procesorů Intel a je podporována počínaje linuxovým jádrem 4.19.
U procesorů Intel se substituce adresy pro spekulativní nepřímý skok provádí díky funkci, která se objeví, když dojde k přetečení přes spodní hranici (podtečení) ve vyrovnávací paměti návratového zásobníku. Když nastanou takové podmínky, instrukce „ret“ začne aplikovat logiku výběru adresy podobnou té, která se používá pro normální nepřímé skoky. V linuxovém jádře bylo nalezeno více než tisíc míst, která vytvářejí podmínky pro zahájení takového zpětného toku a jsou přístupná prostřednictvím systémových volání.
Na procesorech AMD se spekulativní provádění instrukce „ret“ provádí bez odkazu na zásobník specifický pro zásobník (Return Address Stack) a jednotka predikce větvení nepovažuje instrukci „ret“ za kontrolní návrat, ale za nepřímou větev. a v souladu s tím používá data pro predikci nepřímých přechodů. Za těchto podmínek lze prakticky využít jakoukoli operaci „ret“, kterou lze dosáhnout prostřednictvím systémového volání.
Navíc byl také identifikován další problém v CPU AMD (CVE-2022-23825, Branch Type Confusion) související s implementací fiktivních větví - podmínky pro predikci větví mohou nastat i bez nezbytných instrukcí větví, což umožňuje ovlivnit vyrovnávací paměť pro predikci větví. bez pokynu "ret". Tato funkce výrazně komplikuje implementaci ochrany a vyžaduje aktivnější čištění bufferu predikce větví. Očekává se, že přidání plné ochrany do jádra zvýší režii o 209 %.
Zdroj: opennet.ru