Volně přeloženo z textu What are Meltdown and Spectre? Here’s what you need to know, jehož autorem je Jon Masters ze společnosti Red Hat. Vydáno se svolením autora.
Všechna média mluví o nově objevených bezpečnostních hrozbách, které zahrnují i napadení vlastností moderních procesorů, které pohánějí naše počítače, tablety, telefony a další přístroje. Tyto útoky se nazývají „Meltdown“ a „Spectre“ a přitahují hodně pozornosti. Lidé se (oprávněně) obávají a je samozřejmě velmi důležité aplikovat všechny dostupné softwarové záplaty, které byly pečlivě vytvořeny a zveřejněny. Přední technologické firmy, včetně Red Hatu, pracují společně na tom, aby minimalizovaly potenciální riziko útoku.
V Red Hatu jsme pracovali na zmírnění dopadů případných útoků pod standardním bezpečnostním embargem, takže jsme cíleně vytvářeli malé týmy vybavené minimálními nutnými informacemi, abychom byli připraveni ještě před veřejným odhalením celého problému. Měl jsem to štěstí, že jsem mohl být mezi těmi, kteří vedli naše snahy o řešení problémů Meltdown a Spectre, které jsou také známé jako varianty 1, 2 a 3 celé rodiny útoků, kterou Google Project Zero zveřejnil 3. ledna. V rámci našich snah jsme ve svých laboratořích reprodukovali Meltdown (variantu 3) a prozkoumali další varianty. Mezi tím jsme spolupracovali s našimi hardwarovými partnery na řešeních.
Rozumíme velmi dobře těmto chybám a máme k dispozici nejnovější analýzy i záplaty zmírňující potenciální dopad. Pokračujeme ve spolupráci s našimi partnery, zákazníky a výzkumníky při řešení této situace. Zároveň bychom rádi ostatním pomohli v pochopení těchto komplexních potíží, ideálně tak, abychom použili jazyk a pojmy, které po čtenáři nevyžadují, aby rozuměl problematice tvorby počítačových procesorů.
Pokud vás zajímají technické detaily, původní studie a související publikace jsou dostupné na webech meltdownattack.com a spectreattack.com. Mějte ale na paměti, že většina z jejich tvůrců jsou lidé s akademickým vzděláním týkajícím se architektur počítačů. Minimálně jeden z nich má v této oblasti titul Ph.D. Nebuďte tedy nešťastní z toho, že vám bude trvat dlouho, než proniknete do všech technických detailů – je to velmi komplexní a složitá problematika.
Spekulativní provádění instrukcí
Abychom mohli pokračovat, musíme pochopit něco o spekulativním provádění instrukcí. Použijeme k tomu každodenní analogii.
Představte si běžného zákazníka, který navštěvuje denně stejnou kavárnu a objednává si každé ráno stejný nápoj. V průběhu času si jej baristé zapamatují a budou znát jeho obvyklou objednávku. Protože chtějí nabídnout špičkové služby (a případně ušetřit svému zákazníkovi čas ve frontě), mohou se baristé rozhodnout, že začnou připravovat obvyklý nápoj, jakmile zákazníka uvidí vejít do dveří a zamávat na pozdrav. Jednoho dne ale zákazník změní svou objednávku. V takovou chvíli musí barista vylít v předstihu připravenou kávu a udělat novou podle zákazníkova přání.
Pojďme ještě o krok dále a představme si, že barista zná zákazníkovo jméno. Když v předstihu připraví obvyklý nápoj, rovnou fixou na kelímek jméno napíše. Pokud se zákazník výjimečně rozhodně pro změnu, celý kelímek i se jménem je vyhozen do koše. V tu chvíli je ale jméno i obsah viditelný pro kohokoliv, kdo se právě dívá.
Scénář s kavárnou zavádí spekulaci. Zaměstnanci neví jistě, zda si daný zákazník chce dát latte nebo Americano. Z historických dat ale ví, co si daný zákazník obvykle dává a mohou tak učinit kvalifikovaný odhad, aby zkrátili čas vyřízení objednávky. Podobné spekulativní odhady používáme každý den, protože se obvykle ukáží být správné a ve výsledku tak za stejný čas stihneme udělat víc.
Stejné je to s našimi počítači. Ty používají techniku zvanou „spekulativní provádění instrukcí“, aby provedly některé operace ještě dříve, než bude jisté, že budou potřeba. Předpokládá se přitom, že vše je založené na správných odhadech, které obvykle ušetří čas.
Koukáme pod ruce procesoru
V případě počítačů se toto spekulativní provádění používá k rozhodování při testech jako „pokud A, udělej toto; jinak udělej tohle“. Říkáme tomu testování podmínek a výsledkem je provádění kódu, kterému říkáme podmíněné větvení. Větev označuje část programu, kterou jsme se rozhodli provádět na základě výsledku rozhodování. Moderní procesory disponují sofistikovanými algoritmy schopnými toto větvení předvídat. Jsou tak schopné určit, jaký bude pravděpodobně výsledek rozhodovacího testu, ještě před tím, než bude skutečně proveden. V mezidobí pak spekulativně provedou kód ve větvi, kterou se bude pravděpodobně nutné za chvíli vydat. Pokud se odhad ukáže být správným, procesor zdánlivě poběží rychleji, než kdyby doopravdy čekal na dokončení testu. Pokud byl odhad špatný, procesor zahodí zpracované výsledky a běžným způsobem začne provádět kód v jiné větvi.
Algoritmy pro předvídání jsou obvykle úspěšné v 99 % případů, takže potenciální výkonnostní dopad spekulativního vykonávání kódu je významný. Ve skutečnosti jde jen o jednu z mnoha optimalizačních technik, které pomáhaly dramaticky zvyšovat výkon počítačů v posledních několika desetiletích. Pokud se správně implementuje, je zvýšení výkonu značné. Zdrojem nově objevených problémů je předpoklad, že spekulativní proces je černá skříň, do které nevidí vnější pozorovatel.
Celé odvětví se domnívalo, že cokoliv se děje během celé spekulace (proces se nazývá „okno spekulativního provádění“) je později buď potvrzeno nebo je to popřeno a bezpečně zahozeno. Ukázalo se ale, že existují způsoby, jakými mohou útočníci sledovat, co se během procesu dělo a na základě toho pak mohou se systémem manipulovat. Útočník může dokonce řídit chování předvídacích algoritmů tak, aby způsobil spekulativní spuštění těch částí kódu, které by procesor jinak nikdy neprováděl. Očekáváme, že tyto a další podobné chyby ovlivní to, jak budou procesory navrhovány v budoucnu – abychom mohli používat spekulativní provádění bez rizik.
Meltdown
Pojďme se na popsané útoky podívat podrobněji, začneme s Meltdown (varianta 3). Ten na sebe strhává více pozornosti, protože má širší dopady. Při provádění tohoto útoku je čip manipulován tak, že načte citlivá data během spekulativního okna, aby je později útočník mohl prozkoumat. Celé to stojí na běžné praxi, že je načítání dat z paměti odděleno od procesu kontroly oprávnění. Všichni doposud věřili, že je celý proces neviditelný, takže to vlastně nikomu nevadilo.
Během útoku Meltdown je pečlivě sestaven útočný kód, který bude spuštěn během spekulativního procesu. Tento kód načítá citlivá data, ke kterým za normálních okolností nemá proces přístup. Protože se ale vše provádí spekulativně, zároveň probíhá kontrola oprávnění, která není ukončena před doběhnutím daného spekulativního okna. V důsledku se do cache procesoru nahrají chráněná data. Poté se spustí druhá pečlivě připravená sekvence, která provede jinou operaci na základě získaných citlivých dat. Za normálních okolností by výsledky tohoto běhu nebyly nikdy vidět, protože by byly potichu zahozeny. Útočník ale může využít techniku známou jako analýza cache postranním kanálem a může z dočasné paměti vyčíst uložená data.
Odstranění této chyby vyžaduje změnu ve správě paměti mezi aplikacemi a operačním systémem. Představili jsme novou technologii nazvanou KPTI, která odděluje paměť tak, že citlivá data nemohou být načtena do interní cache, pokud běží uživatelem spuštěný kód. Vyžaduje to ale další kroky, které jsou prováděny vždy, když aplikace požádá o některou akci operačního systému (tomu říkáme „systémová volání“). Tím ale přicházíme o část výkonu, jejíž velikost je dána tím, jak často daný proces volá služby operačního systému.
Spectre
Útok Spectre má dvě části. První (varianta 1) porušuje kontrolu omezení. Opět, když se spekulativně provádí kód, čip může načíst nějaká data, která jsou pak použita k lokalizaci jiných dat. V rámci výkonnostních optimalizací se ale může procesor rozhodnout načíst rovnou druhou část dat, aniž by ověřil, že první část je v definovaném rozsahu hodnot. Pokud k tomu dojde, je možné sestavit kód tak, aby byl spekulativně vykonán a načetl citlivá data do cache procesoru. Odtud mohou být získána opět pomocí útoku postranním kanálem, jak bylo zmíněno dříve.
Abychom tento problém odstranili, musíme přidat okolo celého jádra něco, čemu říkáme „paměťové bariéry“ (load fences). To zabrání spekulativnímu hardware, aby provedl druhé načtení založené na tom prvním. Vyžaduje to malé, triviální a ne příliš výkonově náročné změny ve zdrojovém kódu jádra. Náš tým vytvořil nové nástroje, které pomáhají odhalit místa, kam by tento plot měl být umístěn.
Druhá část útoku Spectre (varianta 2) je v mnoha ohledech tou nejzajímavější. Pracuje s trénováním předvídacího hardware, který pak při spekulativním provádění upřednostní jiný kód než je obvyklé. Běžnou hardwarovou optimalizací je založit rozhodování o daném větvení programu na základě adresy kódu dané větve v paměti. Bohužel způsob uložení této adresy není mezi aplikacemi a jádrem operačního systému unikátní. To umožňuje natrénovat algoritmus tak, aby spustil libovolný kód, který si bude útočník přát. Vhodným zvolením existujícího jaderného kódu, který má přístup k citlivým datům, může útočník tato data načíst do cache a poté pomocí známého útoku postranním kanálem tato data získat.
Jedním z největších strašáků tohoto útoku je možnost obejít hranice mezi jádrem operačního systému a hypervizorem nebo mezi různými virtuálními stroji běžícími na společném hardware. Algoritmy je totiž možné natrénovat tak, že je spekulativně spuštěn privilegovaný kód hypervizoru (nebo jiného virtuálního stroje), který načte data a útočníkovi je zpřístupní. To vytváří vážné riziko pro privátní i veřejná cloudová prostředí běžící na nezáplatovaných serverech.
Oprava druhé části Spectre vyžaduje, aby operační systém selektivně vypínal hardware pro předvídání, kdykoliv nějaký program zavolá operační systém (systémové volání) nebo hypervizor. V takové situaci nebude žádný pokus o trénování algoritmů předán do jádra, hypervizoru nebo mezi jednotlivými virtuály na stejném serveru. Toto opatření funguje dobře, ale přináší výkonnostní postih, který není zanedbatelný. Naše záplaty ve výchozím stavu tuto změnu implementují, ale dávají správcům možnost ji vypnout. Zároveň pracujeme s linuxovou komunitou na tom, abychom dopad snížili a našli alternativu k vypnutí předvídacích funkcí. Jedna z možností je známá jako „retpoline“ a jde o speciálně sestavený kód jádra, který brání nesprávnému spekulativnímu běhu.
Nepanikařte, řešení existuje
Doufám, že vám tento článek dal nahlédnout do hlubin těchto velmi sofistikovaných útoků. Jejich zneužití není triviální, záplatování je možné a přestože jsou už dostupné některé příklady používající Meltdown (varianta 3), velcí výrobci už začali distribuovat záplaty. V průběhu času mohou být objeveny další související zranitelnosti a mohou se objevit příklady jejich zneužití. Je proto důležité sledovat bezpečnostní záplaty a aplikovat je, jakmile budou dostupné.
Je důležité mít na paměti, že tento nový druh bezpečnostních chyb byl odhalen teprve před několika dny. Takže se v průběhu času mohou měnit doporučené postupy i způsoby řešení těchto problémů. Budeme i nadále spolupracovat s velkými společnostmi i open-source komunitou, abychom ochránili své zákazníky před těmito a dalšími známými zranitelnostmi a učinili Linux ještě robustnějším vůči útokům typu Meltdown a Spectre. V následujících měsících zveřejníme další informace o této činnosti. Pro více informací navštivte access.redhat.com.