Drošības pētnieks Christopher Domas publicējis rīku, kas ar viena bita maiņu AMD atmiņas kontrollerī nolasa DRAM apgabalus, kuriem operētājsistēmai piekļuves nav. Kods ar nosaukumu skitter-creek-bath-salts ir publicēts GitHub. Demonstrācijās no atmiņas tiek izvilkta fTPM parakstīšanas rutīna, SMM pārtraukumu apstrādātājs no SMRAM un procesora mikrokoda ielāps.
Uzbrukums neapiet nevienu piekļuves tiesību pārbaudi. Tas maina to, kurā atmiņas mikroshēmas šūnā fiziskā adrese fiziski nokļūst. Visi aizsardzības mehānismi platformā atrodas augstāk par atmiņas kontrolleri un neredz, kas notiek zem tiem.
Viena instrukcija
Uzbrukuma kodols ir viena rinda: xor dword [0xf80c2094], 0x00400000. Šis MMIO reģistrs pārslēdz DCT banku sajaukšanas režīmu. Bita apgriešana pārraksta adrešu pārveidojumu pēdējo posmu strādājošā sistēmā. Dati, kas atradās pie &x, pēkšņi ir citur.
Grūtākā daļa ir noturēt datoru dzīvu, kamēr visa sistēmas atmiņa zem tā ir sajaukta. Domas risinājums ir vienkāršs: nepieskarties DRAM. Rīks atslēdz pārējos kodolus, sasilda TLB un kešatmiņu, izslēdz pārtraukumus, izmet mērķa rindu ar clflush, uzliek mfence barjeru, apgriež bitu, nolasa vienu vārdu un apgriež bitu atpakaļ. Visa secība ir aptuveni desmit instrukcijas. Pēc tam sistēma turpina darbu tā, it kā nekas nebūtu noticis.
Ar Rowhammer šim nav nekā kopīga. Rowhammer atkārtoti nolasa vienu atmiņas rindu, līdz blakus rindā apgriežas bits. Šeit neviens bits atmiņā nemainās. Mainās tikai kartējums starp fizisko adresi un banku, rangu, rindu un kolonnu, ko kontrolleris izvēlas.
Kā atrast pareizo adresi
Bitu apgriezt ir viegli. Sarežģītāk ir zināt, kurp adreses aiziet pēc tam. AMD datu lapas šo posmu apraksta neprecīzi. Domas raksta, ka XOR kartes nesakrīt ar reālo uzvedību un MMIO atņemšanas pakāpe dokumentācijā nav sakārtota pareizā secībā.
Atmiņas kontrollera adrešu pārveidojums ir lineārs attēlojums pār GF(2), tāpēc to var atrisināt kā vienādojumu sistēmu. Rīks sajauktajā skatā ieraksta zīmoga vērtību 0xdeadc0de nejaušā adresē, pārslēdzas atpakaļ uz normālo skatu un pārmeklē atmiņu, lai atrastu, kur vērtība parādījusies. Katrs atradums dod adrešu pāri, kas norāda uz vienu un to pašu DRAM šūnu. Dažus tādus pārus padod z3 risinātājam, kas izrēķina matricu starp abiem skatiem.
“Physical addresses are really more of a suggestion.” Christopher Domas, projekta dokumentācija
Ar atrisināto matricu jebkuru aizsargātu adresi var pārrēķināt par tās aizstājēju sajauktajā skatā. Pēc tam pietiek apgriezt bitu, nolasīt aizstājēju un apgriezt bitu atpakaļ. Aizstājēja ceļš cauri adrešu pārveidojumam nesatiek nevienu no barjerām, ko platforma uzcēlusi normālajam skatam.
Ko izdodas izlasīt
Repozitorijā ir četras atsevišķas demonstrācijas:
- PSP privātā atmiņa. fTPM darbojas uz Platform Security Processor ARM kodola atsevišķā DRAM izgriezumā tieši aiz redzamās atmiņas augšas. Testa mašīnā tas sākas pie 0x7f800000 un aizņem 8 MB. Domas no turienes izvelk RSA parakstīšanas rutīnu un to disasamblē.
- SMRAM. System Management Mode kods darbojas zem operētājsistēmas un zem hipervizora. Rīks nolasa pārtraukumu apstrādātāju.
- C6 DRAM. Kad kodols iemieg, procesors savu stāvokli saglabā atmiņā. Tur ir lapu tabulu saknes un APIC konfigurācija.
- Mikrokods. Aktīvo mikrokoda ielāpu procesors dīkstāves pārejā pārkopē uz DRAM.
Repozitorijā ir kodola modulis spaghettify.ko un lietotāja rīki dram_dump un dram_poke. Pirms tiem jāpalaiž platform_check, kas uz netestētas mašīnas apstājas pats.
Cik plaši tas attiecas
Rīks izstrādāts un pārbaudīts uz AMD Family 16h procesoriem. Tie ir 2013. un 2014. gada čipi ar Jaguar un Puma kodoliem, kas gāja mazjaudas klēpjdatoros un iegultajās sistēmās. Domas izvēlējās tos ar nolūku: Family 16h ir pēdējā paaudze, kuras publiskās datu lapas apraksta atmiņas kontrollera pārveidojuma reģistrus un rāda, ka tos nevar aizslēgt. Sākot ar Family 17h, tas ir visiem Zen procesoriem, AMD šo informāciju datu lapās vairs neiekļauj.
Dokumentācijas trūkums nenozīmē, ka reģistru nav. Tā pati posmu virkne atkārtojas visos mūsdienu atmiņas kontrolleros: kanālu un rangu savijums, banku sajaukšana, chip-select kartēšana. Domas norāda, ka pieeja principā attiecas arī uz Intel, ARM un RISC-V platformām. Vai to tur var atkārtot praksē, no publicētā koda nav redzams.
Kāpēc programmatūras ielāpa nav
Lai pārslēgtu banku sajaukšanas režīmu, ir vajadzīgas kodola tiesības. Parastam lietotājam ar pārlūku šis nav tiešs drauds. Problēma ir citur. SEV, SGX, TDX, TrustZone un SMM izolācija pastāv tieši tāpēc, lai kodola tiesības nebūtu pietiekamas. Uzbrukums salauž šo pieņēmumu.
Labot to ar programmatūru nav kur. Aizsardzības pārbauda fiziskās adreses, uzbrukums maina DRAM koordinātas. Šie ir divi dažādi slāņi. Starp tiem procesors nekādu pārbaudi neveic. Vienīgais tiešais risinājums ir aizslēgt atmiņas kontrollera konfigurācijas reģistrus uzreiz pēc firmware inicializācijas, ko Family 16h aparatūra nemaz nepieļauj.
Metodi Domas plāno rādīt Black Hat 2026 konferencē. LWN par publikāciju ziņoja 13. augustā.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.