Šakos numatytojas yra svarbus šiuolaikinių procesoriaus architektūrų komponentas, skirtas pagerinti našumą, spėliojant šakų instrukcijų kryptį (pvz., jei-else teiginius) prieš jas išsprendžiant. Ši spekuliacija leidžia CPU iš anksto gauti ir vykdyti instrukcijas numatytu keliu, taip sumažinant suvokiamą delsą ir pagerinant bendrą pralaidumą. Tačiau šis našumo optimizavimas suteikia galimų pažeidžiamumų, kuriuos galima išnaudoti procesoriaus laiko nustatymo atakose, ypač kai nutekinama neskelbtina informacija.
Atšakų numatymas veikia išlaikant šakų rezultatų istoriją ir naudojant šią istoriją būsimiems atšakams numatyti. Kai susiduriama su šakos nurodymu, prognozuotojas naudoja šiuos istorinius duomenis, kad atspėtų, ar šaka bus paimta, ar ne. Jei prognozė teisinga, CPU tęsia vykdymą be pertraukų. Jei neteisingas, CPU turi atšaukti ir atlikti teisingą kelią, o tai užtraukia baudą. Šią baudą, nors ir nedidelę, užpuolikai gali išmatuoti ir išnaudoti.
Užpuolikai gali manipuliuoti šakų prognozės priemone, kad sukurtų išmatuojamą laiko skirtumą tarp teisingai ir neteisingai numatytų šakų. Šis skirtumas gali būti naudojamas norint nustatyti programos vykdymo kelią, o tai savo ruožtu gali atskleisti neskelbtiną informaciją. Vienas iš labiausiai žinomų tokios atakos pavyzdžių yra Spectre pažeidžiamumas, kuris naudoja spekuliacinį vykdymą ir šakų numatymą, kad pasiektų neteisėtas atminties vietas.
Įprastoje „Spectre“ atakoje užpuolikas pirmiausia išmoko atšakos prognozuotoją sekti tam tikrą modelį. Šis mokymo etapas apima šakinių instrukcijų sekos vykdymą, kuri sąlygoja prognozuotoją atlikti tam tikrą prognozę. Kai prognozuotojas yra išmokytas, užpuolikas vykdo aukos kodo segmentą, apimantį atšaką, priklausančią nuo slaptų duomenų. Jei prognozuotojas neteisingai prognozuoja, remdamasis užpuoliko mokymu, centrinis procesorius spekuliaciniu būdu vykdys instrukcijas, kurios pasiekia atmintį pagal slaptus duomenis. Nors šios spekuliacinės instrukcijos galiausiai atmetamos, jos palieka pėdsakus procesoriaus talpykloje.
Tada užpuolikas gali išmatuoti prieigos prie skirtingų atminties vietų laiką, kad nustatytų, kurie duomenys buvo pasiekti spėliojant. Ši technika, žinoma kaip talpyklos laiko ataka, leidžia užpuolikui pagal pastebėtus laiko skirtumus nustatyti slaptus duomenis. Pagrindiniai tokio išpuolio žingsniai yra šie:
1. Šakos prognozuotojo mokymas: užpuolikas vykdo valdomą instrukcijų seką, turinčią įtakos šakos numatymo būsenai. Pavyzdžiui, pakartotinai vykdant šakos komandą su nuoseklia baigtimi (pvz., visada priimta), prognozuotojas gali tikėtis to rezultato ateityje.
2. Spekuliatyvaus vykdymo suaktyvinimas: užpuolikas paleidžia aukos kodą su šakos instrukcija, priklausančia nuo slaptų duomenų. Dėl išankstinio užpuoliko mokymo, šakos numatytojas spekuliatyviai vykdo neteisingą kelią, kuris apima prieigą prie atminties pagal slaptus duomenis.
3. Prieigos prie talpyklos laiko matavimas: po spekuliacinio vykdymo užpuolikas matuoja laiką, kurio reikia norint pasiekti konkrečias atminties vietas. Greitesnis prieigos laikas rodo, kad duomenys yra talpykloje, o tai reiškia, kad jie buvo pasiekti spėliojant. Analizuodamas šiuos laikus, užpuolikas gali padaryti išvadą apie slaptus duomenis.
Norėdami tai iliustruoti konkrečiu pavyzdžiu, apsvarstykite scenarijų, kai slapti duomenys nustato masyvo prieigos šakoje indeksą. Užpuolikas pirmiausia išmoko šakos prognozuotoją priimti tam tikrą šakos kryptį. Kai paleidžiamas aukos kodas, atšakos prognozuotojas spekuliatyviai vykdo prieigą prie masyvo, remdamasis išmokyta kryptimi. Jei spekuliacija apima prieigą prie konkretaus masyvo elemento, įkeliama atitinkama talpyklos eilutė. Tada užpuolikas gali atlikti tam tikrus priėjimus prie atminties, kad nustatytų, kurios talpyklos eilutės yra įkeltos, taip numanydamas slaptą indeksą.
Tokių išpuolių mažinimas apima kelias strategijas. Aparatinės įrangos sprendimai apima atskirties tarp spekuliacinių ir nespekuliacinių vykdymo kelių gerinimą ir užtikrinimą, kad spekuliacinis vykdymas nepaveiks bendrinamų išteklių, pvz., talpyklos. Programinės įrangos sprendimai apima tokius metodus kaip „tvoros“ instrukcijų įterpimas, kad būtų išvengta spekuliacinio vykdymo per tam tikrus kodo taškus, arba pastovaus laiko programavimo praktika, siekiant užtikrinti, kad vykdymo laikas nepriklausytų nuo slaptų duomenų.
Filialų prognozėmis pagrįstų laiko atakų sudėtingumas ir sudėtingumas pabrėžia nuolatinių tyrimų ir plėtros poreikį tiek aparatinės, tiek programinės įrangos saugumo srityje. CPU architektūrai toliau tobulėjant, taip pat turi būti sukurtos apsaugos nuo šių ir kitų formų šoninių kanalų atakų strategijos.
Kiti naujausi klausimai ir atsakymai apie CPU laiko atakos:
- Kokie yra iššūkiai ir kompromisai, susiję su aparatinės ir programinės įrangos mažinimu, apsaugančiu nuo laiko atakų, išlaikant sistemos našumą?
- Kaip nuolatinio laiko programavimas gali padėti sumažinti kriptografinių algoritmų laiko atakų riziką?
- Kas yra spekuliatyvus vykdymas ir kaip jis prisideda prie šiuolaikinių procesorių pažeidžiamumo prieš atakas, pvz., Spectre?
- Kaip laiko atakos išnaudoja vykdymo laiko svyravimus, kad iš sistemos išvestų neskelbtiną informaciją?
- Kas yra laiko ataka?