Jeden bit v řadiči paměti obejde u starších čipů AMD ochranu PSP, SMM i mikrokódu
Přehození jediného bitu v řadiči paměti přeskládá překlad adres na souřadnice v čipech DRAM, takže tatáž adresa najednou míří jinam. Chráněné oblasti, ke kterým se nedostane ani jádro systému, jdou pak číst i přepisovat. Vyzkoušené je to na procesorech AMD rodiny 16h a k přehození je potřeba práva jádra.

Celý útok je jedna instrukce.
xor dword [0xf80c2094], 0x00400000
Christopher Domas ji 13. srpna zveřejnil i s nástrojem skitter-creek-bath-salts, který na ní stojí. Ten zápis přehodí jediný bit v řadiči paměti procesoru AMD a od té chvíle vede tatáž fyzická adresa na jinou buňku v čipech. Oblasti, které má platforma zamčené i před jádrem systému, jdou potom číst a přepisovat adresou, kterou nikdo nehlídá.
Kde ten bit v řadiči paměti sedí
Než se procesor dotkne paměti, projde adresa dlouhou řadou převodů: virtuální adresa, tabulky stránek, fyzická adresa, sběrnice. Úplně dole je ještě jeden. Řadič paměti fyzickou adresu rozloží na skutečné souřadnice v čipech, tedy na kanál, rank, banku, řádek a sloupec, a při tom vybrané bity adresy mezi sebou míchá operací XOR, aby se přístupy rozprostřely rovnoměrně po čipech.
Ten poslední krok se dá přenastavit za běhu. Adresa 0xf80c2094 je registr DRAM Configuration High na offsetu 94h a jeho dvaadvacátý bit se jmenuje BankSwizzleMode. V příručce AMD pro tvůrce firmwaru a jader, na kterou u téhle práce odkazuje server LWN, je vedený jako čitelný i zapisovatelný a po zapnutí stroje má nulu. Zámek na něm žádný není.
Zámky, kterými platforma odděluje citlivou paměť, přitom hlídají fyzické adresy. Souřadnice v DRAM nehlídá nikdo. Když se mapa mezi obojím přehází, zůstanou ty zámky stát tam, kde už žádné tajemství není.
Jak se přežije paměť přeházená pod rukama
S tím bitem se přeskládá celá operační paměť včetně té, ve které zrovna běží jádro systému. Postup je proto postavený na rychlosti: uspat ostatní jádra, nahřát TLB a cache, vypnout přerušení, vyhodit cílovou adresu z cache, přehodit bit, přečíst jeden dword a bit hned vrátit zpátky. Mezi oběma přehozeními se do paměti nesáhne ničím jiným a instrukce mfence a lfence brání procesoru v tom, aby si přístupy přes tu hranici přeuspořádal. Po skončení je stroj zase v pořádku a nezůstane po tom stopa.
Zamíchanou paměť rozluští solver
Po přehození ale nikdo neví, jak přesně je paměť zamíchaná. Domas píše, že datové listy jsou v téhle části nepřesné: mapy XOR nesedí a pořadí jednoho stupně z nich neplyne. Převod je naopak dobře popsatelný matematicky. Je to lineární zobrazení nad tělesem GF(2), tedy soustava rovnic, ve které každá neznámá nabývá jen nuly, nebo jedničky.
Data se sbírají hrubou silou. V přeházeném pohledu se na náhodnou adresu zapíše značka 0xdeadc0de, bit se vrátí zpět a paměť se projede, kde se ta značka vynořila. Vyjde dvojice adres mířících na tutéž buňku. Hrst takových dvojic dostane SMT solver z3 a ten dopočítá celou převodní matici. S ní se ke každé chráněné adrese najde její dvojnice, kterou se na totéž místo v čipu sáhne z běžného pohledu.
Co z chráněné paměti vypadlo
Repozitář ukazuje čtyři cíle. Prvním je Platform Security Processor, samostatné jádro ARM uvnitř procesoru, na kterém běží firmwarový TPM. Z jeho privátní paměti Domas vytáhl rutinu crAmd_ModExp, tedy modulární umocňování, na kterém stojí každý podpis toho TPM i testy prvočíselnosti při generování jeho klíčů.
Druhým je System Management Mode, nejprivilegovanější režim procesoru. Z paměti, kterou má čipová sada držet nečitelnou, přečetl vstupní kód obsluhy přerušení SMI, tedy prvních pár instrukcí, které jádro po vstupu do toho režimu vykoná.
Třetím je odkladiště stavu C6. Když jádro uspí své napájení, uloží se sem jeho registry, na testovaném stroji po 16 KiB na jádro. A ve stejném odkladišti leží i čtvrtý cíl: kopie nahraného mikrokódu, protože paměť se záplatou je volatilní a uspáním se vyprázdní. Domas ji porovnal se soubory mikrokódu z linuxového firmwaru a 68 z 94 kusů sedělo na rodinu 16h, u ostatních rodin ani jeden. Nástroj dram_poke tuhle kopii umí i přepsat, a je to právě ta, kterou si jádro po probuzení nahraje zpátky.
Meze toho výsledku
Vyzkoušené je to na rodině 16h, tedy na nízkopříkonových jádrech Jaguar a Puma z let 2013 a 2014. Autor důvod říká rovnou: je to poslední generace, jejíž datové listy tyhle registry popisují, a zároveň je z nich vidět, že je nejde zamknout. Od rodiny 17h dál je AMD v dokumentaci vynechává.
Přehodit bit navíc vyžaduje práva jádra, takže pro běžný software to podle serveru LWN bezprostřední problém není. Samotné chování je dokumentované; nechtěný je až důsledek, že se tudy dá číst a přepisovat prakticky cokoliv, aniž stroj spadne. V seznamu bezpečnostních bulletinů AMD k tomu zatím nic nestojí a Domas u nálezu neuvádí číslo CVE.
Zbytek je zatím tvrzení, ne výsledek. Autor píše, že týž tvar, tedy prokládání kanálů, ranků a bank i závěrečné míchání, má každý moderní řadič paměti bez ohledu na výrobce a architekturu, a že nad ním stojí AMD SEV, Intel SGX a TDX i ARM TrustZone. Ukázal ale jeden registr na jedné rodině čipů; kolik z toho platí jinde, se z jeho práce vyčíst nedá. Přednáška Spaghettifying DRAM: Breaking Everything with Memory Collision Exploitation je v programu Black Hat USA 2026 vedená jako dostupná pouze ze záznamu.
Zdroje: repozitář skitter-creek-bath-salts, zpráva na LWN.net a příručka AMD pro tvůrce firmwaru a jader.