Výzkumníci z Worcester Polytechnic Institute (USA) představili nový typ útoku Mayhem, který využívá metodu poškození bitů v dynamické operační paměti Rowhammer k změně hodnot proměnných ve stacku, používaných v programu jako příznaky pro rozhodování o úspěšnosti autentizace a předávání bezpečnostních kontrol. Praktické příklady aplikace útoku jsou demonstrovány pro obcházení autentizace v SUDO, OpenSSH a MySQL, stejně jako pro změnu výsledku kontrol spojených se zabezpečením v knihovně OpenSSL.
Útok může být aplikován na aplikace, ve kterých při kontrolách se používá srovnání rozdílů hodnot s nulou. Příklad zranitelného kódu: int auth = 0; … // kód kontroly měnící hodnotu auth v případě úspěšné autentizace if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
V kontextu tohoto příkladu je pro úspěšný útok dostatečné dosáhnout poškození libovolného bite v paměti, který se týká 32bitové proměnné auth ve stacku. Při poškození jakéhokoli bitu v proměnné již nebude hodnota rovna nule a podmínkový příkaz určuje úspěšné provedení autentizace. Takové kontrolní šablony jsou dost běžné v aplikacích a objevují se například v SUDO, OpenSSH, MySQL a OpenSSL.

Útok může být aplikován i na srovnání typu „if(auth == 1)“, ale v tomto případě se jeho provedení komplikuje, protože je třeba poškodit nikoli libovolný bit z 32, ale poslední bit. Metoda může být také použita k ovlivnění hodnot proměnných v procesorových registrech, protože obsah registrů může být na chvíli přenesen do stacku při přepínání kontextu, volání funkcí nebo vyvolání signálního handleru. V době, kdy se hodnoty registrů nacházejí v paměti, lze do této paměti zavést poškození a do registru bude obnovena změněná hodnota.

K deformaci bitů se používá jedna z modifikací útoku třídy RowHammer. Vzhledem k tomu, že paměť DRAM představuje dvourozměrné pole buněk, z nichž každá se skládá z kondenzátoru a tranzistoru, provádění nepřetržitého čtení stejné oblasti paměti vede k fluktuaci napětí a anomáliím, které způsobují malou ztrátu náboje sousedních buněk. Pokud je intenzita čtení vysoká, může sousední buňka ztratit dostatečné množství náboje a příští regenerace nebude schopna obnovit její původní stav, což povede ke změně hodnoty uložených dat v buňce. Pro ochranu proti RowHammer výrobci čipů přidali mechanismus TRR (Target Row Refresh), který blokuje deformaci buněk v některých případech, ale nechrání před všemi možnými varianty útoku.
Pro ochranu proti útoku Mayhem se doporučuje při porovnání nepoužívat hodnocení odchylek od nuly nebo shodu s jedničkou, ale provádět ověření shod pomocí náhodné hodnoty s nenulovými oktety. V tomto případě je potřeba přesně deformovat podstatný počet bitů, aby se nastavila požadovaná hodnota proměnné, což je nerealistické, na rozdíl od deformace jednoho bitu. Příklad kódu, který není náchylný k útoku: int auth = 0xbe406d1a; … // kontrolní kód, který nastaví hodnotu auth na 0x23ab8701 v případě úspěšné autentizace if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
Tento ochranný mechanismus již byl aplikován vývojáři sudo a byl zařazen do vydání 1.9.15 jako oprava zranitelnosti CVE-2023-42465. Prototyp kódu pro provedení útoku plánují zveřejnit po provedení oprav v hlavních zranitelných projektech.
Zdroj: opennet.ru
