Meltdown (zraniteľnosť)

Meltdown je hardvérová zraniteľnosť, postihujúca procesory Intel x86 a niektoré procesory založené na ARM. Umožňuje podvodnému procesu čítať akúkoľvek fyzickú pamäť, kernel pamäť, alebo mapovanú pamäť iného procesu, bez ohľadu na to, či má proces na to oprávnenie, alebo nie.

Meltdown postihuje širokú škálu systémov. V čase zverejnenia to zahŕňalo všetky zariadenia iOS a Mac, ďalej stroje s postihnutým hardvérom, na ktorých sa spúšťa akákoľvek ešte neaktualizovaná verzia systému Microsoft Windows, alebo akákoľvek nedávna verzia systému Linux. V dôsledku toho sú postihnuté taktiež mnohé servery a cloudové služby, ako aj potenciálne väčšina smart a embedded zariadení, ktoré používajú ARM procesory (mobilné zariadenia, smart TV a iné), vrátane širokého spektra sieťových zariadení. Čisto softvérové riešenie zraniteľnosti Meltdown bolo hodnotené ako spomalenie počítačov pri určitých pracovných zaťaženiach v rozsahu 5 až 30 %. Spoločnosti zodpovedné za softvérovú korekciu zraniteľnosti uvádzajú na základe výkonnostných testov len minimálny dopad.

Zraniteľnosti Meltdown bolo v januári 2018 pridelené Common Vulnerabilities and Exposures ID CVE-2017-5754, tiež známe ako Podvodné načítanie z dátovej cache. Zraniteľnosť bola odhalená v súvislosti s inou zraniteľnosťou (Spectre), ktorá má podobné niektoré avšak nie všetky charakteristiky.

Mechanizmus 
Meltdown sa spolieha na situáciu súbehu v CPU, ktorý môže vzniknúť medzi vykonávaním inštrukcie a overovaním privilégií, na neoprávnené nedetegovateľné prečítanie dát v pamäti predtým, než sa vykoná kontrola privilégií, ktorá by zabránila prečítaniu týchto údajov.

Pozadie 
Moderné počítačové procesory používajú rôzne techniky na dosiahnutie vysokej úrovne efektívnosti. Pre Meltdown sú obzvlášť dôležité tieto štyri široko využívané mechanizmy:
Virtuálna (stránková) pamäť, tiež nazývaná ako mapovaná pamäť
Úrovne privilégií, alebo chránené úrovne
Zreťazené spracovanie inštrukcií a špekulatívne vykonávanie inštrukcií
CPU cache

Zraniteľnosť Meltdown 
Mechanizmy uvedené vyššie sú zvyčajne považované za bezpečné. Poskytujú základ pre väčšinu moderných operačných systémov a procesorov. Meltdown však zneužíva spôsob interakcie týchto funkcií na obídenie základnej riadiacej funkcie CPU, ktorej úlohou je vyhodnocovať oprávnenia prístupu k privilegovaným a citlivým údajom operačného systému a iných procesov. Pochopenie tohto mechanizmu je možné ilustrovať na dátach, ktoré sú mapované vo virtuálnej pamäti (ku väčšine týchto dát by proces nemal mať prístup) a spôsobe reakcie CPU na požiadavky procesu na prístup k neoprávnenej pamäti. Proces beží na zraniteľnej verzii systému Windows alebo Linux, na 64 bitovom procesore zraniteľného typu.  Táto kombinácia je bežná pre takmer všetky stolné počítače, notebooky, servery a mobilné zariadenia.

 Podvodný proces má, ako každý iný proces a samotný operačný systém, prístup k virtuálnemu adresnému priestoru (virtuálnej pamäti) v rozsahu miliárd gigabajtov. Bez ohľadu na oprávnenia, tento priestor sa využíva spôsobom, ktorý maximalizuje efektivitu.
  Väčšina z tohto priestoru je nepridelená (neobsahuje žiadne údaje).
  Niektoré oblasti sú vyhradené pre samotný podvodný proces pre jeho vlastné inštrukcie a dáta.
  Z dôvodu efektivity, neberúc do úvahy oprávnenia pre prístup k privilegovaným častiam pamäte, tento priestor obsahuje tiež všetky ostatné dáta, ktoré sa používajú vo všetkých ostatných bežiacich procesoch, vrátane operačného systému a tiež prípadne dáta v pamäti, ktorá bola použitá, avšak nebola vyprázdnená, alebo adresy, ktoré sú vždy priamo mapované na celú fyzickú pamäť.
  Princíp, že všetky uvedené dáta sú rovnako mapované do virtuálnej pamäte každého procesu, sa zvyčajne považuje za úplne bezpečný, pretože funkcia CPU na riadenie prístupu zabráni ich zneužitiu. Akýkoľvek pokus podvodného procesu na prístup k všetkým ostatným dátam, na ktoré nemá oprávnenie, spôsobí výnimku (chybový stav). Požiadavka zlyhá a podvodnému procesu nebudú poskytnuté žiadne údaje, čím sa zachová bezpečnosť.
 Aj keď sa proces pokúša čítať pamäť, na ktorú nemá oprávnenie, inštrukciu čítania procesor najskôr naplánuje a zreťazí, podobne ako pri iných inštrukciách.
  Ako zvyčajne zvolí výkonnú jednotku a radič pamäte požiada o načítanie obsahu pamäte na adrese, ktorá bola uvedená v inštrukcii, tak aby dáta boli pripravené a rýchlo dostupné v procesore, keď nastane čas na dokončenie zvyšku inštrukcie. V určitom okamihu, predtým než je inštrukcii dovolené vygenerovať vôbec nejaký výstup, na inom mieste dôjde k dokončeniu kontroly oprávnení. V prípade neoprávneného čítania, bude výkonnej jednotke oznámené, že inštrukcia zlyhala pri kontrole oprávnení. Zrušia sa všetky dáta z inštrukcie, procesu sa neodovzdá nič, inštrukcia sa zahodí a vykonávanie sa posunie na nasledujúcu inštrukciu.
  Teoreticky, za predpokladu, že výkonná jednotka, radič pamäte, plánovač a kontrola oprávnení fungujú bez chyby, ide o úplne bezpečný prístup. Napriek tomu, že privilegovaná pamäť bola spočiatku výkonnou jednotkou a radičom pamäte načítaná, vykonávanie inštrukcie bolo následne zrušené a neoprávnené, čiastočne spracované operácie boli zahodené, teda výstup bol správny. Avšak, ako ukazuje Meltdown, nie je to tak bezpečné, ako sa predpokladalo.
  V skorom štádiu vykonávania inštrukcie, plánovač procesora naplánoval dve udalosti – kontrolu oprávnení a prvé kroky vykonávania inštrukcie. Súčasťou tohto procesu, zatiaľ čo sa čakalo na dokončenie kontroly oprávnení, výkonná jednotka začala proces načítania dát. V prípade podvodného procesu, dáta boli síce požadované z neoprávnenej adresy v pamäti, avšak aj napriek tomu boli načítané radičom pamäte počas počiatočného štádia vykonávania inštrukcie, aj keď boli neskôr zahodené potom, ako sa dokončila kontrola oprávnení a táto zlyhala.
 Toto zvyčajne nemá na nič vplyv a bezpečnosť je zaistená, pretože kým sa nedokončí kontrola oprávnení, načítané dáta sa nikdy žiadnym spôsobom nesprístupnia.
  Avšak aj keď inštrukcia zlyhá, dáta už boli vyžiadané výkonnou jednotkou a načítané radičom pamäte, aby boli pripravené na spracovanie a hoci výkonná jednotka zahodila dáta v dôsledku chyby pri kontrole oprávnení, v rámci procesu načítania dát z pamäte však už bola automaticky zaktualizovaná cache CPU a dáta boli načítané do cache CPU, pre prípad, že by rovnaké dáta boli čoskoro znova potrebné.
  V tomto bode zasiahne Meltdown.
 Cache CPU nie je neoprávneným procesom čitateľná, pretože ide o internú súčasť procesora. Avšak pomocou útoku na cache pomocou časovej analýzy (forma útoku postranným kanálom) môže podvodný proces nepriamo overovať, či sa určité dáta z konkrétnej adresy nachádzajú v cache CPU alebo nie, a to aj napriek tomu, že sám nemôže prečítať skutočné dáta z tejto adresy.
  Ak boli dáta z nejakej adresy pamäte uložené do cache CPU, potom opakovaná inštrukcia na načítanie rovnakej adresy použije cache CPU na načítanie týchto dát (rýchle). Ak dáta neboli uložené v cache CPU, potom CPU bude musieť požiadať o načítanie dát z pamäte (pomalšie).
  Podvodný proces môže informáciu o časovom rozdiele použiť na detekciu, ktorým z týchto dvoch spôsobov boli dáta načítané a teda či dáta boli v cache CPU alebo nie. Toto zistenie samo o sebe nepredstavuje neprekonateľnú zraniteľnosť, avšak Meltdown ho môže v kombinácii s ďalšou vlastnosťou inštrukčného súboru CPU zneužiť na prečítanie akéhokoľvek miesta v celej mapovanej pamäti.
 Keď inštrukcia požiada o čítanie pamäte, môže určiť adresu, z ktorej sa má čítať, mnohými spôsobmi, medzi ktoré patria aj režimy nepriameho adresovania. Ide o inštrukcie, ktoré prikazujú procesoru, aby čítal z pamäte X tak, že použije hodnotu uloženú v pamäti na adrese X na výpočet druhej adresy Y a „odpoveď“ (alebo vrátená hodnota) je hodnota uložená na adrese Y.
  Meltdown používa práve túto techniku ako základ útoku postranným kanálom, ktorý umožňuje zistiť obsah pamäte na určitej adrese.
  Predpokladajme, že adresu 2000 nemá proces oprávnenie čítať, ale môže mať akúkoľvek hodnotu od 1 do 5, pričom neberieme do úvahy kontrolu oprávnenia na čítanie tejto pamäte. 
  Potom je možné požadovať vykonanie inštrukcie typu „Prečítaj hodnotu pamäte na adrese napr. 5000 + hodnota pamäte na adrese 2000“. Ak adresa 2000 obsahuje hodnotu 1, procesor sa pokúsi vrátiť hodnotu pamäte na adrese 5001, ak adresa 2000 obsahuje hodnotu 2, pokúsi sa vrátiť hodnotu pamäte na adrese 5002 atď.
  Tento typ inštrukcie je možné využiť na útok pomocou časovej analýzy. Vykoná sa opakované čítanie, pričom prvé čítanie si vyžiada hodnotu nepriamo na adrese 5000 + hodnota na adrese 2000 a druhé čítanie si priamo vyžiada hodnotu na adrese 5000 + 1 (5000 + 2, 5000 + 3, 5000 + 4, 5000 + 5). Ak sa zistí, že procesoru trvalo dlhšie priame čítanie z adries 5001, 5002, 5003 a 5005, ale kratšie priame čítanie z adresy 5004, potom je možné konštatovať, že dôvodom je to, že má nacachované dáta z adresy 5004, a to preto, lebo nedávno pristupoval k tejto adrese. Takže je možné vyvodiť, že adresa 2000 obsahuje hodnotu „4“.
 Ak proces nemá oprávnenie na čítanie adresy 2000, pokus o čítanie adresy 5000 + hodnota na adrese 2000 by mal zlyhať a proces by sa z neho nemal nič dozvedieť, keďže sa vykonáva kontrola privilégií prístupu k pamäti.
  Problém však spočíva v tom (ako to dokazuje Meltdown), že CPU sa už začne z dôvodu efektívnosti pripravovať na prístup k pamäťovým miestam, ktoré môžu byť potrebné paralelne s kontrolou privilégií pre prístup k pamäti. To znamená, že keď kontrola privilégií zlyhá a výkonná jednotka (správne) zahodí načítané dáta a stornuje inštrukciu čítania, adresa 2000 ale už bola medzičasom prečítaná a jej obsah sa už použil na čítanie adresy 5004, aj keď bolo neskôr čítanie stornované a čakajúce údaje boli výkonnou jednotkou zahodené.
  Avšak keď radič pamäte dostal od CPU požiadavku na prístup k adrese 5004, pri príprave na inštrukciu čítania automaticky uložil kópiu týchto dát do vyrovnávacej pamäte CPU tak ako obvykle, pre prípad budúcich požiadaviek na rovnaké dáta, pričom kópia týchto dát zostane stále prítomná v cache CPU.
  Hoci samotná inštrukcia čítania zlyhala a proces priamo neprečítal obsah adresy 2000 alebo obsah uložený v cache na ktorejkoľvek z adries 5001 až 5005, podvodný proces môže stále použiť svoj útok postranným kanálom na to, aby zistil, že adresa 5004 je v cache a ostatné adresy medzi 5001 a 5005 nie sú. Z tohto môže ďalej vyvodiť, že adresa, ktorú by sa inštrukcia pokúsila prečítať, je 5004 a preto hodnota neprístupnej adresy 2000 je „4“.
 Meltdown používa túto techniku postupne na čítanie každej adresy v požadovanom rozsahu.
 V závislosti od ostatných bežiacich procesov, výsledné načítané dáta môžu obsahovať heslá, šifrovacie údaje a akékoľvek iné citlivé údaje z akejkoľvek adresy v pamäti akéhokoľvek procesu, ktorý existuje v jeho mapovanej pamäti.
  Keďže útok postranným kanálom je v praxi pomalý, je výhodnejšie extrahovať dáta po bitoch (iba  útokov na načítanie jedného bajtu namiesto  na načítanie všetkých 8 bitov bajtu naraz).

Referencie

Zdroj

Počítačová bezpečnosť