Výzkumníci z Vojenského technického univerzity lidové osvobozenecké armády Číny, Národního univerzity Singapuru a Švýcarského federálního technologického institutu v Curychu vyvinuli novou metodu útoku na izolované enklávy Intel SGX (Software Guard eXtensions). Tento útok, nazvaný SmashEx, je způsoben problémy s reentrantností při zpracování výjimečných situací v rámci runtime komponentů Intel SGX. Navrhovaná metoda útoku umožňuje při převzetí kontroly nad operačním systémem identifikovat důvěrné údaje uložené v enklávě nebo zorganizovat kopírování vlastního kódu do paměti enklávy a jeho provedení.
Prototypy exploitů byly připraveny pro enklávy s runtime založeným na Intel SGX SDK (CVE-2021-0186) a Microsoft Open Enclave (CVE-2021-33767). V prvním případě byla demonstrována možnost extrakce RSA klíče používaného na webovém serveru pro HTTPS, zatímco ve druhém případě se podařilo určit obsah získaný pomocí utilitiy cURL, spuštěné uvnitř enklávy. Zranitelnost byla již softwarově odstraněna ve verzích Intel SGX SDK 2.13 a Open Enclave 0.17.1. Kromě balíčků Intel SGX SDK a Microsoft Open Enclave se zranitelnost také projevuje v SDK Google Asylo, EdgelessRT, Apache Teaclave, Rust SGX SDK, SGX-LKL, CoSMIX a Veracruz.
Připomínáme, že technologie SGX (Software Guard Extensions) se objevila v procesorech Intel Core šesté generace (Skylake) a nabízí řadu instrukcí, které umožňují vytvářet pro aplikace uživatelské úrovně uzavřené oblasti paměti — enklávy, jejichž obsah nelze přečíst ani změnit jádrem a kódem běžícím v režimech ring0, SMM a VMM. Předat řízení kódu v enklávě není možné tradičními funkcemi přechodu a manipulací s registry a stackem — k předání řízení do enklávy se používají speciálně vyvinuté nové instrukce EENTER, EEXIT a ERESUME, které provádějí kontrolu práv. Přitom kód umístěný v enklávě může používat klasické metody volání k přístupu k funkcím uvnitř enklávy a speciální instrukci pro volání externích funkcí. Pro ochranu před hardwarovými útoky, jako je připojení k modulu DRAM, se používá šifrování paměti enklávy.

Problém je spojen s tím, že technologie SGX umožňuje operačnímu systému přerušit vykonávání enclavů pomocí generování hardwarové výjimky, zatímco v enclavech není správně implementováno primitivum pro atomické zpracování těchto výjimek. Na rozdíl od jádra operačního systému a běžných aplikací, kód uvnitř enclavů nemá přístup k primitivům pro organizaci atomických akcí během zpracování asynchronně vznikajících výjimek. Bez těchto atomických primitivů může být enclave kdykoli přerušen a vrácen do vykonávání, i v okamžicích, kdy se v enclavu provádí kritické sekce a nachází se v nebezpečném stavu (například když nejsou uloženy/obnoveny registry CPU).

Pro normální fungování technologie SGX umožňuje přerušit vykonávání enclavu pomocí konfigurovatelných hardwarových výjimek. Tato vlastnost umožňuje runtime prostředím enclavů realizovat zpracování výjimek uvnitř enclavu nebo zpracování signálů, ale také může vyvolat chyby reentrability. Útok SmashEx spočívá v využití nedostatků v SDK, kvůli nimž není daná situace znovu vyvolání zpracovatele výjimky správně zpracována. Je důležité, že k exploataci zranitelnosti musí útočník mít schopnost přerušit vykonávání enclavu, t.j. musí mít kontrolu nad prací systémového prostředí.
Po generaci výjimky získává útočník malé časové okno, během kterého může zachytit tok vykonávání manipulací s enterparametry. Zejména při přístupu k systému (prostředí mimo enclave) je možné vytvořit novou výjimku bezprostředně po vykonání instrukce vstupu do enclavy (EENTER), což povede k předání řízení systému ve fázi, kdy ještě není dokončeno nastavení zásobníku pro enclave, včetně udržování stavu registrů CPU.
Systém pak může vrátit řízení zpět do enclave, ale protože zásobník enclave během přerušení nebyl nastaven, enclave poběží se zásobníkem, který je v paměti systému, což může být využito pro aplikaci metod útoku založených na návratovém programování (ROP — Return-Oriented Programming). Při použití techniky ROP se útočník nesnaží umístit svůj kód do paměti, ale operuje již existujícími kusy strojových instrukcí ze načtených knihoven, které končí instrukcí pro návrat řízení (obvykle se jedná o ukončení knihovních funkcí). Činnost exploitu spočívá ve vytváření řetězců volání těchto bloků („gadgets“) pro získání požadované funkčnosti.


Zdroj: opennet.ru
