Prediktor větvení je kritickou součástí moderních architektur CPU navržených ke zvýšení výkonu spekulací o směru instrukcí větvení (např. příkazů if-else) před jejich vyřešením. Tato spekulace umožňuje CPU předběžně načítat a provádět instrukce podél předpokládané cesty, čímž se snižuje vnímaná latence a zlepšuje se celková propustnost. Tato optimalizace výkonu však přináší potenciální zranitelnosti, které lze zneužít při útocích na časování CPU, zejména v souvislosti s únikem citlivých informací.
Predikce větví funguje tak, že udržuje historii výsledků větví a používá tuto historii k předpovídání budoucích větví. Když je nalezena instrukce větvení, prediktor použije tato historická data k odhadu, zda větev bude přijata nebo ne. Pokud je předpověď správná, CPU pokračuje v provádění bez přerušení. Pokud je nesprávná, CPU se musí vrátit zpět a provést správnou cestu, což způsobí penalizaci výkonu. Tento trest, i když malý, mohou útočníci měřit a zneužít.
Útočníci mohou manipulovat s prediktorem větví, aby vytvořili měřitelný časový rozdíl mezi správně a nesprávně předpovězenými větvemi. Tento rozdíl lze použít k odvození cesty provádění programu, což může naopak odhalit citlivé informace. Jedním z nejznámějších příkladů takového útoku je zranitelnost Spectre, která využívá spekulativní provádění a predikci větví k přístupu k neoprávněným paměťovým místům.
Při typickém útoku Spectre útočník nejprve trénuje prediktor větve, aby následoval specifický vzor. Tato trénovací fáze zahrnuje provádění sekvence větvících instrukcí, které podmiňují prediktor, aby provedl konkrétní předpověď. Jakmile je prediktor vyškolen, útočník spustí segment kódu oběti, který obsahuje větev závislou na tajných datech. Pokud prediktor provede nesprávnou předpověď na základě tréninku útočníka, CPU bude spekulativně provádět instrukce, které přistupují do paměti na základě tajných dat. Ačkoli jsou tyto spekulativní instrukce nakonec zahozeny, zanechávají stopy v mezipaměti CPU.
Útočník pak může měřit doby přístupu k různým paměťovým místům a určit, která data byla spekulativně zpřístupněna. Tato technika, známá jako útok časování mezipaměti, umožňuje útočníkovi odvodit tajná data na základě pozorovaných rozdílů v časování. Klíčové kroky takového útoku jsou:
1. Školení Prediktoru větve: Útočník spustí řízenou sekvenci instrukcí, které ovlivňují stav prediktoru větve. Například opakované provádění instrukce větvení s konzistentním výsledkem (např. vždy přijatým) podmiňuje prediktor, aby očekával tento výsledek v budoucích provedeních.
2. Spuštění spekulativní exekuce: Útočník spustí kód oběti pomocí větvené instrukce závislé na tajných datech. Kvůli předchozímu výcviku útočníka přediktor větve spekulativně provede špatnou cestu, která zahrnuje přístup k paměti na základě tajných dat.
3. Měření přístupových časů mezipaměti: Po spekulativním provedení útočník změří dobu, kterou potřebuje k přístupu ke konkrétním paměťovým místům. Rychlejší časy přístupu naznačují, že data jsou přítomna v mezipaměti, což znamená, že k nim byl spekulativní přístup. Analýzou těchto načasování může útočník odvodit tajná data.
Abychom to ilustrovali na konkrétním příkladu, zvažte scénář, kdy tajná data určují index přístupu k poli v rámci větve. Útočník nejprve trénuje prediktor větvení tak, aby zaujal určitý směr větve. Když se spustí kód oběti, prediktor větve spekulativně provede přístup k poli na základě natrénovaného směru. Pokud spekulace zahrnuje přístup k určitému prvku pole, načte se odpovídající řádek mezipaměti. Útočník pak může provést řadu časovaných přístupů do paměti, aby určil, které řádky mezipaměti jsou načteny, a tím odvodí tajný index.
Zmírnění takových útoků zahrnuje několik strategií. Hardwarová řešení zahrnují zlepšení izolace mezi spekulativními a nespekulativními cestami provádění a zajištění, že spekulativní provádění neovlivní sdílené zdroje, jako je mezipaměť. Softwarová řešení zahrnují techniky, jako je vkládání „plotových“ instrukcí, aby se zabránilo spekulativnímu provádění za určité body v kódu, nebo používání praktik programování v konstantním čase, aby se zajistilo, že doba provádění nebude záviset na tajných datech.
Složitost a propracovanost útoků na časování založených na prediktoru větví podtrhuje potřebu neustálého výzkumu a vývoje v oblasti hardwarové i softwarové bezpečnosti. Jak se architektury CPU neustále vyvíjejí, musí se také vyvíjet strategie ochrany proti těmto a dalším formám útoků na postranní kanály.
Další nedávné otázky a odpovědi týkající se Útoky na časování CPU:
- Jaké jsou některé výzvy a kompromisy spojené s implementací hardwarových a softwarových zmírnění útoků načasování při zachování výkonu systému?
- Jak může programování v konstantním čase pomoci zmírnit riziko útoků načasování v kryptografických algoritmech?
- Co je spekulativní provádění a jak přispívá ke zranitelnosti moderních procesorů vůči útokům načasování, jako je Spectre?
- Jak útoky načasování využívají odchylky v době provádění k odvození citlivých informací ze systému?
- Co je to načasovací útok?