Spectre (zranitelnost)

Spectre  - skupina hardwarových zranitelností , chyba ve většině moderních procesorů, které mají spekulativní provádění instrukcía pokročilá predikce větvení , umožňující čtení dat prostřednictvím kanálu třetí strany ve formě společné hierarchie mezipaměti . Ovlivňuje většinu moderních mikroprocesorů, zejména architektury x86/x86_64 (Intel a AMD) a některá jádra procesorů ARM [1] .

Tato zranitelnost potenciálně umožňuje lokálním aplikacím (lokálnímu útočníkovi při spuštění speciálního programu) přístup k obsahu virtuální paměti aktuální aplikace nebo jiných programů [2] [3] [4] . Hrozbě byly přiřazeny dva identifikátory CVE: CVE -2017-5753 a CVE-2017-5715 .

Historie

Spectre byl objeven nezávisle výzkumníky severoamerické korporace Google ( Project Zero ) a skupinou spolupracující s Paulem Kocherem za účasti zaměstnanců Technické univerzity v Grazu . Chyba zabezpečení byla nalezena v polovině roku 2017 a několik měsíců byla uzavřena diskuse a oprava. Zveřejnění podrobností a oprav bylo naplánováno na 9. ledna 2018, ale podrobnosti o zranitelnosti byly zveřejněny 4. ledna 2018 ve stejnou dobu jako útok Meltdown , a to kvůli publikacím novinářů The Register [5] , kteří se dozvěděli o opravy KAISER/KPTI pro boj s Meltdown z mailing listu jádra Linuxu [6] .

Význam

Chyba Spectre umožňuje aplikacím se zlými úmysly spuštěnými na daném počítači získat přístup pro čtení k libovolným místům v paměti počítače , které používá proces oběti, jako jsou jiné aplikace (tj. prolomit izolaci paměti mezi programy). Útok Spectre postihuje většinu počítačových systémů, které používají vysoce výkonné mikroprocesory, včetně osobních počítačů, serverů, notebooků a řady mobilních zařízení [7] . Konkrétně útok Spectre byl demonstrován na procesorech vyráběných společnostmi Intel a AMD a na čipech využívajících procesorová jádra ARM .

Existuje varianta útoku Spectre, která využívá JavaScriptové programy k získání přístupu do paměti prohlížečů (čtení dat z jiných stránek nebo dat uložených v prohlížeči) [8] .

Implementace pomocí chybné predikce větví

Předpokládejme, že fragment kódu oběti zpracuje

if ( x < velikost_pole1 ) y = pole2 [ pole1 [ x ] * 256 ];

je součástí funkce, která přijímá celé číslo bez znaménka x z nedůvěryhodného zdroje, a proces provádějící tento kód má přístup k poli 8bitových celých čísel bez znaménka pole1 velikosti pole1_size a druhému poli 8bitových celých čísel bez znaménka pole2 velikost 64 kb.

Tento fragment začíná kontrolou, že x je platná hodnota. A tato kontrola je z bezpečnostního hlediska zásadní. Zejména zabraňuje čtení informací za hranicemi pole1 . V jeho nepřítomnosti mohou neplatné hodnoty x buď vyvolat výjimku při pokusu o čtení dat mimo dostupnou paměť procesu, nebo číst důvěrné informace přístupné procesu zadáním x = <secret_byte_address> - <array1_address_array1> .

Bohužel chybná předpověď podmíněné větve při spekulativním provádění instrukcí může vést k provedení větve programového kódu, která by za normálních podmínek nebyla nikdy provedena [9] .

Výše uvedený fragment kódu lze například spustit za následujících podmínek:

  • hodnota x je vybrána tak, aby byla mimo hranice pole1 a hodnota pole1[x] ukazuje na bajt k tajných dat v paměti procesu oběti,
  • hodnoty pole1_size a pole2 nejsou v mezipaměti procesoru a tajný bajt k je v mezipaměti,
  • předchozí volání tohoto fragmentu kódu byla provedena s platnými hodnotami x (tj. byla splněna podmínka x < velikost pole1 ).

Takové stavy mohou vznikat spontánně, mohou však vznikat i účelově, například načtením velkého množství cizích dat za účelem naplnění mezipaměti procesoru těmito daty a v důsledku toho vyřazení array1_size a array2 z mezipaměti a pak zavolejte funkci jádra, která používá tajný bajt k , aby se uložil do mezipaměti. Pokud je však struktura cache známa nebo procesor dobrovolně poskytne instrukci pro reset mezipaměti (například instrukce cflush pro procesory rodiny x86 ), pak je úloha vytvoření nezbytných podmínek pro provedení fragmentu kódu značně zjednodušena.

Fragment kódu začíná porovnáním hodnoty x s hodnotou pole1_size . Čtení hodnoty array1_size za podmínek popsaných výše bude mít za následek vynechání mezipaměti, což zase povede k čekání na hodnotu array1_size na načtení z RAM. V důsledku přítomnosti mechanismu provádění spekulativních instrukcí v procesoru nebude během čekací doby procesor nečinný, ale pokusí se provést jednu z větví programového kódu následující po instrukci větve.

Vzhledem k tomu, že předchozí přístupy k fragmentu byly provedeny s platnými hodnotami x , bude prediktor větvení předpokládat, že tentokrát bude predikát (x < velikost_pole1) pravdivý, a procesor se pokusí provést odpovídající sekvenci instrukcí. Přečte totiž bajt na <adresa_pole> + x , tedy tajný bajt k , který je díky speciálně vytvořeným podmínkám již v mezipaměti. Poté procesor použije výslednou hodnotu k vyhodnocení výrazu k * 256 a přečte prvek pole2[k * 256] , což bude mít za následek druhé vynechání mezipaměti, a počká na hodnotu pole2[k * 256] . načteno z RAM. V tomto okamžiku bude hodnota array1_size získána z RAM , procesor rozpozná chybu prediktoru větve a obnoví stav architektury do okamžiku před začátkem provádění nesprávné větve programového kódu.

Na skutečných procesorech však spekulativní čtení pole2[k * 256] ovlivní stav mezipaměti procesoru a tento stav bude záviset na k . K dokončení útoku je potřeba pouze detekovat tuto změnu pomocí útoku postranním kanálem (útočník musí mít přístup ke sdílené mezipaměti procesoru a zdroji přesného času) a na základě toho vypočítat tajný bajt k . To je snadné, protože čtení prvků pole2[n * 256] bude rychlé pro n = k a pomalé pro ostatní hodnoty.

Použití nesprávné predikce nepřímých skoků

Nepřímá větev může k větvení používat více než dvě adresy. Například instrukce procesoru x86 -family mohou přeskakovat pomocí hodnoty adresy v registru ( jmp eax ), v paměti ( jmp [eax] nebo jmp dword ptr [0xdeadc0de] ) nebo na zásobníku ( ret ). Instrukce nepřímého skoku lze nalézt také v ARM ( mov pc, r14 ), MIPS ( jr $ra ), SPARC ( jmpl %o7 ), RISC-V ( jarl x0,x1,0 ) a mnoha dalších.

Pokud je určení adresy nepřímé větve zpožděno kvůli chybě ve vyrovnávací paměti a prediktor nepřímé větve je „trénován“ se speciálně vybranými adresami, může dojít ke spekulativnímu provádění instrukcí na adrese zadané útočníkem. Příkazy, které by jinak nebyly nikdy provedeny. Pokud takový výkon zanechá měřitelné vedlejší účinky , pak se jeho použití stává mocným nástrojem v rukou útočníka.

Opravy

V současné době neexistují žádné hotové softwarové technologie na ochranu proti útoku Spectre, i když se na nějaké práci pracuje [10] . Podle webové stránky věnované propagaci útoku „není to tak snadné opravit a (chyba) nás bude pronásledovat ještě dlouho.“

Oprava softwaru může zahrnovat rekompilaci softwaru pomocí nových kompilátorů, které nahradí zranitelné sekvence strojového kódu (tzv. mechanismus „retpoline“, implementovaný v GCC a Clang / LLVM ) [11] .

Výrobci procesorů navrhli několik oprav, některé vyžadují aktualizace mikrokódu procesoru, jiné vyžadují přidání nových instrukcí do budoucích procesorů. Opravy by měly být kombinovány s rekompilací softwaru [11] .

V dřívějších verzích upozornění Spectre CVE CERT navrhoval výměnu procesorů jako odpověď na zranitelnost: „Zranitelnost je způsobena volbami v návrhu mikroprocesorů. Úplné odstranění zranitelnosti vyžaduje výměnu dotčených mikroprocesorů.“ V dalších textech však již tato verze opravy nebyla zmíněna [11] .

Viz také

Poznámky

  1. Greenberg, Andy Kritická chyba Intelu prolomila základní zabezpečení většiny počítačů . Wired (časopis) (3. ledna 2018). Staženo 3. 1. 2018. Archivováno z originálu 3. 1. 2018.
  2. Zaměstnanci. Meltdown a Spectre . Technická univerzita v Grazu (2018). Staženo 3. 1. 2018. Archivováno z originálu 3. 1. 2018.
  3. Metz, Cade . Výzkumníci objevili dvě hlavní chyby ve světových počítačích  , The New York Times  (3. ledna 2018). Archivováno z originálu 3. ledna 2018. Staženo 3. ledna 2018.
  4. Warren, Tom . Procesory Intel mají bezpečnostní chybu a oprava by mohla zpomalit PC , The Verge  (3. ledna 2018). Archivováno z originálu 3. ledna 2018. Staženo 3. ledna 2018.
  5. Archivovaná kopie . Staženo 6. 1. 2018. Archivováno z originálu 7. 4. 2018.
  6. Porozumění Meltdown & Spectre: Co vědět o nových exploitech, které ovlivňují prakticky všechny CPU . Staženo 6. 1. 2018. Archivováno z originálu 6. 1. 2018.
  7. Aktivovat aktualizace zabezpečení – Arm Developer . Získáno 4. 1. 2018. Archivováno z originálu 4. 4. 2018.
  8. Spekulativní provádění útok na boční kanál ("Spectre") - Mozilla . Staženo 6. 1. 2018. Archivováno z originálu 16. 5. 2018.
  9. Článek " Spectre Attacks: Exploiting Speculative Execution Archived 3. ledna 2018 na Wayback Machine "  .
  10. Archivovaná kopie . Datum přístupu: 4. ledna 2018. Archivováno z originálu 3. ledna 2018.
  11. 1 2 3 Archivovaná kopie . Staženo 6. ledna 2018. Archivováno z originálu 7. ledna 2018.

Odkazy