Meltdown (zraniteľnosť): Rozdiel medzi revíziami
Smazaný obsah Přidaný obsah
Meltdown timing attack Značka: bez zdroja |
dokončenie mechanizmu Značka: bez zdroja |
||
Riadok 24:
* 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
* 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 riadenia 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ýnimka (programovanie)|výnimku]] (chybový stav). Požiadavka zlyhá a podvodnému procesu nebudú poskytnuté žiadne údaje, čím sa zachová bezpečnosť.<br><br></li>
<li>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,
<li>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
* '''V tomto bode zasiahne Meltdown.'''<ref name="MeltdownPaper"/><br><br></li>
<li>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
* 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ý súbor|inštrukčného súboru]] CPU zneužiť na prečítanie akéhokoľvek miesta v celej mapovanej pamäti.<br><br></li>
<li>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á
* 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“.<br><br></li>
<li>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“.<br><br></li>
<li>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 {{nowrap|2 × 8 {{=}} 16 cache}} útokov na načítanie jedného bajtu namiesto {{nowrap|2 × 256 {{=}} 512 krokov}} na načítanie všetkých 8 bitov bajtu naraz).</li>
</ol>
|