Napovedovalec razvejanja je kritična komponenta sodobnih arhitektur CPU, zasnovana za izboljšanje zmogljivosti s špekuliranjem smeri navodil za razvejanje (npr. stavkov if-else), preden so razrešena. Ta špekulacija omogoča CPU, da vnaprej pridobi in izvede navodila po predvideni poti, s čimer zmanjša zaznano zakasnitev in izboljša splošno prepustnost. Vendar pa ta optimizacija zmogljivosti uvaja potencialne ranljivosti, ki jih je mogoče izkoristiti pri napadih na časovni nadzor procesorja, zlasti v kontekstu uhajanja občutljivih informacij.
Napovedovanje vej deluje tako, da vzdržuje zgodovino rezultatov vej in to zgodovino uporablja za napovedovanje prihodnjih vej. Ko naleti na navodilo za vejo, napovedovalec uporabi te zgodovinske podatke, da ugiba, ali bo veja prevzeta ali ne. Če je napoved pravilna, CPE nadaljuje z izvajanjem brez prekinitve. Če je nepravilna, se mora CPE vrniti nazaj in izvesti pravilno pot, kar ima za posledico zmanjšanje zmogljivosti. To kazen, čeprav majhno, lahko napadalci izmerijo in izkoristijo.
Napadalci lahko manipulirajo s prediktorjem vej, da ustvarijo merljivo časovno razliko med pravilno in nepravilno predvidenimi vejami. To razliko je mogoče uporabiti za sklepanje na pot izvajanja programa, ki lahko nato razkrije občutljive informacije. Eden najbolj znanih primerov takšnega napada je ranljivost Spectre, ki izkorišča špekulativno izvajanje in napovedovanje veje za dostop do nepooblaščenih pomnilniških lokacij.
Pri tipičnem napadu Spectre napadalec najprej usposobi napovedovalec vej, da sledi določenemu vzorcu. Ta faza usposabljanja vključuje izvajanje zaporedja navodil za razvejanje, ki pogojujejo napovedovalca, da naredi določeno napoved. Ko je napovedovalec izurjen, napadalec izvede segment kode žrtve, ki vključuje vejo, odvisno od tajnih podatkov. Če napovedovalec naredi napačno napoved na podlagi napadalčevega usposabljanja, bo CPE špekulativno izvedel navodila za dostop do pomnilnika na podlagi skrivnih podatkov. Čeprav so ta špekulativna navodila sčasoma zavržena, pustijo sledi v predpomnilniku procesorja.
Napadalec lahko nato izmeri dostopne čase do različnih pomnilniških lokacij, da ugotovi, do katerih podatkov je špekulativno dostopal. Ta tehnika, znana kot časovni napad predpomnilnika, omogoča napadalcu sklepanje o skrivnih podatkih na podlagi opazovanih časovnih razlik. Ključni koraki pri takšnem napadu so:
1. Usposabljanje napovedovalca veje: Napadalec izvede nadzorovano zaporedje navodil, ki vplivajo na stanje napovedovalca veje. Na primer, ponavljajoče se izvajanje ukaza razvejanja z doslednim izidom (npr. vedno sprejeto) pogojuje napovedovalca, da ta izid pričakuje v prihodnjih izvedbah.
2. Sprožitev špekulativne izvršitve: Napadalec zažene kodo žrtve z navodili za razvejanje, odvisno od tajnih podatkov. Zaradi napadalčevega predhodnega usposabljanja napovedovalec veje špekulativno izvede napačno pot, ki vključuje dostop do pomnilnika na podlagi tajnih podatkov.
3. Merjenje dostopnih časov predpomnilnika: Po špekulativni izvedbi napadalec izmeri čas, ki je potreben za dostop do določenih pomnilniških lokacij. Hitrejši časi dostopa kažejo, da so podatki prisotni v predpomnilniku, kar pomeni, da je bil do njih dostopan špekulativno. Z analizo teh časov lahko napadalec sklepa na tajne podatke.
Če želite to ponazoriti s konkretnim primerom, razmislite o scenariju, kjer skrivni podatki določajo indeks dostopa do polja znotraj veje. Napadalec najprej usposobi napovedovalec veje, da prevzame določeno smer veje. Ko se izvaja koda žrtve, napovedovalec veje špekulativno izvede dostop do polja na podlagi naučene smeri. Če špekulacija vključuje dostop do določenega elementa polja, se naloži ustrezna vrstica predpomnilnika. Napadalec lahko nato izvede vrsto časovno določenih dostopov do pomnilnika, da ugotovi, katere vrstice predpomnilnika so naložene, in tako sklepa na tajni indeks.
Ublažitev takih napadov vključuje več strategij. Rešitve, ki temeljijo na strojni opremi, vključujejo izboljšanje izolacije med špekulativnimi in nespekulativnimi izvršilnimi potmi ter zagotavljanje, da špekulativno izvajanje ne vpliva na vire v skupni rabi, kot je predpomnilnik. Rešitve, ki temeljijo na programski opremi, vključujejo tehnike, kot je vstavljanje navodil za "ograjo", da se prepreči špekulativno izvajanje mimo določenih točk v kodi, ali uporaba praks programiranja v konstantnem času, da se zagotovi, da čas izvajanja ni odvisen od tajnih podatkov.
Kompleksnost in prefinjenost časovnih napadov, ki temeljijo na napovedovanju veje, poudarjata potrebo po stalnih raziskavah in razvoju na področju varnosti strojne in programske opreme. Ker se arhitekture procesorjev še naprej razvijajo, se morajo razvijati tudi strategije za zaščito pred temi in drugimi oblikami stranskih napadov.
Druga nedavna vprašanja in odgovori v zvezi Časovni napadi CPU:
- Kateri so nekateri izzivi in kompromisi, povezani z uvedbo ublažitve strojne in programske opreme pred časovnimi napadi ob ohranjanju zmogljivosti sistema?
- Kako lahko programiranje s konstantnim časom pomaga ublažiti tveganje časovnih napadov v kriptografskih algoritmih?
- Kaj je špekulativno izvajanje in kako prispeva k ranljivosti sodobnih procesorjev za časovne napade, kot je Spectre?
- Kako časovni napadi izkoriščajo razlike v času izvajanja za sklepanje občutljivih informacij iz sistema?
- Kaj je časovni napad?