Skupina výzkumníků z Curyšské technické univerzity objevila nový typ útoku na mechanismus spekulativního provádění nepřímých skoků v CPU, který umožňuje získat informace z paměti jádra nebo zorganizovat útok na hostitelský systém z virtuálních strojů. Zranitelnosti dostaly kódové jméno Retbleed (CVE-2022-29900, CVE-2022-29901) a jsou podobné ú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á získává adresu pro skok ze zásobníku, místo nepřímého skoku pomocí instrukce „jmp“, která načítá adresu z paměti nebo registru CPU.
Útočník může vytvořit podmínky pro nesprávné předpovězení skoku a zorganizovat cílený spekulativní skok na blok kódu, který není zajištěn logikou provádění programu. Nakonec procesor vyhodnotí, že předpovězení větvení nebylo úspěšné, a vrátí operaci do původního stavu, ale data zpracovaná během spekulativního provádění zůstanou v cache a mikroarchitektonických bufferech. Pokud chybně provedený blok provádí přístup k paměti, jeho spekulativní provádění povede k uložení v obvyklém cache a dat, která byla načtena z paměti.
Pro určení dat, která zůstala v cache po spekulativním provádění operací, může útočník využít metody pro určení zbytkových dat pomocí bočních kanálů, například analyzovat změny v době přístupu k vyrovnaným a nevyrovnaným datům. Pro cílené získávání informací z oblastí na jiných úrovních privilegovanosti (například z paměti jádra) se používají „gadžety“ – sekvence instrukcí přítomné v jádře, vhodné pro spekulativní čtení dat z paměti v závislosti na vnějších podmínkách, kterými může útočník manipulovat.
Pro ochranu před klasickými útoky typu Spectre, které využívají instrukce podmíněného a nepodmíněného skoku, se ve většině operačních systémů používá technika "retpoline", založená na nahrazení operací nepodmíněného skoku instrukcí "ret", pro kterou procesory využívají samostatnou predikční jednotku stavu zásobníku, která nepoužívá blok predikce skoků. Při zavedení retpoline v roce 2018 se předpokládalo, že obdobné manipulace s adresami podobné Spectre nejsou v praxi použitelné pro spekulativní skok pomocí instrukce "ret".
Výzkumníci, kteří vyvinuli metodu útoku Retbleed, demonstrovali možnost vytvořit mikroarchitektonické podmínky pro iniciaci spekulativního skoku pomocí instrukce "ret" a publikovali hotový nástroj pro odhalování v jádře Linuxu vhodných pro zneužití zranitelnosti sekvencí instrukcí (gadgets), ve kterých se tyto podmínky projevují.
Během výzkumu byl připraven funkční exploit, který umožňuje na systémech s procesory Intel z nepř privileged procesu v uživatelském prostoru extrahovat libovolná data z paměti jádra rychlostí 219 bajtů za sekundu a s přesností 98 %. Na procesorech AMD je efektivita exploitu mnohem vyšší — rychlost úniku činí 3.9 KB za sekundu. Jako praktický příklad bylo ukázáno, jak pomocí navrhovaného exploitu zjistit obsah souboru /etc/shadow. Na systémech s procesory Intel byla útok na určení hash hesla uživatele root proveden za 28 minut, zatímco na systémech s procesory AMD za 6 minut.

Možnost provedení útoku byla potvrzena pro 6-8 generací procesorů Intel, které byly vyráběny do 3. čtvrtletí 2019 (včetně Skylake), a procesorů AMD na bázi mikroarchitektur Zen 1, Zen 1+ a Zen 2, které byly vyráběny do druhého čtvrtletí 2021. U novějších modelů procesorů, jako jsou AMD Zen3 a Intel Alder Lake, stejně jako u procesorů ARM, je problém blokován existujícími ochrannými mechanismy. Například použití instrukcí IBRS (Indirect Branch Restricted Speculation) pomáhá chránit proti útoku.
Pro jádro Linux a hypervizor Xen byla připravena sada změn, která na starších CPU blokuje problém softwarově. Navrhovaná oprava pro jádro Linux mění 68 souborů, přidává 1783 řádků a odstraňuje 387 řádků. Bohužel ochrana přináší značné režijní náklady – v provedených testech na procesorech AMD a Intel se pokles výkonu odhaduje mezi 14 % až 39 %. Preferovanější je aplikace ochrany založené na instrukcích IBRS, dostupných v novějších generacích CPU Intel a podporovaných od jádra Linux 4.19.
Na procesorech Intel se adresování pro spekulativní nepřímý skok provádí díky vlastnosti, která se projevuje při přetečení přes dolní mez (underflow) v zásobníku predikce obsahu zásobníku (Return Stack Buffer). Když nastanou takové podmínky, pro instrukci „ret“ se začíná používat logika výběru adresy, podobná té, která se používá při běžných nepřímých skocích. V jádru Linux bylo nalezeno více než tisíc míst, která vytvářejí podmínky pro iniciaci takového zpětného přetečení a jsou dostupná prostřednictvím systémových volání.
Na procesorech AMD se spekulativní provádění instrukce „ret“ realizuje bez vazby na specifický pro zásobník buffer (Return Address Stack) a blok predikce skoků považuje instrukci „ret“ nikoli za návrat řízení, ale jako nepřímý skok, a tudíž při predikci používá údaje pro nepřímé skoky. Za takových podmínek může být vlastně jakákoli operace „ret“, dosažitelná prostřednictvím systémového volání, využita pro exploitaci.
Dále, na CPU AMD byla odhalena ještě jedna záležitost (CVE-2022-23825, Branch Type Confusion), související s prováděním fiktivních skoků – podmínky pro predikci skoku mohou vzniknout i bez potřebných instrukcí větvení, což umožňuje ovlivnit buffer predikce skoků bez instrukce „ret“. Tato vlastnost podstatně komplikuje implementaci ochrany a vyžaduje aktivnější vyčistění bufferu predikce skoků. Očekává se, že přidání plné ochrany do jádra povede k nárůstu režijních nákladů o 209 %.
Zdroj: opennet.ru
