Prediktor grananja je kritična komponenta modernih CPU arhitektura dizajniranih da poboljšaju performanse nagađanjem smjera instrukcija grananja (npr. if-else naredbe) prije nego što se riješe. Ova spekulacija omogućava CPU-u da unaprijed dohvati i izvrši instrukcije duž predviđene putanje, čime se smanjuje uočeno kašnjenje i poboljšava ukupna propusnost. Međutim, ova optimizacija performansi uvodi potencijalne ranjivosti koje se mogu iskoristiti u CPU timing napadima, posebno u kontekstu curenja osjetljivih informacija.
Predviđanje grana funkcioniše tako što održava istoriju ishoda grane i koristi ovu istoriju za predviđanje budućih grana. Kada se naiđe na instrukciju grananja, prediktor koristi ove historijske podatke da pogodi da li će grana biti zauzeta ili ne. Ako je predviđanje ispravno, CPU nastavlja izvršavanje bez prekida. Ako je netačan, CPU se mora vratiti i izvršiti ispravnu putanju, što dovodi do smanjenja performansi. Ovu kaznu, iako mala, napadači mogu izmjeriti i iskoristiti.
Napadači mogu manipulirati prediktorom grananja kako bi stvorili mjerljivu vremensku razliku između ispravno i netačno predviđenih grananja. Ova razlika se može koristiti za zaključivanje putanje izvršavanja programa, koji zauzvrat može otkriti osjetljive informacije. Jedan od najpoznatijih primjera takvog napada je ranjivost Spectre, koja koristi spekulativno izvršenje i predviđanje grananja za pristup neovlaštenim memorijskim lokacijama.
U tipičnom Spectre napadu, napadač prvo trenira prediktor grane da prati određeni obrazac. Ova faza obuke uključuje izvršavanje niza instrukcija grananja koje uslovljavaju prediktor da napravi određeno predviđanje. Nakon što je prediktor obučen, napadač izvršava segment koda žrtve koji uključuje granu koja ovisi o tajnim podacima. Ako prediktor napravi netačno predviđanje na osnovu napadačeve obuke, CPU će spekulativno izvršiti instrukcije koje pristupaju memoriji na osnovu tajnih podataka. Iako se ove špekulativne instrukcije na kraju odbace, one ostavljaju tragove u kešu CPU-a.
Napadač tada može izmjeriti vrijeme pristupa različitim memorijskim lokacijama kako bi odredio kojim podacima je spekulativno pristupljeno. Ova tehnika, poznata kao keš vremenski napad, omogućava napadaču da zaključi tajne podatke na osnovu uočenih vremenskih razlika. Ključni koraci u takvom napadu su:
1. Obuka prediktora grane: Napadač izvodi kontrolirani niz instrukcija koje utječu na stanje prediktora grananja. Na primjer, uzastopno izvršavanje instrukcije grananja sa dosljednim ishodom (npr. uvijek uzetim) uslovljava prediktor da očekuje taj ishod u budućim izvršavanjima.
2. Pokretanje spekulativnog izvršenja: Napadač pokreće šifru žrtve sa instrukcijom grananja koja zavisi od tajnih podataka. Zbog napadačeve prethodne obuke, prediktor grane spekulativno izvršava pogrešan put, što uključuje pristup memoriji na osnovu tajnih podataka.
3. Mjerenje vremena pristupa kešu: Nakon spekulativnog izvršenja, napadač mjeri vrijeme potrebno da pristupi određenim memorijskim lokacijama. Brža vremena pristupa ukazuju na to da su podaci prisutni u kešu, što implicira da im se pristupilo špekulativno. Analizirajući ove tajminge, napadač može zaključiti tajne podatke.
Da biste to ilustrirali konkretnim primjerom, razmotrite scenario u kojem tajni podaci određuju indeks pristupa nizu unutar grane. Napadač prvo trenira prediktor grananja da preuzme određeni smjer grananja. Kada se kod žrtve pokrene, prediktor grananja spekulativno izvršava pristup nizu na osnovu obučenog smjera. Ako spekulacija uključuje pristup određenom elementu niza, učitava se odgovarajuća linija keša. Napadač tada može izvršiti niz vremenski ograničenih pristupa memoriji kako bi odredio koje su linije keša učitane, na taj način zaključivši tajni indeks.
Ublažavanje takvih napada uključuje nekoliko strategija. Rešenja zasnovana na hardveru uključuju poboljšanje izolacije između spekulativnih i nešpekulativnih puteva izvršenja i osiguravanje da spekulativno izvršenje ne utiče na deljene resurse kao što je keš memorija. Rješenja zasnovana na softveru uključuju tehnike kao što je umetanje instrukcija "ograde" kako bi se spriječilo spekulativno izvršenje nakon određenih tačaka koda, ili korištenje praksi programiranja u stalnom vremenu kako bi se osiguralo da vrijeme izvršenja ne ovisi o tajnim podacima.
Složenost i sofisticiranost vremenskih napada zasnovanih na prediktoru grane naglašavaju potrebu za stalnim istraživanjem i razvojem kako u hardverskoj tako i u softverskoj sigurnosti. Kako se CPU arhitekture nastavljaju razvijati, tako se moraju razvijati i strategije za zaštitu od ovih i drugih oblika napada sa strane kanala.
Ostala nedavna pitanja i odgovori u vezi Timing napadi CPU-a:
- Koji su neki od izazova i kompromisa koji su uključeni u implementaciju hardverskih i softverskih ublažavanja protiv vremenskih napada uz održavanje performansi sistema?
- Kako programiranje u stalnom vremenu može pomoći u smanjenju rizika od vremenskih napada u kriptografskim algoritmima?
- Šta je spekulativno izvršenje i kako ono doprinosi ranjivosti modernih procesora na napade na vrijeme kao što je Spectre?
- Kako vremenski napadi iskorištavaju varijacije u vremenu izvršenja da bi zaključili osjetljive informacije iz sistema?
- Šta je tajming napad?