in-hloubka podívejte se na tyto nebezpečné využívání mikroprocesor zranitelností a proč tam může být více jich tam venku
Jsme zvyklí na myšlení počítačových procesorů jako řádný stroje, které vycházejí z jedné jednoduché instrukce na další s naprostou pravidelností. Ale pravdou je, že po celá desetiletí, dělali své úkoly mimo řád a jen hádali, co by mělo přijít dál. Jsou v tom samozřejmě velmi dobří. Ve skutečnosti je tak dobré, že tato schopnost, nazývaná spekulativní poprava, podpořila většinu zlepšení výpočetního výkonu během posledních 25 let. Ale 3. ledna 2018 se svět dozvěděl, že tento trik, který udělal tolik pro moderní výpočetní techniku, je nyní jednou z jeho největších zranitelností.
v Průběhu roku 2017, výzkumníci na Cyberus Technologie, Google Project Zero, Graz University of Technology, Rambus, University of Adelaide, University of Pennsylvania, stejně jako nezávislí výzkumníci, například cryptographer Paul Kocher, samostatně vyšlo útoky, které využil spekulativní provádění. Naše vlastní skupina objevila původní zranitelnost za jedním z těchto útoků již v roce 2016, ale nedali jsme všechny kousky dohromady.
tyto typy útoků, nazývané Meltdown a Spectre, nebyly žádné obyčejné chyby. V době, kdy to bylo objeveno, Meltdown mohl hacknout všechny mikroprocesory Intel x86 a procesory IBM Power, stejně jako některé procesory založené na ARM. Spectre a jeho mnoho variant přidalo do tohoto seznamu procesory Advanced Micro Devices (AMD). Jinými slovy, téměř celý svět výpočetní techniky byl zranitelný.
a protože spekulativní provádění je z velké části pečeno do hardwaru procesoru, oprava těchto zranitelností nebyla snadná práce. Pokud tak učiníte, aniž byste způsobili, že se výpočetní rychlosti brousí na nízký rychlostní stupeň, je to ještě těžší. Po roce totiž práce zdaleka nekončí. Bezpečnostní záplaty byly potřebné nejen z procesoru tvůrců, ale od těch, dále v dodavatelském řetězci, jako jsou Apple, Dell, Linux a Microsoft. První počítače poháněné čipy, které jsou záměrně navrženy tak, aby byly odolné i vůči některým z těchto zranitelností, dorazily teprve nedávno.
Spectre a Zhroucení jsou výsledkem rozdílu mezi tím, co software má dělat a procesor je mikroarchitektury—detaily, jak se to vlastně dělá ty věci. Tyto dvě třídy hacků odhalily způsob, jak prostřednictvím tohoto rozdílu unikat informace. A existuje každý důvod se domnívat, že bude odhaleno více způsobů. Loni jsme pomohli najít dvě, Branchscope a SpectreRSB.
Pokud chceme udržet tempo výpočetní vylepšení, bez obětování bezpečnosti, budeme muset pochopit, jak tyto hardwarové chyby se stávají. A to začíná pochopením přízraku a zhroucení.
V moderní počítačové systémy, software, programy napsané v lidské-srozumitelné jazyky jako C++ jsou sestaveny do sestavy-jazyk instrukce—základní operace, které procesor počítače může provést. Pro urychlení provádění používají moderní procesory přístup nazývaný pipelining. Stejně jako montážní linka je potrubí řadou etap, z nichž každá je krokem potřebným k dokončení instrukce. Některé typické fáze pro procesor Intel x86 zahrnují ty, které přinášejí instrukci z paměti a dekódují ji, aby pochopily, co instrukce znamená. Pipelining v podstatě přináší paralelismus na úroveň provádění instrukcí: když je jedna instrukce provedena pomocí fáze, další instrukce je zdarma k použití.
od 90. let se mikroprocesory spoléhaly na dva triky, aby urychlily proces potrubí: provádění mimo objednávku a spekulace. Pokud jsou dva pokyny na sobě nezávislé—to znamená, že výstup jednoho neovlivní vstup druhého-mohou být přeskupeny a jejich výsledek bude stále správný. To je užitečné, protože umožňuje procesoru pokračovat v práci, pokud se instrukce zastaví v potrubí. Pokud například instrukce vyžaduje data, která jsou v hlavní paměti DRAM, spíše než v mezipaměti umístěné v samotném CPU, může to trvat několik set hodinových cyklů. Místo čekání může procesor přesouvat další instrukci potrubím.
druhým trikem jsou spekulace. Chcete-li to pochopit, začněte tím, že některé pokyny nutně vedou ke změně pokynů. Zvažte program obsahující příkaz „if“: zkontroluje stav a pokud je podmínka pravdivá, procesor skočí na jiné místo v programu. Toto je příklad instrukce podmíněné větve, ale existují i další pokyny, které také vedou ke změnám v toku instrukcí.
nyní zvažte, co se stane, když taková instrukce větve vstoupí do potrubí. Je to situace, která vede k hlavolamu. Když pokyn dorazí na začátek potrubí, nevíme jeho výsledek, dokud nepostoupí poměrně hluboko do potrubí. A bez znalosti tohoto výsledku nemůžeme získat další pokyn. Jednoduchým, ale naivním řešením je zabránit vstupu nových instrukcí do potrubí, dokud instrukce větve nedosáhne bodu, kdy víme, odkud přijde další instrukce. Mnoho hodinových cyklů je v tomto procesu zbytečné, protože potrubí má obvykle 15 až 25 stupňů. Ještě horší je, že pokyny pobočky přicházejí poměrně často, což představuje více než 20 procent všech pokynů v mnoha programech.
, Aby se zabránilo vysoké náklady výkonu zablokování potrubí, moderní procesory používají architektonické jednotky, tzv. branch predictor, aby hádat, kde další instrukce, po větvi, bude pocházet z. Účelem tohoto prediktoru je spekulovat o několika klíčových bodech. Nejprve bude přijata podmíněná větev, která způsobí, že se program otočí do jiné části programu, nebo bude pokračovat na stávající cestě? A za druhé, pokud je pobočka přijata, kam bude program jít-jaká bude další instrukce? Vyzbrojeni těmito předpověďmi může být procesorové potrubí udržováno plné.
protože provádění instrukcí je založeno na predikci, provádí se „spekulativně“: pokud je predikce správná, výkon se podstatně zlepší. Pokud se však predikce ukáže jako nesprávná, musí být procesor schopen relativně rychle zrušit účinky všech spekulativně provedených instrukcí.
návrh prediktoru větve byl v komunitě počítačové architektury důkladně zkoumán po mnoho let. Moderní prediktory používají historii provádění v rámci programu jako základ pro své výsledky. Tento systém dosahuje přesnost přesahující 95 procent na mnoho různých typů programů, což vede k dramatickému zlepšení výkonu, ve srovnání s mikroprocesorem, že nebude spekulovat. Misspeculace je však možná. A bohužel, je to misspeculation, že útoky Spectre využít.
další formou spekulací, která vedla k problémům, jsou spekulace v rámci jediného pokynu v potrubí. To je dost nesrozumitelný koncept, tak si ho vybalíme. Předpokládejme, že instrukce vyžaduje povolení k provedení. Například instrukce by mohla nasměrovat počítač k zápisu kusu dat do části paměti vyhrazené pro jádro operačního systému. Nechtěli byste, aby se to stalo, pokud to nebylo schváleno samotným operačním systémem, nebo byste riskovali zhroucení počítače. Před objevem Zhroucení a Spectre, konvenční moudrost bylo, že to je v pořádku začít vykonávající instrukce spekulativně ještě předtím, než procesor dosáhl bodu kontrola, zda je či není výuka má povolení k dělat svou práci.
nakonec, pokud povolení není spokojen—v našem příkladu, operační systém neschválila tento pokus manipulovat s jeho paměť—výsledky jsou vyhozeni a program signalizuje chybu. Obecně platí, že procesor může spekulovat kolem jakoukoliv část pokynu, která by mohla způsobit, že se dočkat, za předpokladu, že stav je nakonec vyřešen a žádné výsledky špatné odhady jsou, účinně odčinit. Právě tento typ intra-instrukčních spekulací stojí za všemi variantami chyby Meltdown, včetně její pravděpodobně nebezpečnější verze, předzvěstí.
vhled, který umožňuje spekulace útoků je toto: Během misspeculation, žádná změna nastane, že program může přímo pozorovat. Jinými slovy, neexistuje žádný program, který byste mohli napsat, který by jednoduše zobrazoval všechna data generovaná během spekulativního provádění. Skutečnost, že dochází ke spekulacím, však zanechává stopy tím, že ovlivňuje, jak dlouho trvá provedení pokynů. A bohužel je nyní jasné, že můžeme detekovat tyto časové signály a extrahovat z nich tajná data.
jaké jsou tyto informace o načasování a jak se k nim hacker dostane? Abyste to pochopili, musíte pochopit koncept bočních kanálů. Boční kanál je nezamýšlená cesta, která uniká informace z jedné entity do druhé (obvykle jsou oba softwarové programy), obvykle prostřednictvím sdíleného zdroje, jako je pevný disk nebo paměť.
Jako příklad side-channel útok, zvažte zařízení, které je naprogramován tak, aby poslouchat zvuk vycházející z tiskárny, a pak používá ten zvuk odvodit to, co je vytištěno. Zvuk je v tomto případě bočním kanálem.
v mikroprocesorech může být jakýkoli sdílený hardwarový prostředek v zásadě použit jako boční kanál, který uniká informace z programu oběti do programu útočníka. Při běžně používaném útoku na boční kanál je sdíleným zdrojem mezipaměť CPU. Mezipaměť je relativně malá paměť s rychlým přístupem na procesorovém čipu používaná k ukládání dat, která program nejčastěji potřebuje. Když program přistupuje k paměti, procesor nejprve zkontroluje mezipaměť; pokud jsou data tam (zásah do mezipaměti), rychle se obnoví. Pokud data nejsou v mezipaměti (chybí), procesor musí počkat, až bude načten z hlavní paměti, což může trvat několik set hodinových cyklů. Ale jakmile data dorazí z hlavní paměti, je přidán do mezipaměti, což může vyžadovat házet nějaké další údaje, aby se prostor. Mezipaměť je rozdělena do segmentů nazývaných sady mezipaměti a každé umístění v hlavní paměti má odpovídající sadu v mezipaměti. Tato organizace usnadňuje kontrolu, zda je něco v mezipaměti, aniž byste museli prohledávat celou věc.
útoky založené na mezipaměti byly rozsáhle zkoumány ještě předtím, než se na scéně objevil Spectre a Meltdown. I když útočník nemůže přečíst přímo oběti dat, i když, že data sedí ve sdílené zdroje, jako jsou cache—útočník může získat informace o adresy paměti přístupné oběť. Tyto adresy mohou záviset na citlivých datech, což umožňuje chytrému útočníkovi Obnovit tato tajná data.
jak to útočník dělá? Existuje několik možných způsobů. Jedna varianta, nazvaná Flush a Reload, začíná tím, že útočník odstraní sdílená data z mezipaměti pomocí instrukce“ flush“. Útočník pak čeká, až oběť získá přístup k těmto datům. Protože již není v mezipaměti, musí být všechna data, která oběť požaduje, přenesena z hlavní paměti. Později útočník přistupuje ke sdíleným datům a zároveň načasuje, jak dlouho to trvá. Zásah do mezipaměti-což znamená, že data jsou zpět v mezipaměti-znamená, že oběť přistupovala k datům. Chybějící mezipaměť znamená, že data nebyla přístupná. Jednoduše měřením, jak dlouho trvalo přístup k datům, může útočník určit, ke kterým sadám mezipaměti byla oběť přístupná. Vyžaduje to trochu algoritmické magie, ale tato znalost toho, které soubory mezipaměti byly přístupné a které nebyly, může vést k objevení šifrovacích klíčů a dalších tajemství.
Meltdown, Spectre a jejich varianty se řídí stejným vzorem. Nejprve vyvolávají spekulace o provedení kódu požadovaného útočníkem. Tento kód čte tajná data bez povolení. Poté útoky sdělují tajemství pomocí Flush a Reload nebo podobného postranního kanálu. Tato poslední část je dobře pochopena a podobná ve všech variantách útoku. Útoky se tedy liší pouze v první složce, což je způsob, jak vyvolat a využít spekulace.
Meltdown útoky
Meltdown útoky využívají spekulace v rámci jedné instrukce. Ačkoli instrukce v jazyce sestavení jsou obvykle jednoduché, jedna instrukce se často skládá z více operací, které mohou na sobě záviset. Například operace čtení paměti jsou často závislé na instrukci splňující oprávnění spojená se čtenou adresou paměti. Aplikace má obvykle oprávnění číst pouze z paměti, která jí byla přidělena, nikoli z paměti přidělené například operačnímu systému nebo programu jiného uživatele. Logicky bychom měli zkontrolovat oprávnění, než umožníme čtení pokračovat, což dělají některé mikroprocesory, zejména ty z AMD. Avšak za předpokladu, že konečný výsledek je správný, návrháři CPU předpokládali, že mohou tyto operace spekulativně provádět mimo provoz. Proto, Intel mikroprocesorů přečtěte si paměti před kontrolou oprávnění, ale pouze „spáchat“ instrukce—takže výsledky viditelné do programu—pokud jsou oprávnění splněny. Ale protože tajná data byla načtena spekulativně, to může být zjištěno pomocí vedlejší kanál, takže procesory Intel zranitelné vůči tomuto útoku.
útok předzvěstí je variací zranitelnosti Meltdown. Tento útok ovlivňuje mikroprocesory Intel kvůli slabosti, kterou Intel označuje jako L1 Terminal Fault (L1TF). Zatímco původní Zhroucení útoku spoléhal na zpoždění v kontrole oprávnění, Nastínit opírá o spekulace, ke které dochází během fáze plynovodu tzv. překlad adres.
Software prohlíží paměť a paměť počítače jako jeden souvislý úsek virtuální paměti, který je vlastní. Fyzicky jsou však tato aktiva rozdělena a sdílena mezi různé programy a procesy. Překlad adresy změní adresu virtuální paměti na adresu fyzické paměti.
specializované obvody na mikroprocesoru pomáhají s překladem virtuální do fyzické paměti, ale mohou být pomalé a vyžadují více vyhledávání paměti. Aby se věci urychlily, mikroprocesory Intel umožňují spekulace během procesu překladu, což umožňuje programu spekulativně číst obsah části mezipaměti zvané L1 bez ohledu na to, kdo tato data vlastní. Útočník to může udělat a poté zveřejnit data pomocí přístupu postranního kanálu, který jsme již popsali.
v některých ohledech je předzvěst nebezpečnější než zhroucení, v jiných ohledech je méně. Na rozdíl od Meltdown může Foreshadow číst obsah pouze mezipaměti L1 kvůli specifikům implementace architektury procesoru Intel. Nicméně, Foreshadow může číst jakýkoli obsah v L1-nejen data adresovatelná programem.
útoky Spectre
útoky Spectre manipulují systémem predikce větví. Tento systém má tři části: prediktor směru větve, prediktor cíle větve a vyrovnávací paměť návratového zásobníku.
pobočka-směr prediktor předpovídá, zda podmíněné větvi, jako jeden použit k provedení „if“, v programovacím jazyce, bude přijata či nikoliv. Za tímto účelem sleduje předchozí chování podobných větví. Může to například znamenat, že pokud je větev odebrána dvakrát za sebou, budoucí předpovědi řeknou, že by měla být přijata.
prediktor branch-target předpovídá cílovou paměťovou adresu tzv. nepřímých větví. V podmíněné větvi je uvedena adresa další instrukce, ale pro nepřímou větev musí být tato adresa vypočtena jako první. Systém, který předpovídá tyto výsledky, je struktura mezipaměti nazývaná vyrovnávací paměť branch-target. V podstatě sleduje poslední vypočítaný cíl nepřímých větví a používá je k předpovědi, kam by měla další nepřímá větev vést.
vyrovnávací paměť návratového zásobníku se používá k predikci cíle instrukce „návrat“. Když je podprogram „volán“ během programu, návratová instrukce způsobí, že program obnoví práci v místě, ze kterého byl podprogram vyvolán. Snaží předpovědět správný bod, aby se vrátit pouze na základě předchozího zpáteční adresy nebude fungovat, protože stejné funkce může být volána z mnoha různých místech v kódu. Místo toho systém používá vyrovnávací paměť zpětného zásobníku, část paměti na procesoru, která udržuje zpětné adresy funkcí tak, jak se nazývají. Tyto adresy pak použije, když se v kódu podprogramu objeví návrat.
každá z těchto tří struktur může být využita dvěma různými způsoby. Za prvé, prediktor může být úmyslně mylný. V tomto případě útočník provede zdánlivě nevinný kód, který má systém zmást. Později, útočník úmyslně provede větev, která bude misspeculate, což způsobuje program pro skok na část kódu, zvolený útočníkem, tzv. gadget. Gadget pak nastaví o krádeži dat.
druhý způsob útoku Spectre se nazývá přímá injekce. Ukazuje se, že za určitých podmínek jsou tři prediktory sdíleny mezi různými programy. Co to znamená, že útočící program může vyplnit ukazatelem struktury s pečlivě vybranými špatné údaje, jak to provede. Když nic netušící oběť spustí svůj program, a to buď ve stejnou dobu jako útočník nebo později, oběť bude skončit pomocí prediktor státu, které bylo vyplněno útočník a nevědomky spustil gadget. Tento druhý útok je obzvláště znepokojivý, protože umožňuje napadení programu oběti z jiného programu. Taková hrozba je obzvláště škodlivá pro poskytovatele cloudových služeb, protože nemohou zaručit, že jejich klientská data jsou chráněna.
zranitelnosti Spectre a Meltdown představovaly hlavolam pro výpočetní průmysl, protože zranitelnost pochází z hardwaru. V některých případech je nejlepší, co můžeme udělat pro stávající systémy-které tvoří většinu nainstalovaných serverů a počítačů-pokusit se přepsat software a pokusit se omezit poškození. Tato řešení jsou však ad hoc, neúplná a často mají za následek velký zásah do výkonu počítače. Současně vědci a návrháři CPU začali přemýšlet o tom, jak navrhnout budoucí procesory, které udržují spekulace bez ohrožení bezpečnosti.
jedna obrana, nazvaná kernel page-table isolation (KPTI), je nyní zabudována do Linuxu a dalších operačních systémů. Připomeňme, že každá aplikace považuje paměť počítače a úložná aktiva za jediný souvislý úsek virtuální paměti. Fyzicky jsou však tato aktiva rozdělena a sdílena mezi různé programy a procesy. Tabulka stránek je v podstatě mapa operačního systému, která jí říká, které části adresy virtuální paměti odpovídají adresám fyzické paměti. Tabulka stránek jádra je zodpovědná za to pro jádro operačního systému. KPTI a podobné systémy bránit proti Zhroucení tím, že tajná data v paměti, jako je OS, nepřístupné, když uživatel program (a potenciálně útočník program) je spuštěn. Provede to odstraněním zakázaných částí z tabulky stránek. Tímto způsobem ani spekulativně provedený kód nemůže přistupovat k datům. Toto řešení však znamená další práci pro operační systém, aby tyto stránky zmapoval, když je provede, a poté je odmapoval.
další třída obrany dává programátorům sadu nástrojů k omezení nebezpečných spekulací. Například oprava Retpoline společnosti Google přepisuje druh větví, které jsou zranitelné vůči Spectre Variant 2, takže nutí spekulace zaměřit se na benigní, prázdný gadget. Programátoři mohou také přidat instrukci assembly-language, která omezuje Spectre v1, omezením spekulativní paměti čte, které následují podmíněné větve. Pohodlně je tato instrukce již přítomna v architektuře procesoru a používá se k vynucení správného uspořádání mezi paměťovými operacemi pocházejícími z různých procesorových jader.
jako návrháři procesorů museli Intel a AMD jít hlouběji než běžná softwarová oprava. Jejich opravy aktualizují mikrokód procesoru. Mikrokód je vrstva instrukcí, která se hodí mezi jazykem sestavy běžného softwaru a skutečnými obvody procesoru. Mikrokód přidává flexibilitu sady instrukcí, které může procesor spustit. To také usnadňuje navrhnout CPU, protože při použití mikrokódu, složité pokyny jsou přeloženy do několika jednodušších instrukcí, které jsou snadněji provádět v potrubí.
v zásadě Intel a AMD upravily svůj mikrokód tak, aby změnily chování některých instrukcí v jazyce sestavení způsobem, který omezuje spekulace. Například, Intel inženýři přidali možnosti, které interferují s některými útoky tím, že operační systém vyprázdnit pobočka-prediktor struktur za určitých okolností.
jiná třída řešení se pokouší narušit schopnost útočníka přenášet data pomocí postranních kanálů. Například Technologie mit DAWG bezpečně rozděluje mezipaměť procesoru tak, aby různé programy nesdílely žádný ze svých zdrojů. Nejambiciózněji existují návrhy na nové architektury procesorů, které by zavedly struktury na CPU, které jsou věnovány spekulacím a odděleny od mezipaměti procesoru a dalšího hardwaru. Tímto způsobem nejsou nikdy viditelné žádné operace, které jsou prováděny spekulativně, ale nejsou nakonec spáchány. Pokud je výsledek spekulace potvrzen, jsou spekulativní data odeslána do hlavních struktur procesoru.
chyby spekulací ležely v procesorech déle než 20 let a zůstaly, pokud někdo ví, nevyužité. Jejich objev podstatně otřásl průmyslem a zdůraznil, jak kybernetická bezpečnost není problémem pouze pro softwarové systémy, ale také pro hardware. Od počátečního objevu bylo odhaleno asi tucet variant Spectre a Meltdown a je pravděpodobné, že jich je více. Spectre a Meltdown jsou koneckonců vedlejšími účinky principů návrhu jádra, na které jsme se spoléhali při zlepšování výkonu počítače, což ztěžuje odstranění takových zranitelností v současných návrzích systému. Je pravděpodobné, že nové CPU budou vyvíjet udržet spekulace, a zároveň zabránit typu side-channel úniku, který umožňuje tyto útoky. Nicméně, budoucí návrháři počítačových systémů, včetně těch, kteří navrhují procesorové čipy, si musí být vědomi bezpečnostních důsledků svých rozhodnutí, a již ne optimalizovat pouze pro výkon, velikost, a výkon.
o autorovi
Nael Abu-Ghazaleh je předsedou programu počítačového inženýrství na Kalifornské univerzitě v Riverside. Dmitrij Evtyushkin je odborným asistentem informatiky na vysoké škole Williama a Marie ve Williamsburgu va. Dmitrij Ponomarev je profesorem informatiky na státní univerzitě v New Yorku v Binghamtonu.
zjistit více
Paul Kocher a další badatelé, kteří se souhrnně zveřejněny Spectre první to vysvětlil tady . Moritz Lipp vysvětlil zhroucení v této přednášce na Usenix Security ‚ 18. Foreshadow byl podrobně popsán na stejné konferenci.
skupina vědců včetně jednoho z autorů přijít s systematické hodnocení Spectre a Zhroucení útoky, které odhaluje další potenciální útoky . IBM technici udělal něco podobného, a inženýři Google nedávno přišel k závěru, že vedlejší kanál a spekulativní provádění útoků jsou zde k pobytu .