Hlavní navigace

Útok TLBleed na procesory Intel ohrožuje šifrovací klíče pomocí Hyper-Threadingu

Petr Krčmář

Nizozemský bezpečnostní tým objevil novou zranitelnost procesorů Intel, která dovoluje jednomu procesu s vysokou úspěšností získat šifrovací klíče z paměti jiného procesu na stejném počítači.

Doba čtení: 5 minut

Tým vědců z Systems and Network Security Group na nizozemské Vrije Universiteit Amsterdam zveřejnil informace o nově objevené chybě, která dovoluje jednomu procesu ukrást šifrovací klíče vedlejšího procesu. Podařilo se jim to přitom s 99,8% úspěšností na procesoru Intel Skylake Core i7–6700K, 98,2% úspěšností na Intel Broadwell Xeon E5–2620 v4 a 99,8 % na procesoru s nejnovější architekturou Intel Coffee Lake.

Detaily budou zveřejněny v srpnu na konferenci Black Hat v Las Vegas, už teď ale známe základní parametry celého útoku. Ten bylo možné zneužít k získání 256bitového klíče, který právě jiný proces použil k podepsání zprávy algoritmem Curve 25519 EdDSA, implementovaným v knihovně libgcrypt.

Celý útok sestává ze samotného sběru dat trvajícího pouhé 2 ms, poté následuje zhruba 17sekundová analýza pomocí natrénovaného klasifikátoru a nakonec je potřeba udělat práci hrubou silou. Ta má proměnlivou obtížnost, ale medián je 213, což v praxi představuje několik dalších sekund. Pak je klíč na světě.

Útok zvaný TLBleed

Útok není založen na spekulativním vykonávání instrukcí, takže nemá nic společného se známými útoky Spectre a Meltdown. Namísto toho zneužívá vlastností Hyper-Threadingu a kešování v procesorech Intel. O možnosti zneužití se přitom ví už přes 13 let, ale Intel tehdy celý problém bagatelizoval, protože nešlo o kritickou věc. Dnes už ano.

Použitá metoda se jmenuje TLBleed, protože zneužívá Translation Lookaside Buffer, tedy druh keše uvnitř procesoru. Rozdíl proti předchozím útokům je v tom, že dosavadní ochrany proti čtení keše postranním kanálem nejsou proti TLBleed obvykle účinné.

Vývojáři uklidňují, že nejde o novou hrozbu typu Spectre a pro reálné zneužití je potřeba splnit několik podmínek. Zejména musí na cílovém stroji běžet zákeřný software, který netriviální operaci provádí. Provozovatelé virtualizačních platforem by ale měli zbystřit, protože u nich teoreticky hrozí riziko ukradení šifrovacích klíčů mezi procesy jednotlivých uživatelů. Zatím prý ovšem nebyl podobný útok v praxi pozorován.

Dvě vlákna na jednom jádře

TLBleed zneužívá vlastnosti technologie Hyper-Threading (HT), která je součástí moderních procesorů Intel. Za normálních okolností může každé jádro procesoru provádět zároveň jedno vlákno kódu. Při použití HT mohou být některé části jádra využívány nezávisle dvěma různými vlákny. Lépe se tak využijí oddělené funkční jednotky a s vyšší efektivitou roste i výkon.

Na jednom jádře tak v danou chvíli běží dvě vlákna a využívají některé společné prostředky, především keše a TLB. Když jsou takto na jádře spuštěna dvě různá vlákna různých programů, mohou se vzájemně pozorovat a podle využívání společných prostředků je pak možné odhadovat, co leží v paměti sousedního programu. To samozřejmě není za normálních okolností možné, ale s využitím postranních kanálů lze získat některé indicie.

Zneužívá se k tomu tabulky, ve které má procesor uložené mapování virtuální paměti na fyzickou. Proces samotný vidí vlastní paměť jako souvislý prostor, ve kterém je sám a může si jej spravovat dle libosti. Tuto iluzi vytváří procesor ve spolupráci s operačním systémem, který zajistí, že když se proces snaží číst či zapisovat do své paměti, pracuje se ve skutečnosti podle tabulek s úplně jinou oblastí paměti fyzické. Celý tento mechanismus je pro proces transparentní a vše probíhá na pozadí běžných operací.

Tabulky mapování virtuální paměti jsou obrovské a nevejdou se do procesoru celé. Proto si každé jádro drží jen část ve vlastní keši nazvané TLB. Pokud je v ní daný záznam, je operace prakticky okamžitá. Pokud v ní není, musí se načíst z pomalé systémové paměti a do TLB zaznamenat. Tím se v keši drží nejpoužívanější data a ta méně používaná se naopak odstraňují.

Právě pozorováním toho, jak je sdílená TLB využívána a jak se staré záznamy vyměňují za nové je možné odhadnout, jak asi pracuje druhé vlákno běžící na stejném jádře. Je možné tabulkou opatrně manipulovat a sledovat, kdy ji sousední proces začne zase plnit vlastními daty. Tím vzniká postranní kanál, kterým je možné postupně vyčíst chráněná data vedlejšího vlákna.

Vývojáři použili strojové učení (vektorový klasifikátor), aby odhalili, kdy sousední vlákno zpracovává citlivá data. Měří přitom latence způsobené doplňováním informací do TLB. Postupně se tak z postranního kanálu podaří získat proud bitů, ve kterých je možné pozorovat citlivá data. V praxi je pomocí útoku TLBleed možné, aby běžný nenápadný proces špehoval třeba web server nebo e-mailového klienta a ukradl mu z jeho paměti privátní klíče.

Podle dostupných informací přitom pro útok není podstatné, odkud proces data čte, ale kdy to dělá. Protože útočník zná strukturu kódu a může sledovat jeho využívání TLB, může dedukovat část zpracovávaných citlivých dat. Novinkou je v tomto případě také využití strojového učení; ve změti přicházejících dat se tak nemusí orientovat člověk, ale udělá to za něj natrénovaný stroj. Tím se samozřejmě dramaticky zvýší účinnost útoku a zkrátí se doba k jeho realizaci.

Intel je v klidu

Intel tvrdí, že současné techniky ochrany keší proti útokům postranním kanálem budou dostatečně účinné i proti TLBleed. Bude prý možné napsat kód tak bezpečně, aby útoku odolal. Firma problém stále bagatelizuje, nepřidělila mu kód CVE a odmítla zaplatit objevitelům odměnu, kterou nabízí v rámci svého bezpečnostního programu.

Ben Gras, jeden z autorů útoku, ale naopak tvrdí, že chybu bude možné zneužít i přes nasazení v současnosti dostupných ochran. Běžně rozšířené aplikace jsou tedy podle jeho slov zranitelné. Existují vzácné implementace, které jsou proti podobnému útoku odolné, protože mají konstantní data flow. Ovšem například zmíněná knihovna libgcrypt je v současném stavu zranitelná.

Gras také předpokládá, že nové procesory AMD budou mít úplně stejný problém. Používají totiž velmi podobný mechanismus umožňující běh více nezávislých vláken na jednom jádře. To také komplikuje ochranu aplikací před tímto typem útoku, protože správně napsaný program může odolávat na jedné architektuře, ale mírně odlišná architektura (i stejného výrobce) může znamenat problém.

Řešení může přijít ze strany operačního systému. Jaderný plánovač může být upraven tak, aby nespouštěl na jednom jádře dvě vlákna různých procesů. To ovšem může znamenat snížení výkonu na systémech s mnoha jednovláknovými úlohami – na nich by se výhoda Hyper-Threadingu vlastně vůbec neprojevila. Na virtualizačních platformách by to ovšem fungovat mohlo, jednoduše by se vedle sebe nespouštěla vlákna z různých virtuálních strojů.

MIF18 tip v článku témata

Dalším řešením je úplné vypnutí podpory HT v jádře. OpenBSD to nedávno udělalo, pravděpodobně právě ze strachu z tohoto útoku. Je možné, že i některé další systémy budou jeho kroky následovat. Je také možné, že Intel přijde s vlastním řešením, například umožní systémům rozdělit TLB pro jednotlivá vlákna.

(Zdroj: The Register)

Našli jste v článku chybu?