Jak je to s opravami chyby Spectre. Aktualizace mikrokódu, operačního systému a důsledky

21. 1. 2018

Sdílet

 Autor: Redakce

Začátkem tohoto měsíce vešla ve známost existence bezpečnostních chyb Spectre a Meltdown, které hodně rozbouřily vody ve světě procesorů a tato kategorie útoků patrně bude dlouhodobějším problémem. Chybu Meltdown řeší aktualizace operačních systémů, které již v případě Windows jsou dávno v distribuci. S chybou Spectre je to ale složitější, pojďme se tedy podívat na to, jak je to se zabezpečením této díry. Pro připomenutí, Spectre jsou ve skutečnosti dvě zranitelnosti s trošku odlišným mechanismem a účinky, a také odlišnými cestami k opravě. Jednak tzv. „varianta 1“, jinak CVE-2017-5753 (Bounds Check Bypass); a vedle ní „varianta 2“, CVE-2017-5715 (Branch target injection). Obě tyto chyby potřebují opravu jak na procesorech Intel, tak na procesorech AMD. AMD sice uvádí, že v případě druhé varianty je zranitelnější méně a šance na zneužití není velká, opravy ale budou aplikovány také.

spectre-textSpectre Varianta 1

Situace s opravami je výrazně jednodušší v prvním případě. Varianta 1 je řešena čistě pomocí úprav v softwaru. A to jednak v operačním systému, ale současně i v aplikacích jakou jsou třeba webové prohlížeče a podobné aplikace, v nichž může běžet cizí kód (javascript). Patche pro Linux ještě nejsou hotové, ale uživatelé Windows mají zřejmě štěstí: touto první variantou Spectre jádro Windows údajně vůbec netrpí. Platforma Microsoftu nicméně může být napadena, pokud zranitelnost zanesou do systému nějaké ovladače třetích stran (například Nvidia vydávala opravené ovladače).

Co vám hrozí, pokud budete mít díru Spectre 1 nezalátanou? Škodlivý kód se může dostat k celé paměti běžícího procesu, tedy například aktivního procesu prohlížeče v případě browseru. Hrozí tedy ukradení/vyzrazení potenciálně citlivých dat.

Spectre Varianta 2

U druhé varianty Spectre je situace o dost komplikovanější. V pravé řadě, tato zranitelnost nebo útok ohrožuje jednak aplikace (škodlivý kód může šmírovat v paměti dalších aplikací/procesů – například tedy přečíst nějaké citlivé údaje), ale také operační systém, protože může dojít i k přečtení jeho citlivé paměti.

intel-kaby-lake-lga-1151Ochrany okolo nepřímého větvení

Obrana proti Spectre 2 obnáší také opravy aplikací a operačního systému, ale vedle toho i aktualizaci mikrokódu („firmware“) samotného procesoru, na jejíž dostupnosti záleží, jak dobře budete chráněni. Tyto aktualizace umožňují na procesoru použít dříve nedostupné funkce IBRS (indirect branch restricted speculation), IBPB (indirect branch restrictiom barrier) a STIBP (single-thread indirect branch predictors), a to nastavením příslušného MSR bitu. Zjednodušeně řečeno IBRS a IBPB slouží k tomu, že na požádání mohou „sanitizovat“ stav predikce větvení.

Útok Spectre 2 zneužívá prediktor větvení k tomu, že si ho ve svém procesu „předtrénuje“, aby poté skočil na zamýšlenou adresu v jaderném prostoru nebo v prostoru jiného procesu, což by škodlivý kód měl normálně zakázáno. Pokud se mu ale podaří vhodně „zmasírovat“ prediktor větvení, může se k nim dostat. Ony nové funkce mají takovou manipulaci překazit. IBPB resetuje stav prediktoru větvení (takže zahodí škodlivý „tréning“ útočníka). STIBP by mělo zamezit tomu, aby jedno vlákno procesoru s SMT nebo HT ovlivnilo predikci větvení pro druhé vlákno – což by otevíralo útočníkovi možnost natrénovat prediktor na jednom vlákně a zaútočit tím na kód běžící na druhém. IBRS má bránit tomu, aby se při systémovém volání a přesunu z programu do jaderného prostoru zmanipulovaný prediktor větvení choval podle škodlivého tréninku. Tyto funkce ale nefungují automaticky, operační systém je musí v potřebném momentu aktivovat, tedy například při systémovém volání.

Přehled variant Spectre a Meltdownu od Microsoftu Přehled variant Spectre a Meltdownu od Microsoftu

Opravy ve Windows

Jak je tedy implementována ochrana? Ve Windows funguje na dvou úrovních. Pokud máte to štěstí, že se k vám dostala aktualizace mikrokódu vašeho CPU, která exponuje bity uvedených nových funkcích, pak je Windows může využít pro ochranu před Spectre 2. Pokud je toto váš případ, máte před chybou Spectre 2 (respektive jejím exploitem) chráněné jednotlivé aplikace i jádro operačního systému. Škodlivý kód se tedy nemůže podívat do jádra systému, ani do dalších programů, aby například ukradl hesla či bankovní údaje.

Bez aktualizace mikrokódu procesoru je ochrana proti Spectre jen částečná Bez aktualizace mikrokódu procesoru je ochrana proti Spectre jen částečná

Tyto aktualizace mikrokódu Intel vydal nebo vydá minimálně pro procesory Coffee Lake, Kaby Lake, Skylake, Broadwell, Haswell a zdá se, že by mohlo dojít i na Ivy Bridge a Sandy Bridge (aktualizace: pro tyto dvě rodiny Intel aktualizovaný mikrokód nevydává, alespoň zatím). Pokryty by snad měly být také out-of-order Atomy. U AMD to vypadá, že budou vydány aktualizace pro procesory s jádry Zen (s funkcemi IBPB a STIBP, zatímco IBRS není třeba kvůli odlišné architektuře) a minimálně pro nějaká jádra odvozená od rodiny Bulldozer (tam to bude IBPB a IBRS). Problém bude ale s tím, že většina uživatelů mikrokód dostává od výrobce základní desky či PC/notebooku. Ti zřejmě nebudou moc ochotní aktualizovat BIOSy desek starších než dva-tři roky, takže přes ně asi často potřebnou aktualizaci nedostanete.

Oracle Sparc M8 Spectre není jen problém Intelu a AMD. V nějaké formě může postihnout všechny out-of-order procesory. Potvrzena je zranitelnost ARMu, Power a nyní již i Sparců

Obrana bez nového mikrokódu

Pokud aktualizaci mikrokódu nemáte, nebudete ještě úplně v příslovečném loji. Windows má implementovanou ještě sekundární ochranu. Ta spočívá ve vkládání serializačních instrukcí LFENCE. Tato metoda ale chrání jen operační systém před škodlivými uživatelskými programy. Neumí už před nimi ochránit další běžící aplikace. Individuální programy jako webové prohlížeče je možné „utěsnit“ čistě softwarovými úpravami, to ale vyžaduje minimálně jejich překompilování. Uživatelé bez nového mikrokódu nebo se starším CPU (zdá se, že u Intelu to budou třeba Core 2, možná i Nehalem/Westmere) tedy nebudou úplně nahraní, ale budou odkázáni na opravy a aktualizace programů.

AMD uvádí, že u jeho procesorů je obtížné Spectre 2 zneužít, takže v situaci bez aktualizace mikrokódu by na tom jejich uživatelé teoreticky mohli být lépe (firma dokonce aktualizace mikrokódu označuje jako volitelné, což ale pravda může být tak trošku marketingově podbarveno). Otázka však je, zda toto neplatí jen pro Ryzeny, pro které zrovna asi všechny desky nový BIOS dostanou. Ona nižší zranitelnost by totiž snad mohla spočívat v odlišné implementaci prediktoru větvení. Ryzeny údajně pracují s konkrétními adresami v paměti, nikoliv jen s relativními offsety, což je jinak normou (tak to alespoň vysvětluje web Ars Technica). Prediktor s touto vlastnosti je zřejmě podstatně těžší oblbnout, nicméně AMD ho nejspíš zavedlo až v Zenu.

Poznámka na okraj: Microsoft tyto bezpečnostní aktualizace vydává pro Windows 7, Windows 8.1 a Windows 10. Windows XP, Vista a 8.0 jsou už mimo podporu a patche proti Meltdownu ani Spectre neobdrží. Možná je také dobré připomenout, že Meltdown není opraven na 32bitových Windows a zatím se nezdá, že bude. Tato zranitelnost CPU Intel bohužel mimo 64bitové systémy přetrvává.

Linux a retpoline

Situace je mírně odlišná v Linuxu, pro který víme některé další podrobnosti. Také zde budou použity funkce IBPB/IBRS/STIBP poskytnuté aktualizovanými mikrokódy a operační systém je bude využije na ochranu jak paměti jádra, tak i aplikací. Podobně jako Windows je implementována drhá záložní ochrana pro případy, kdy mikrokód (nové funkce) přítomné nejsou. Na procesorech Intel bude Linux používat kód pojmenovaný retpoline („return trampoline“). Na procesorech AMD není retpoline potřeba a místo toho jsou používány instrukce LFENCE. Údajně by v tom měl být ten rozdíl, že LFENCE snad obnáší nižší výkonnostní postih (ztrátu) než retpoline.

Jak technika retpoline, tak použití LFENCE chrání jen jádro operačního systému, přičemž retpoline zřejmě také vyžaduje, aby byly aplikace rekompilovány. Kromě toho zřejmě retpoline není stoprocentně účinná na procesorech Skylake (podle některých zdrojů už Broadwell) a novějších, kde je prý možné ji obejít. U těchto čipů patrně bude zvlášť záhodno mít aktualizovaný mikrokód, a to dost možná i na Windows, které bez něj používají jen ochranu LFENCE (u níž by z politiky Linuxu vyplývalo, že pro Intely je slabší).

amd-ryzen-apu-mobilni-bga-fp5 Pro procesory AMD je na Linuxu údajně potřeba o něco méně náročná obrana, retpoline u nich nemá být použita

Dopady na výkon

Špatná zpráva je, že tato opatření přinášejí další zhoršení výkonu nad rámec toho, co zapříčinily opravy chyby Meltdown. Zatímco Meltdown postihuje jen Intel a tudíž by opravy neměly zpomalovat AMD, zde to kvůli univerzální aplikaci obrany před Spectre neplatí. Následky utěsňování díry Spectre 1 by prý mohly být víceméně zanedbatelné, ovšem Spectre 2 bude asi bolestivější. U retpoline například bývá uváděno 5–10% zpomalení serverových zátěží. To by ale asi mělo být naštěstí na běžných „klientských“ úlohách na osobních počítačích pociťováno spíše jen omezeně. Opět asi bude dopad hlavně u I/O (zpomalení výkonu rychlých NVMe disků). Každopádně bych spíše nedoporučoval se opravám kvůli hrozící ztrátě výkonu vyhýbat, jelikož jakmile jsou tyto chyby jednou odhaleny a popsány, bývají hackeři dosti zdatní v tvorbě exploitů na ně.

Propad výkonu by asi mohl být také u oné techniky využívající nové funkce procesorů pro omezení predikce větvení. Zdali bude více bit Intel, nebo AMD, případně zda to bude tak nějak nastejno, to těžko říci, bude asi třeba hodně benchmarků a postih se asi bude lišit architekturu od architektury.

Starší CPU a starší Windows utrpí víc

Poměrně zajímavé je to, co k výkonu po opravách říká Microsoft na základě vlastních měření. Podle této firmy nemá Meltdown a Spectre 1 až zas takový výkonnostní propad a považuje v tomto ohledu Spectre 2 za horší. Podle Microsoftu jsou ztráty nižší na procesorech Skylake, Kaby Lake a novějších (mluví se o jednociferných procentech). Na starších procesorech jako je Haswell nebo předchozí jsou projevy údajně horší (AMD v těchto výčtech není nikde zmíněno, takže těžko říct, jak do tohoto jeho CPU zapadají). Řeč je mimochodem jen o PC. Na margo serverů Microsoft píše, že serverové zátěže pocítí podstatně výraznější problémy na starších CPU i Skylaku a novějších, zejména při velké zátěži I/O.

Kromě toho Microsoft uvádí, že dopad je nižší na Windows 10 díky optimalizacím a různým změnám v tomto systému. Starší systémy Windows 7 a Windows 8 by opět měly mít propady výkonu výraznější. Důvodem je, že v nich dochází k většímu počtu přechodů mezi jaderným a uživatelským režimem, což je situace, do které výkonnostní dopady Spectre a Meltdownu promlouvají. Starší Windows například vykreslovaly písma v rámci jádra operačního systému, což už Windows 10 nečiní (zejména asi z bezpečnostních důvodů, nyní se to ale hodí i kvůli výkonu).

Jak ozkoušet stav vaší ochrany?

Zjistit, zda máte starý mikrokód a Windows vás kvůli tomu chrání méně efektivně, lze zjistit oficiálním nástrojem Microsoftu, který má formu skriptu pro PowerShell. Pohodlnější k použití je ovšem program SpecuCheck (spusťte z příkazového řádku) od Alexe Ionescua z Windows Internals. Pokud vám tyto utility řeknou, že „Branch Prediction Mitigations“ jsou „disabled“ „due to the lack of microcode update“, pak vám schází ona aktualizace mikrokódu. Windows by měly používat záložní částečnou obranu s LFENCE.

BTIDisabledByNoHardwareSupport znamená, že procesor nemá potřebnou aktualizaci mikrokódu (výstup z <a href="https://support.microsoft.com/en-hk/help/4073119/protect-against-speculative-execution-side-channel-vulnerabilities-in">diagnostického nástroje SpeculationControl od Microsoftu</a>). Na tomto počítači není opraven ani Meltdown (KVAShadowWindowsSupportEnabled=false), jelikož jde o 32bitové Windows, pro které oprava Meltdownu není Výstup z diagnostického nástroje SpeculationControl od Microsoftu. BTIDisabledByNoHardwareSupport=True znamená, že procesor nemá potřebnou aktualizaci mikrokódu. Na tomto počítači není opraven ani Meltdown (KVAShadowWindowsSupportEnabled=False), jelikož jde o 32bitové Windows
windows-spectre-specucheck Výstup programu SpecuCheck. Vizte řádek "Disabled due to Lack of Microcode Update: Yes". Tento program ukazuje i zda Windows používá jednotlivé funkce nových mikrokódů (IBRS, STIPB, IBPB)

Dodatek: jak se dostat k aktualizaci mikrokódu, když na vás kašlou a nový BIOS nedostanete

Jak už bylo nadhozeno, výrobci desek, případně počítačů a notebooků, nemají obvykle mnoho ochoty aktualizovat starší počítače. Pravděpodobně nastane mnoho případů, kdy sice Intel nebo AMD vydají aktualizaci mikrokódu pro váš procesor, ale aktualizace BIOSu už s ní nevyjde. Tato situace má naštěstí řešení.

AMD a Intel naštěstí vydávají také samostatný mikrokód, který lze nahrát do procesoru při nabíhání operačního systému. Nejsnazší to mají uživatelé Linuxu, jelikož tyto aktualizace mívají obvykle distribuované jako balíček a mohou je dostat přímo od dodavatele OS. Stačí jim jen zkontrolovat, zda mají tyto aktualizace nainstalované a zde mají zapnuto, aby je systém také při náběhu nahrával do CPU (to je třeba dělat pokaždé, jelikož aktualizace je volatilní a při restartu nebo vypnutí se z CPU ztratí).

ICTS24

Záchrana Windowsáků od VMware

Na Windows to tak lehké není, Microsoft ve Windows Update málokdy mikrokódy distribuuje. Naštěstí existuje jedna málo známá alternativa. Jeden ze zaměstnanců VMware vyvinul jednoduchý ovladač, který umí mikrokód nahrát, a to i na nevirtualizovaném železe. Tento software naleznete zde. Samotné binárky mikrokódů neobsahuje, ty je třeba získat například z archivu Linuxu a nahrát je do jeho složky. Pro AMD je naleznete zde (ovšem zdá se, že tento zdroj ještě nemá nové aktualizované verze, ty zatím distribuují jen některé enterprise distribuce). Pro Intel lze stahovat přímo od zdroje.

Výstup ovladače pro aktualizaci mikrokódu ve Windows. Zde se aktuaalizace nezdařila, protože ve stažených binárkách není verze novější než to, co je již v CPU (AMD A10-6800K) Výstup ovladače pro aktualizaci mikrokódu ve Windows. Zde se aktualizace nezdařila, protože ve stažených binárkách není verze novější než to, co je již v CPU (AMD A10-6800K)

Poté následujte instrukce v návodu pro ovladač (malá poznámka: Ryzen a Epyc potřebují soubor „microcode_amd_fam17h.bin“, který návod nezmiňuje). Zda se podařilo firmware nahrát, zjistíte z Prohlížeče událostí Windows, ovladač výsledek operace loguje do logu „Systém“ (hledejte jméno „cpumcupdate“). V logu se hláška objevuje jen při restartu nebo regulérním zapnutí PC (alespoň tedy u mě), ale podle autora by ovladač měl update nahrávat i při probouzení z hibernace či spánku.