Hlavní navigace

BranchScope je nový útok postranním kanálem na procesory Intel

Petr Krčmář

Po útocích Meltdown a Spectre je tu další útok, který zneužívá predikce skoků a spekulativního vykonávání kódu. Umožňuje vykrádat citlivé údaje z jiných procesů a dokonce těch běžících v SGX.

Doba čtení: 5 minut

Když se na začátku roku objevily informace o zranitelnostech Meltdown a Spectre, předpokládalo se, že další podobné útoky postavené na prediktivních algoritmech moderních procesorů budou následovat. Vědci z College of William and Mary, Carnegie Mellon, University of California Riverside a Binghamton University odhalili nově objevený útok, který nazvali BranchScope.

Detaily jsou popsány v podrobné patnáctistránkové zprávě [PDF], která popisuje útok zneužívající spekulativního provádění kódu moderních procesorů k obcházení omezení operačních systémů a vyčítání chráněných paměťových stránek. Zní vám to povědomě? BranchScope je příbuzný útoku Spectre (typ 2) a podobným způsobem zneužívá predikci větvení kódu.

Predikce skoků

Spekulativní provádění kódu umožňuje moderním procesorům provádět instrukce ještě předtím, než je to skutečně potřeba, a tím zvyšovat efektivitu využití jednotlivých jednotek umístěných uvnitř procesoru. Během čekání na vyhodnocení některé z operací je tak možné namísto zahálení připravovat další kroky dopředu. Problémem je větvení, kdy se procesor rozhoduje o skocích až podle výsledků předchozích operací. Procesory jsou ovšem vybaveny algoritmy, které umožňují kvalifikovaně odhadovat výsledky rozhodování a pokračovat ve spekulativním provádění v některé z možných větví kódu.

Pokud pak skok proběhne skutečně odhadovaným směrem, má procesor vyhráno a práce je hotová. Pokud se rozhodnutí nakonec změní, je výsledek spekulativního provádění zahozen, jako by k němu nikdy nedošlo. Pak provádění kódu pokračuje v nové větvi, do které skutečně proběhl skok.

Podrobně se těmto mechanismům věnoval ve své přednášce na letošním InstallFestu Vojtěch Pavlík:

Problém Spectre spočívá v tom, že procesor ve skutečnosti po zahození nepotřebného výsledku spekulativního provádění nevrátí do původního stavu úplně vše. Přestože by měla být spekulace provedena zcela odděleně od hlavního vlákna, zůstanou po ní stopy například v keši. Spekulativně prováděný kód totiž nechá do keše procesoru načíst stránku z paměti, což je pak možné v kódu detekovat – jednoduše je možné pomocí měření rychlosti přístupu do daných stránek v paměti zjistit, zda byly během spekulativního provádění načteny do keše. Tím může útočník postupně zjišťovat informace z paměti, které jsou mu jinak nedostupné.

Rozdíl proti Spectre

Predikce skoků je jedním ze základních prvků celého tohoto komplexního stroje uvnitř stroje. Procesor sleduje místa, na kterých se kód větví a zaznamenává si informaci o tom, ze kterých adres se kam obvykle skáče a zda bývá podmínka v podmíněném skoku splněna či ne. Vzniká tak jakási statistika o nejpravděpodobnějším průchodu danou částí kódu. Potud jsou předpoklady pro Spectre a BranchScope stejné, ale tady přichází první rozdíl – útoky využívají různých částí prediktoru.

Spectre závisí na Branch Target Buffer (BTB) – struktuře uvnitř procesoru, která udržuje informace o obvyklém cíli podmíněných skoků. BranchScope proti tomu využívá informace z Pattern History Table (PHT), která udržuje informace o stavu jednotlivých podmínek – tedy zda bude podmínka pravděpodobně splněna nebo ne. Tato struktura je reprezentována dvěma bity, tedy čtyřmi různými stavy reprezentujícími pravděpodobnost zvolení dané cesty: pravděpodobně ano, možná ano, možná ne, pravděpodobně ne. Pokaždé, když je daná cesta zvolena, posune se ukazatel směrem nahoru, pokud je zvolena druhá cesta, ukazatel jde dolů.

Takto implementovaný algoritmus zajišťuje, že občasný omyl v odhadu nezmění celý rozhodovací proces. Pokud se v daném místě kódu mnohokrát skočí jedním směrem a pak jednou výjimečně jiným, bude se prediktor i nadále držet obvyklé cesty a jeden skok jinam mu nerozhodí statistiku natolik, aby se mu dramaticky zvýšila chybovost. Pokud jde například o typickou smyčku v kódu, statistika jasně říká, že ve většině případů se skáče opět na začátek funkce a nic na tom nemění fakt, že jednou za čas bývá smyčka opuštěna.

Aby se chování prediktoru změnilo, je potřeba projít skokem na druhou stranu alespoň dvakrát za sebou, než se statistika převáží a chování se upraví. Je to mnohem výhodnější než prostá jednobitová paměť, která udržuje informaci jen o posledním výsledku skoku. Chybovost predikce založené na takto krátké historii by byla výrazně vyšší.

V případě Spectre verze 2 musí útočný kód manipulovat s BTB tak, aby prediktor připravil na spekulativní provádění zákeřného kódu, který pak na pozadí ovlivní procesorovou keš. Útočník pak nechá spekulativně svůj kód vykonat a poté změří, zda byla keš správným způsobem ovlivněna. Výsledek tohoto měření pak způsobí únik informace, kterou načítal kód provedený jen ve spekulativním režimu procesoru.

Proti tomu nový útok BranchScope útočí na PHT a spouští připravené větvící instrukce tak, že zmanipuluje záznamy o výsledcích skoků – prediktor se naučí, že daná podmínka bude pravděpodobně splněna či naopak nesplněna. Poté je procesor donucen na základě svých předpovědí provést spekulativně část kódu legitimního procesu, která na základě načtení citlivých dat z paměti ovlivní zmíněnou strukturu PHT – posune ji chybným skokem o jednu úroveň. Útočník pak ve svém kódu dalšími skoky detekuje, v jakém stavu se dané dva bity nacházejí, a tím opět unikne informace, která měla zůstat za zavřenými dveřmi prediktivního provádění.

Zatím v procesorech Intel

Vědci se zatím zaměřili jen na procesory Intel a potvrdili zranitelnost v procesorech i5 a i7 založených na mikroarchitekturách Skylake, Haswell a Sandy Bridge. Podařilo se jim přečíst data chráněná pomocí SGX (Software Guard Extensions), což je část paměti určená pro velmi citlivý kód, který nemá být za normálních okolností dostupný ani operačnímu systému.

Byl také popsán postup útoku proti kódu chráněného ASLR (Address Space Layout Randomization), stejně jako možnost ovlivnění šifrovacích knihoven. Pokud útočný kód a ohrožený proces běží na jednom procesorovém jádře, sdílejí společně struktury prediktoru a útočník může přečíst data z cizího procesu – například klíče ze šifrovací knihovny.

Odolání útoku Spectre vyžaduje softwarové i hardwarové úpravy, které by měly přijít v budoucnu. Podle objevitelů nového útoku BranchScope bude potřeba podobné kroky udělat i v tomto případě. Záplaty určené pro Spectre nejsou podle vědců proti BranchScope nic platné a bude potřeba vyvinout další. Návrh konkrétní ochrany je také součástí vydaného materiálu.

MIF18 tip v článku témata

Objevitelé také tvrdí, že k útoku stačí běžná uživatelská oprávnění s možností spouštění vlastního kódu a že chybovost při těžbě dat je menší než jedno procento. Můžeme předpokládat, že se v této oblasti dočkáme ještě mnoha dalších podobných chyb, protože útok pomocí zneužívání predikce skoků a spekulativního provádění je stále ještě horká novinka.

(Zdroj: SecurityAffairs, Ars Technica)

Našli jste v článku chybu?