Prediktor grananja kritična je komponenta modernih CPU arhitektura dizajniranih za poboljšanje performansi spekuliranjem o smjeru instrukcija grananja (npr. if-else naredbe) prije nego što se razriješe. Ova spekulacija omogućuje CPU-u da unaprijed dohvati i izvrši upute duž predviđenog puta, čime se smanjuje percipirana latencija i poboljšava ukupna propusnost. Međutim, ova optimizacija performansi uvodi potencijalne ranjivosti koje se mogu iskoristiti u napadima na CPU mjerenje vremena, posebno u kontekstu curenja osjetljivih informacija.
Predviđanje grananja funkcionira tako da održava povijest ishoda grananja i koristi tu povijest za predviđanje budućih grananja. Kada se naiđe na instrukciju grananja, prediktor koristi ove povijesne podatke da pogodi hoće li grananje biti poduzeto ili ne. Ako je predviđanje točno, CPU nastavlja s izvođenjem bez prekida. Ako je netočna, CPU se mora vratiti i izvršiti ispravnu putanju, što dovodi do smanjenja performansi. Ovu kaznu, iako malu, napadači mogu izmjeriti i iskoristiti.
Napadači mogu manipulirati predikcijom grananja kako bi stvorili mjerljivu vremensku razliku između točno i netočno predviđenih grananja. Ta se razlika može koristiti za zaključivanje putanje izvršavanja programa, što zauzvrat može otkriti osjetljive informacije. Jedan od najpoznatijih primjera takvog napada je ranjivost Spectre, koja koristi spekulativno izvršavanje i predviđanje grananja za pristup neovlaštenim memorijskim lokacijama.
U tipičnom Spectre napadu, napadač prvo trenira prediktor grananja da slijedi određeni obrazac. Ova faza obuke uključuje izvršavanje niza instrukcija grananja koje uvjetuju prediktor da napravi određeno predviđanje. Nakon što je prediktor istreniran, napadač izvršava segment koda žrtve koji uključuje granu koja ovisi o tajnim podacima. Ako prediktor napravi netočno predviđanje na temelju napadačeve obuke, CPU će spekulativno izvršiti instrukcije koje pristupaju memoriji na temelju tajnih podataka. Iako se ove spekulativne upute na kraju odbace, one ostavljaju tragove u predmemorij CPU-a.
Napadač tada može izmjeriti vremena pristupa različitim memorijskim lokacijama kako bi odredio kojim se podacima spekulativno pristupilo. Ova tehnika, poznata kao vremenski napad predmemorije, omogućuje napadaču da zaključi tajne podatke na temelju uočenih vremenskih razlika. Ključni koraci u takvom napadu su:
1. Obuka Prediktora grana: Napadač pokreće kontrolirani slijed instrukcija koje utječu na stanje prediktora grananja. Na primjer, opetovano izvršavanje instrukcije grananja s dosljednim ishodom (npr. uvijek poduzeto) uvjetuje prediktor da očekuje taj ishod u budućim izvršavanjima.
2. Pokretanje spekulativne ovrhe: Napadač pokreće šifru žrtve s instrukcijom grananja koja ovisi o tajnim podacima. Zbog napadačeve prethodne obuke, prediktor grana spekulativno izvršava krivi put, što uključuje pristup memoriji na temelju tajnih podataka.
3. Mjerenje vremena pristupa predmemoriji: Nakon spekulativnog izvršenja, napadač mjeri vrijeme potrebno za pristup određenim memorijskim lokacijama. Brže vrijeme pristupa ukazuje na to da su podaci prisutni u predmemoriji, što implicira da im se pristupilo spekulativno. Analizom tih vremena, napadač može zaključiti tajne podatke.
Da bismo to ilustrirali konkretnim primjerom, razmotrimo scenarij 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 temelju treniranog smjera. Ako spekulacija uključuje pristup određenom elementu niza, učitava se odgovarajući red predmemorije. Napadač zatim može izvršiti niz vremenski ograničenih pristupa memoriji kako bi odredio koji su redovi predmemorije učitani, čime zaključuje tajni indeks.
Ublažavanje takvih napada uključuje nekoliko strategija. Rješenja temeljena na hardveru uključuju poboljšanje izolacije između spekulativnih i nespekulativnih putova izvršenja i osiguranje da spekulativno izvršenje ne utječe na zajedničke resurse poput predmemorije. Rješenja koja se temelje na softveru uključuju tehnike kao što je umetanje "ogradnih" instrukcija kako bi se spriječilo spekulativno izvršavanje iza određenih točaka u kodu ili korištenje prakse programiranja s konstantnim vremenom kako bi se osiguralo da vrijeme izvršenja ne ovisi o tajnim podacima.
Složenost i sofisticiranost vremenskih napada temeljenih na predviđanju grana naglašavaju potrebu za stalnim istraživanjem i razvojem sigurnosti hardvera i softvera. 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 uključenih u implementaciju hardverskih i softverskih ublažavanja vremenskih napada uz održavanje performansi sustava?
- Kako programiranje s konstantnim vremenom može pomoći u ublažavanju rizika vremenskih napada u kriptografskim algoritmima?
- Što je spekulativno izvršenje i kako ono pridonosi ranjivosti modernih procesora na vremenske napade kao što je Spectre?
- Kako vremenski napadi iskorištavaju varijacije u vremenu izvršenja za izvođenje osjetljivih informacija iz sustava?
- Što je vremenski napad?