Skupina výskumníkov z ETH Zurich identifikovala nový útok na mechanizmus špekulatívneho vykonávania nepriamych prechodov v CPU, ktorý umožňuje extrahovať informácie z pamäte jadra alebo organizovať útok na hostiteľský systém z virtuálnych strojov. Chyby majú kódové označenie Retbleed (CVE-2022-29900, CVE-2022-29901) a svojou povahou sú blízke útokom Spectre-v2. Rozdiel spočíva v organizácii špekulatívneho vykonávania ľubovoľného kódu pri spracovaní inštrukcie „ret“ (návrat), ktorá načíta adresu na skok zo zásobníka, namiesto nepriameho skoku pomocou inštrukcie „jmp“ načítaním adresy z pamäť alebo register CPU.
Útočník môže vytvoriť podmienky pre nesprávnu predikciu prechodu a zorganizovať cielený, špekulatívny prechod do bloku kódu, ktorý nie je zabezpečený logikou vykonávania programu. V konečnom dôsledku procesor určí, že predpoveď vetvenia nebola opodstatnená a vráti operáciu do pôvodného stavu, ale dáta spracované počas špekulatívneho vykonávania skončia vo vyrovnávacej pamäti a mikroarchitektonických bufferoch. Ak chybne vykonaný blok pristúpi k pamäti, potom jeho špekulatívne vykonanie povedie k uloženiu údajov načítaných z pamäte do zdieľanej vyrovnávacej pamäte.
Na určenie zostávajúcich údajov vo vyrovnávacej pamäti po špekulatívnych operáciách môže útočník použiť techniky bočného kanála na určenie zvyškových údajov, ako je napríklad analýza zmien v časoch prístupu k údajom uloženým vo vyrovnávacej pamäti a údajom bez vyrovnávacej pamäte. Na účelové extrahovanie informácií z oblastí na inej úrovni privilégií (napríklad z pamäte jadra) sa používajú „gadgety“ - sekvencie príkazov prítomných v jadre, ktoré sú vhodné na špekulatívne čítanie údajov z pamäte v závislosti od vonkajších podmienok, ktoré môžu byť ovplyvnené útočník.
Na ochranu pred klasickými útokmi triedy Spectre, ktoré používajú inštrukcie podmieneného a nepriameho skoku, väčšina operačných systémov používa techniku „retpoline“, ktorá je založená na nahradení operácií nepriameho skoku inštrukciou „ret“, pre ktorú procesory používajú samostatnú jednotku predikcie stavu zásobníka. bez použitia bloku predikcie vetvenia. Keď bola retpolína predstavená v roku 2018, verilo sa, že manipulácie s adresami podobné Spectre neboli praktické pre špekulatívne vetvenie pomocou inštrukcie „ret“.
Výskumníci, ktorí vyvinuli metódu útoku Retbleed, preukázali možnosť vytvorenia mikroarchitektonických podmienok na spustenie špekulatívneho prechodu pomocou inštrukcie „ret“ a publikovali hotové nástroje na identifikáciu sekvencií inštrukcií (gadgetov) vhodných na využitie zraniteľnosti v jadre Linuxu, v ktorých sa takéto stavy prejavujú.
Počas výskumu bol pripravený pracovný exploit, ktorý umožňuje na systémoch s procesormi Intel extrahovať ľubovoľné dáta z pamäte jadra z neprivilegovaného procesu v užívateľskom priestore rýchlosťou 219 bajtov za sekundu a presnosťou 98 %. Na procesoroch AMD je efektivita exploitu oveľa vyššia – rýchlosť úniku je 3.9 KB za sekundu. Ako praktický príklad ukážeme, ako použiť navrhovaný exploit na určenie obsahu súboru /etc/shadow. Na systémoch s procesormi Intel bol útok na určenie hash hesla používateľa root vykonaný za 28 minút a na systémoch s procesormi AMD za 6 minút.
Útok bol potvrdený pre generácie 6-8 procesorov Intel, ktoré boli vydané pred 3. štvrťrokom 2019 (vrátane Skylake), a procesory AMD založené na mikroarchitektúrach Zen 1, Zen 1+ a Zen 2, ktoré boli vydané pred 2021. štvrťrokom 3. V novších modeloch procesorov, ako sú AMD ZenXNUMX a Intel Alder Lake, ako aj v procesoroch ARM je problém blokovaný existujúcimi ochrannými mechanizmami. Napríklad používanie inštrukcií IBRS (Indirect Branch Restricted Speculation) pomáha chrániť pred útokmi.
Pre linuxové jadro a hypervízor Xen je pripravený súbor zmien, ktoré zablokujú problém v softvéri na starších CPU. Navrhovaná oprava pre jadro Linuxu zmení 68 súborov, pridá 1783 riadkov a odstráni 387 riadkov. Bohužiaľ, ochrana vedie k značným režijným nákladom - v textoch vedených na procesoroch AMD a Intel sa pokles výkonu odhaduje zo 14% na 39%. Je vhodnejšie použiť ochranu založenú na inštrukciách IBRS, ktorá je dostupná v nových generáciách procesorov Intel a je podporovaná od jadra Linuxu 4.19.
Na procesoroch Intel sa náhrada adresy za špekulatívny nepriamy skok vykonáva vďaka funkcii, ktorá sa objaví, keď dôjde k pretečeniu cez dolnú hranicu (podtečenie) vo vyrovnávacej pamäti Return Stack. Keď nastanú takéto podmienky, inštrukcia „ret“ začne uplatňovať logiku výberu adresy podobnú tej, ktorá sa používa pre normálne nepriame skoky. V linuxovom jadre sa našlo viac ako tisíc miest, ktoré vytvárajú podmienky na spustenie takéhoto spätného toku a sú prístupné prostredníctvom systémových volaní.
Na procesoroch AMD sa špekulatívne vykonávanie inštrukcie „ret“ vykonáva bez odkazu na zásobník špecifický pre vyrovnávaciu pamäť (Return Address Stack) a jednotka predikcie vetvenia nepovažuje inštrukciu „ret“ za návrat kontroly, ale za nepriamu vetvu. , a preto používa údaje na predikciu nepriamych prechodov. Za týchto podmienok je možné využiť prakticky akúkoľvek operáciu „ret“ dosiahnuteľnú prostredníctvom systémového volania.
Okrem toho bol v procesoroch AMD identifikovaný ďalší problém (CVE-2022-23825, Branch Type Confusion) súvisiaci s implementáciou fiktívnych vetiev - podmienky pre predikciu vetvenia sa môžu vyskytnúť aj bez potrebných inštrukcií vetvy, čo umožňuje ovplyvniť vyrovnávaciu pamäť predikcie vetvy bez pokynu „ret“. Táto funkcia výrazne komplikuje implementáciu ochrany a vyžaduje aktívnejšie čistenie buffera predikcie vetvenia. Očakáva sa, že pridanie úplnej ochrany do jadra zvýši réžiu o 209 %.
Zdroj: opennet.ru