Hlavní navigace

Chyba PortSmash umožňuje krást klíče přes Hyper-Threading

Petr Krčmář

Nově odhalená chyba PortSmash umožňuje ukrást data z paměti jiného procesu, který běží na stejném procesorovém jádře používajícím Hyper-Threading. Ochrana zatím neexistuje, jediným řešením je HT vypnout.

Doba čtení: 3 minuty

Byla odhalena nová chyba PortSmash, která na procesorech používajících Hyper-Threading umožňuje krást data z paměti patřící jiným procesům. Objevitelé byli schopni ukrást šifrovací klíče z procesu OpenSSL běžícím na stejném fyzickém procesorovém jádře.

Když jedno nejsou dvě

Hyper-threading umožňuje lépe využít prostředky procesoru tím, že zdvojuje některé jeho součásti. Takto vylepšené procesorové jádro se pak může pro operační systém jevit jako jádra dvě a procesy na těchto virtuálních jádrech mohou být prováděny částečně paralelně vedle sebe. Výsledkem je rychleji dokončená úloha, tedy celkově vyšší výkon.

Současná honba za nedokonalostmi v moderních procesorech, která byla odstartována na začátku letošního roku, už ukázala, že ani Hyper-threading nezůstal problémů ušetřen. V létě byla odhalena útok TLBleed, který zneužívá Translation Lookaside Buffer (TLB). To je tabulka překladu adres, která je sdílená mezi oběma virtuálními procesorovými jádry. Pomocí postranního kanálu je možné sledovat sousední proces běžící na stejném fyzickém jádře a postupně vyčíst jeho paměť. Později se přidal útok L1TF (ForeShadow), který spoléhá na špatnou kontrolu přístupu do paměti během spekulativního vykonávání.

Nyní byl objeven další útok postranním kanálem, který opět využívá Hyper-threadingu. Jeho princip je ale úplně odlišný, vůbec nesouvisí s kešováním ani s paměťovým subsystémem. Využívá měření časové prodlevy vznikající při kolizích mezi procesy přistupujícími ke společným hardwarovým prostředkům.

PortSmash útočí

Problém objevili finští vědci z Tamperské univerzity společně s kolegou z Havanské univerzity. Zatím bylo zveřejněno jen obecné oznámení, podrobnosti by měly být brzy dostupné v dokumentu Port Contention for Fun and Profit, který prochází recenzním řízením.

Princip PortSmash spočívá v tom, že útočný proces na společném jádře sleduje, jak dlouho trvají instrukce sousedního procesu. Podle toho dokáže překvapivě přesně zjistit, co proces dělá a jaké šifrovací klíče například používá.

Procesor při své práci dekóduje instrukce jednotlivých vláken, transformuje je na mikroinstrukce a ty posílá do jednotlivých jednotek uvnitř procesoru. Každé jádro obsahuje všechny jednotky, které jsou potřeba k provádění úplné sady instrukcí. Jenže procesy běžící na stejném jádře pomocí Hyper-threadingu některé tyto jednotky sdílejí.

Tyto jednotky jsou sdruženy do skupin a jsou dostupné pomocí takzvaných portů. Plánovač v procesoru se snaží férově přidělovat porty jednotlivým procesům a posílat na ně postupně mikroinstrukce. Na těchto portech totiž dochází ke kolizím, jak se ke stejným jednotkám snaží přistupovat dva procesy.

Graf naměřených prodlev zveřejněný autory

Při útoku se využívá souběhu, kdy se oběť snaží přistupovat k jednotkám za konkrétním portem a provádět na nich své instrukce. Ve stejnou chvíli se ale o totéž snaží útočník. Plánovač ovšem instrukce špehujícího procesu zdržuje, protože port je v danou chvíli obsazený legitimním procesem. Útočníkův proces měří čas provádění svých instrukcí a může si tak snadno všimnout, že se k prostředkům procesoru nedostává okamžitě. Z toho jasně vyvodí, že oběť právě začala pracovat na svém úkolu.

Pomocí přesného měření času vzniká postranní kanál, protože se útočník může dozvědět, jaké instrukce jsou prováděny a co se děje za zdí. Podmínkou je samozřejmě spuštěný Hyper-threading a také to, že procesy běží na jednom společném fyzickém jádře. To je ale třeba na sdíleném hostingu naprosto běžná věc.

Funguje to

Chyba dostala označení CVE-2018–5407 a před měsícem byla oznámena Intelu a dalším organizacím. Vývojáři nyní zveřejnili podrobnosti včetně útočného kódu, který byl při testování zranitelnosti úspěšně použit. Kód byl testován na procesorech Intel Skylake a Kaby Lake, ale vědci předpokládají, že bude fungovat i na jiných architekturách včetně AMD Ryzen.

Útok byl vyzkoušen proti knihovně OpenSSL, ale nijak se na ni nemusí omezovat. Úspěšně se podařilo ukrást z paměti šifrovací klíč (P-384) používaný v tomto případě pro TLS. Vývojáři OpenSSL vydali opravu ve verzi 1.1.1, záplaty existují také pro verzi 1.1.0i a novější.

Ochranou je vypnout Hyper-threading

Hyper-threading začíná být velmi problematickou technologií, která sice má pozitivní dopad na výkon, ale zároveň ohrožuje procesy ve sdíleném prostředí. Projekt OpenBSD se tak například nedávno rozhodl podporu HT zrušit. Jediným řešením v tuto chvíli je podporu HT v počítači zcela vypnout, alespoň do doby, než Intel vydá záplatovaný mikrokód.

AMD zatím dodané materiály zkoumá a chce se přesvědčit, jaký má útok PortSmash dopad na jejich procesory. Také autoři dokumentu slibují, že stejně prozkoumají i architekturu Ryzen. Hyper-threading tu s námi bude dál, protože přináší zajímavé navýšení výkonu. Jen si teď na něj budeme muset dávat velký pozor.

Našli jste v článku chybu?