Prediktor vetvenia je kritickým komponentom moderných architektúr CPU navrhnutých na zvýšenie výkonu špekulovaním smeru inštrukcií vetvenia (napr. príkazy if-else) pred ich vyriešením. Táto špekulácia umožňuje CPU predbežne vyzdvihovať a vykonávať inštrukcie pozdĺž predpovedanej cesty, čím sa znižuje vnímaná latencia a zlepšuje sa celková priepustnosť. Táto optimalizácia výkonu však prináša potenciálne zraniteľnosti, ktoré možno využiť pri útokoch na časovanie CPU, najmä v kontexte úniku citlivých informácií.
Predikcia pobočiek funguje tak, že sa udržiava história výsledkov pobočiek a táto história sa používa na predpovedanie budúcich pobočiek. Keď sa stretne s inštrukciou vetvenia, prediktor použije tieto historické údaje na uhádnutie, či bude vetva prijatá alebo nie. Ak je predpoveď správna, CPU pokračuje vo vykonávaní bez prerušenia. Ak je nesprávna, CPU sa musí vrátiť späť a vykonať správnu cestu, čo spôsobí penalizáciu výkonu. Tento trest, aj keď malý, môžu útočníci zmerať a zneužiť.
Útočníci môžu manipulovať s prediktorom vetiev, aby vytvorili merateľný časový rozdiel medzi správne a nesprávne predpovedanými vetvami. Tento rozdiel môže byť použitý na odvodenie cesty vykonávania programu, ktorý môže zase odhaliť citlivé informácie. Jedným z najznámejších príkladov takéhoto útoku je zraniteľnosť Spectre, ktorá využíva špekulatívne vykonávanie a predikciu vetvenia na prístup k neoprávneným miestam v pamäti.
Pri typickom útoku Spectre útočník najprv trénuje prediktor vetvy, aby nasledoval špecifický vzor. Táto trénovacia fáza zahŕňa vykonávanie sekvencie inštrukcií vetvenia, ktoré podmieňujú prediktor, aby urobil konkrétnu predpoveď. Keď je prediktor vyškolený, útočník spustí segment kódu obete, ktorý obsahuje vetvu závislú od tajných údajov. Ak prediktor urobí nesprávnu predpoveď na základe tréningu útočníka, CPU špekulatívne vykoná inštrukcie, ktoré pristupujú do pamäte na základe tajných údajov. Aj keď sú tieto špekulatívne inštrukcie nakoniec vyradené, zanechávajú stopy vo vyrovnávacej pamäti CPU.
Útočník potom môže merať časy prístupu k rôznym miestam v pamäti, aby určil, ku ktorým údajom sa špekulatívne pristupovalo. Táto technika, známa ako útok na časovanie vyrovnávacej pamäte, umožňuje útočníkovi odvodiť tajné údaje na základe pozorovaných rozdielov v časovaní. Kľúčové kroky pri takomto útoku sú:
1. Školenie prediktora pobočiek: Útočník spustí riadenú sekvenciu inštrukcií, ktoré ovplyvňujú stav prediktora vetvy. Napríklad opakované vykonávanie príkazu vetvy s konzistentným výsledkom (napr. vždy prijatým) podmieňuje prediktor, aby očakával tento výsledok pri budúcich vykonávaniach.
2. Spustenie špekulatívnej popravy: Útočník spustí kód obete s inštrukciou vetvy závislou od tajných údajov. V dôsledku predchádzajúceho tréningu útočníka prediktor vetvy špekulatívne vykoná nesprávnu cestu, ktorá zahŕňa prístup k pamäti na základe tajných údajov.
3. Meranie času prístupu do vyrovnávacej pamäte: Po špekulatívnom vykonaní útočník meria čas potrebný na prístup k špecifickým miestam v pamäti. Rýchlejšie časy prístupu naznačujú, že údaje sú prítomné vo vyrovnávacej pamäti, čo znamená, že sa k nim pristupovalo špekulatívne. Analýzou týchto časovaní môže útočník odvodiť tajné údaje.
Aby ste to ilustrovali na konkrétnom príklade, zvážte scenár, kde tajné údaje určujú index prístupu k poli v rámci vetvy. Útočník najprv trénuje prediktor vetvy, aby zaujal určitý smer vetvy. Keď sa spustí kód obete, prediktor vetvy špekulatívne vykoná prístup k poli na základe natrénovaného smeru. Ak špekulácia zahŕňa prístup k určitému prvku poľa, načíta sa zodpovedajúci riadok vyrovnávacej pamäte. Útočník potom môže vykonať sériu časovaných prístupov do pamäte, aby určil, ktoré riadky vyrovnávacej pamäte sú načítané, a tým odvodí tajný index.
Zmiernenie takýchto útokov zahŕňa niekoľko stratégií. Hardvérové riešenia zahŕňajú zlepšenie izolácie medzi špekulatívnymi a nešpekulatívnymi cestami vykonávania a zabezpečenie, aby špekulatívne vykonávanie neovplyvňovalo zdieľané zdroje, ako je vyrovnávacia pamäť. Softvérové riešenia zahŕňajú techniky, ako je vkladanie „plotových“ inštrukcií, aby sa zabránilo špekulatívnemu vykonávaniu za určité body v kóde, alebo používanie praktík programovania v konštantnom čase, aby sa zabezpečilo, že čas vykonania nebude závisieť od tajných údajov.
Zložitosť a sofistikovanosť útokov na časovanie založených na prediktoroch pobočiek podčiarkuje potrebu neustáleho výskumu a vývoja v oblasti hardvérovej aj softvérovej bezpečnosti. Keďže architektúry CPU sa neustále vyvíjajú, musia sa tiež vyvíjať stratégie ochrany pred týmito a inými formami útokov na bočné kanály.
Ďalšie nedávne otázky a odpovede týkajúce sa Útoky na časovanie CPU:
- Aké sú niektoré z výziev a kompromisov pri implementácii hardvérových a softvérových obmedzení proti útokom načasovanie pri zachovaní výkonu systému?
- Ako môže programovanie v konštantnom čase pomôcť zmierniť riziko útokov na načasovanie v kryptografických algoritmoch?
- Čo je špekulatívne vykonávanie a ako prispieva k zraniteľnosti moderných procesorov voči útokom na čas, ako je Spectre?
- Ako využívajú útoky načasovanie variácie času vykonávania na odvodenie citlivých informácií zo systému?
- Čo je to načasovanie?