Navrhujeme opäť ísť na nízku úroveň a hovoriť o bezpečnosti firmvéru pre počítačové platformy kompatibilné s x86. Tentoraz je hlavnou zložkou štúdie Intel Boot Guard (nezamieňať s Intel BIOS Guard!) – hardvérovo podporovaná dôveryhodná bootovacia technológia BIOS, ktorú môže predajca počítačového systému natrvalo povoliť alebo zakázať vo fáze výroby. Recept výskumu je nám už známy: implementáciu tejto technológie pomocou reverzného inžinierstva nakrájajte na tenké plátky, opíšte jej architektúru, naplňte ju nezdokumentovanými detailmi, dochuťte útočnými vektormi podľa chuti a premiešajte. Pridajme olej do príbehu o tom, ako chyba, ktorá je roky klonovaná vo výrobe niekoľkých predajcov, umožňuje potenciálnemu útočníkovi pomocou tejto technológie vytvoriť v systéme skrytý rootkit, ktorý sa nedá odstrániť (ani programátorom).
Mimochodom, článok je založený na správach „On Guard of Rootkits: Intel BootGuard“ z konferencie ZeroNights 2016 a 29. stretnutie DefCon Rusko (obe prezentácie tu).
Firmvér pre počítačovú platformu s architektúrou Intel 64
Najprv odpovedzme na otázku: aký je firmvér modernej počítačovej platformy s architektúrou Intel 64? Samozrejme, UEFI BIOS. Takáto odpoveď však nebude presná. Pozrime sa na obrázok, ktorý zobrazuje desktopovú (laptopovú) verziu tejto architektúry.
Základom je odkaz:
Procesor (CPU, Central Processing Unit), ktorý má okrem hlavných jadier zabudované grafické jadro (nie vo všetkých modeloch) a pamäťový radič (IMC, Integrated Memory Controller);
Čipová súprava (PCH, Platform Controller Hub), obsahujúca rôzne ovládače na interakciu s periférnymi zariadeniami a správu podsystémov. Medzi nimi je známy Intel Management Engine (ME), ktorý má aj firmvér (Intel ME firmware).
Notebooky okrem vyššie uvedeného vyžadujú vstavaný ovládač (ACPI EC, Advanced Control and Power Interface Embedded Controller), ktorý je zodpovedný za chod subsystému napájania, touchpad, klávesnica, klávesy Fn (jas obrazovky, hlasitosť zvuku , podsvietenie klávesnice atď. ) a ďalšie veci. A má aj vlastný firmvér.
Celý vyššie uvedený firmvér je teda firmvér počítačovej platformy (systémový firmvér), ktorý je uložený na spoločnej flash pamäti SPI. Aby používatelia tejto pamäte neboli zmätení, kde sa nachádza, obsah tejto pamäte je rozdelený do nasledujúcich oblastí (ako je znázornené na obrázku):
UEFI BIOS;
Firmvér ACPI EC (samostatná oblasť sa objavila s mikroarchitektúrou procesora Skylake (2015), ale vo voľnej prírode sme ešte nevideli príklady jeho použitia, takže firmvér vstavaného radiča je stále súčasťou systému UEFI BIOS) ;
Flash deskriptory sú hlavnou oblasťou flash pamäte, ktorá obsahuje ukazovatele na iné oblasti, ako aj povolenia na prístup k nim.
Za vymedzenie prístupu k regiónom (v súlade so špecifikovanými oprávneniami) je zodpovedný SPI bus master, SPI radič zabudovaný do čipsetu, cez ktorý sa k tejto pamäti pristupuje. Ak sú povolenia nastavené na odporúčané hodnoty spoločnosti Intel (z bezpečnostných dôvodov), potom má každý používateľ flash SPI plný prístup (čítanie/zápis) len do svojho regiónu. A zvyšok je buď len na čítanie, alebo neprístupný. Známy fakt: na mnohých systémoch má CPU plný prístup k UEFI BIOS a GbE, prístup len na čítanie k flash deskriptorom a vôbec nemá prístup k Intel ME regiónu. Prečo na mnohých a nie na všetkých? To, čo sa odporúča, sa nevyžaduje. Podrobnejšie vám povieme neskôr v článku.
Mechanizmy na ochranu firmvéru počítačovej platformy pred modifikáciami
Je zrejmé, že firmvér počítačovej platformy by mal byť chránený pred možným kompromitovaním, čo by umožnilo potenciálnemu útočníkovi presadiť sa v ňom (prežiť aktualizácie/reinštalácie OS), spustiť svoj kód v najprivilegovanejších režimoch atď. A obmedzenie prístupu k oblastiam flash pamäte SPI, samozrejme, nestačí. Preto sa na ochranu firmvéru pred úpravami používajú rôzne mechanizmy špecifické pre každé operačné prostredie.
Firmvér Intel ME je teda podpísaný na kontrolu integrity a pravosti a kontrolér ME ho kontroluje pri každom načítaní do pamäte ME UMA. Tento overovací proces sme už rozoberali v jednom z články, venovaný podsystému Intel ME.
Firmvér ACPI EC sa spravidla kontroluje iba z hľadiska integrity. Avšak vzhľadom na skutočnosť, že tento binárny súbor je súčasťou systému UEFI BIOS, takmer vždy podlieha rovnakým ochranným mechanizmom, aké používa systém UEFI BIOS. Poďme sa o nich porozprávať.
Tieto mechanizmy možno rozdeliť do dvoch kategórií.
Ochrana proti zápisu v oblasti UEFI BIOS
Fyzická ochrana obsahu SPI flash pamäte pomocou prepojky na ochranu proti zápisu;
Ochrana premietania oblasti UEFI BIOS v adresnom priestore CPU pomocou registrov čipovej sady PRx;
Blokovanie pokusov o zápis do oblasti UEFI BIOS vygenerovaním a spracovaním zodpovedajúceho prerušenia SMI nastavením bitov BIOS_WE/BLE a SMM_BWP v registroch čipovej sady;
Pokročilejšou verziou tejto ochrany je Intel BIOS Guard (PFAT).
Okrem týchto mechanizmov môžu predajcovia vyvíjať a implementovať svoje vlastné bezpečnostné opatrenia (napríklad podpisovanie kapsúl s aktualizáciami UEFI BIOS).
Je dôležité si uvedomiť, že na konkrétnom systéme (v závislosti od predajcu) nemusia byť všetky vyššie uvedené ochranné mechanizmy aplikované, nemusia byť aplikované vôbec alebo môžu byť implementované zraniteľným spôsobom. Viac o týchto mechanizmoch a situácii s ich implementáciou si môžete prečítať v v tomto článku. Záujemcom odporúčame prečítať si celú sériu článkov o zabezpečení UEFI BIOS od CodeRush.
Overenie systému UEFI BIOS
Keď hovoríme o dôveryhodných zavádzacích technológiách, prvá vec, ktorá príde na myseľ, je Secure Boot. Architektonicky je však navrhnutý tak, aby overoval pravosť komponentov mimo systému UEFI BIOS (ovládače, bootloadery atď.), a nie samotného firmvéru.
Intel preto v SoC s mikroarchitektúrou Bay Trail (2012) implementoval hardvérovo nedeaktivovaný Secure Boot (Verified Boot), ktorý nemá nič spoločné s vyššie spomínanou technológiou Secure Boot. Neskôr (2013) bol tento mechanizmus vylepšený a vydaný pod názvom Intel Boot Guard pre desktopy s mikroarchitektúrou Haswell.
Predtým, ako popíšeme Intel Boot Guard, pozrime sa na spúšťacie prostredia v architektúre Intel 64, ktoré sú v kombinácii základom dôvery pre túto dôveryhodnú zavádzaciu technológiu.
Intel CPU
Cap naznačuje, že procesor je hlavným vykonávacím prostredím v architektúre Intel 64. Prečo je to koreň dôvery? Ukazuje sa, že to, čo ho robí takým, je vlastníctvo nasledujúcich prvkov:
Microcode ROM je energeticky nezávislá, neprepisovateľná pamäť na ukladanie mikrokódu. Predpokladá sa, že mikrokód je implementácia systému príkazov procesora pomocou najjednoduchších inštrukcií. Deje sa to aj v mikrokóde chyby. Takže v systéme BIOS môžete nájsť binárne súbory s aktualizáciami mikrokódu (prekryté počas zavádzania, pretože ROM sa nedá prepísať). Obsah týchto binárnych súborov je zašifrovaný, čo značne komplikuje analýzu (preto je špecifický obsah mikrokódu známy iba tým, ktorí ho vyvíjajú), a podpísaný na kontrolu integrity a autentickosti;
AES kľúč na dešifrovanie obsahu aktualizácií mikrokódu;
hash verejného kľúča RSA používaného na overenie podpisu aktualizácií mikrokódu;
RSA hash verejného kľúča, ktorý overuje podpis modulov kódu ACM (Authenticated Code Module) vyvinutých spoločnosťou Intel, ktoré môže CPU spustiť pred spustením BIOSu (hello microcode) alebo počas jeho činnosti, keď nastanú určité udalosti.
Intel ME
Náš blog bol venovaný tomuto podsystému dvaČlánok. Pripomeňme, že toto spustiteľné prostredie je založené na mikrokontroléri zabudovanom do čipsetu a je v systéme najskrytejšie a najprivilegovanejšie.
Napriek svojmu utajeniu je Intel ME tiež koreňom dôvery, pretože má:
ME ROM - energeticky nezávislá, neprepisovateľná pamäť (nie je poskytnutá žiadna metóda aktualizácie) obsahujúca štartovací kód, ako aj hash SHA256 verejného kľúča RSA, ktorý overuje podpis firmvéru Intel ME;
AES kľúč na ukladanie tajných informácií;
prístup k sade poistiek (FPF, Field Programmable Fuses) integrovaným do čipovej sady na trvalé ukladanie niektorých informácií vrátane informácií špecifikovaných predajcom počítačového systému.
Intel Boot Guard 1.x
Malé odmietnutie zodpovednosti. Čísla verzií technológie Intel Boot Guard, ktoré používame v tomto článku, sú ľubovoľné a nemusia mať nič spoločné s číslovaním použitým v internej dokumentácii spoločnosti Intel. Okrem toho tu uvedené informácie o implementácii tejto technológie boli získané počas reverzného inžinierstva a môžu obsahovať nepresnosti v porovnaní so špecifikáciou pre Intel Boot Guard, ktorá pravdepodobne nebude nikdy zverejnená.
Intel Boot Guard (BG) je teda hardvérovo podporovaná technológia overovania autentifikácie UEFI BIOS. Súdiac podľa krátkeho popisu v knihe [Platform Embedded Security Technology Revealed, kapitola Boot with Integrity, or Not Boot], funguje ako dôveryhodný bootovací reťazec. A prvým odkazom v ňom je zavádzací kód (mikrokód) vo vnútri CPU, ktorý sa spúšťa udalosťou RESET (nezamieňať s vektorom RESET v BIOSe!). CPU nájde kódový modul vyvinutý a podpísaný spoločnosťou Intel (Intel BG startup ACM) na SPI flash pamäti, načíta ho do svojej vyrovnávacej pamäte, overí (už bolo uvedené vyššie, že CPU má hash verejného kľúča, ktorý overuje ACM podpis) a začína.
Tento kódový modul je zodpovedný za overenie malej počiatočnej časti systému UEFI BIOS – Initial Boot Block (IBB), ktorá zase obsahuje funkcie na overenie hlavnej časti systému UEFI BIOS. Intel BG vám teda umožňuje overiť pravosť systému BIOS pred načítaním operačného systému (čo je možné vykonať pod dohľadom technológie Secure Boot).
Technológia Intel BG poskytuje dva prevádzkové režimy (a jeden neprekáža s druhým, t. j. oba režimy je možné v systéme povoliť alebo oba deaktivovať).
Merané topánky
V režime Measured Boot (MB) každý spúšťací komponent (začínajúc bootovacou ROM CPU) „meria“ ďalší komponent pomocou schopností modulu TPM (Trusted Platform Module). Pre tých, ktorí to nevedia, dovoľte mi vysvetliť.
TPM má PCR (Platform Configuration Registers), do ktorých sa zapíše výsledok operácie hash podľa vzorca:
Tie. aktuálna hodnota PCR závisí od predchádzajúcej a tieto registre sa vynulujú iba vtedy, keď je systém RESET.
V režime MB teda v určitom okamihu PCR odrážajú jedinečný (v rámci možností hašovacej operácie) identifikátor kódu alebo údajov, ktoré boli „namerané“. Hodnoty PCR možno použiť v niektorých operáciách šifrovania údajov (TPM_Seal). Potom bude ich dešifrovanie (TPM_Unseal) možné len vtedy, ak sa hodnoty PCR nezmenili v dôsledku načítania (t. j. nebola upravená ani jedna „meraná“ zložka).
Overené spustenie
Najhoršie pre tých, ktorí radi upravujú UEFI BIOS, je režim Verified Boot (VB), v ktorom každý spúšťací komponent kryptograficky overuje integritu a pravosť nasledujúceho. A v prípade chyby overenia sa stane (jedna z nich):
vypnutie časovým limitom od 1 minúty do 30 minút (aby mal používateľ čas pochopiť, prečo sa jeho počítač nespustí, a ak je to možné, pokúsi sa obnoviť systém BIOS);
okamžité vypnutie (takže používateľ nemá čas nič pochopiť, tým menej robiť);
pokračovať v práci s pokojným výrazom (v tom prípade, keď nie je čas na bezpečnosť, pretože sú dôležitejšie veci na prácu).
Voľba akcie závisí od špecifikovanej konfigurácie Intel BG (konkrétne od takzvanej vynucovacej politiky), ktorá je trvalo zaznamenaná predajcom počítačovej platformy v špeciálne navrhnutom úložisku - poistkách čipovej sady (FPF). Tomuto bodu sa budeme podrobnejšie venovať neskôr.
Okrem konfigurácie dodávateľ vygeneruje dva kľúče RSA 2048 a vytvorí dve dátové štruktúry (zobrazené na obrázku):
Manifest koreňového kľúča dodávateľa (KEYM, OEM Root Key Manifest), ktorý obsahuje SVN (číslo bezpečnostnej verzie) tohto manifestu, hash SHA256 verejného kľúča ďalšieho manifestu, verejný kľúč RSA (t. j. verejnú časť manifestu koreňový kľúč predajcu) na overenie podpisu tohto manifestu a samotného podpisu;
Manifest IBB (IBBM, Initial Boot Block Manifest), ktorý obsahuje SVN tohto manifestu, hash SHA256 IBB, verejný kľúč na overenie podpisu tohto manifestu a samotný podpis.
Hash SHA256 verejného kľúča OEM Root Key je trvalo zaznamenaný v poistkách čipovej sady (FPF), rovnako ako konfigurácia Intel BG. Ak konfigurácia Intel BG počíta so zahrnutím tejto technológie, tak odteraz môže aktualizovať BIOS na tomto systéme iba vlastník súkromnej časti OEM Root Key (t.j. môcť prepočítať tieto manifesty), t.j. predajcu.
Pri pohľade na obrázok okamžite vyvstanú pochybnosti o potrebe takého dlhého overovacieho reťazca – mohli použiť jeden manifest. Prečo veci komplikovať?
Intel tak v skutočnosti poskytuje predajcovi možnosť použiť rôzne IBB kľúče pre rôzne rady svojich produktov a jeden ako koreňový kľúč. Ak dôjde k úniku súkromnej časti kľúča IBB (ktorým je podpísaný druhý manifest), incident sa dotkne iba jedného produktového radu a len dovtedy, kým predajca nevygeneruje nový pár a nezahrnie prepočítané manifesty do ďalšej aktualizácie systému BIOS.
Ak je však ohrozený koreňový kľúč (ktorým je podpísaný prvý manifest), nebude možné ho nahradiť; nie je stanovený žiadny postup odvolania. hash verejnej časti tohto kľúča sa raz a navždy naprogramuje do FPF.
Konfigurácia Intel Boot Guard
Teraz sa pozrime bližšie na konfiguráciu Intel BG a proces jej vytvárania. Ak sa pozriete na zodpovedajúcu kartu v grafickom rozhraní nástroja Flash Image Tool zo súpravy Intel System Tool Kit (STK), všimnete si, že konfigurácia Intel BG obsahuje hash verejnej časti koreňového kľúča dodávateľa, niekoľko nejasné hodnoty a pod. Profil Intel BG.
Štruktúra tohto profilu:
typedef struct BG_PROFILE
{
unsigned long Force_Boot_Guard_ACM : 1;
unsigned long Verified_Boot : 1;
unsigned long Measured_Boot : 1;
unsigned long Protect_BIOS_Environment : 1;
unsigned long Enforcement_Policy : 2; // 00b – do nothing
// 01b – shutdown with timeout
// 11b – immediate shutdown
unsigned long : 26;
};
Vo všeobecnosti je konfigurácia Intel BG veľmi flexibilná. Zvážte napríklad príznak Force_Boot_Guard_ACM. Ak sa po jeho odstránení nenájde spúšťací modul ACM BG na SPI flash, nenastane žiadne dôveryhodné spustenie. Bude nedôveryhodná.
Už sme písali vyššie, že politiku presadzovania pre režim VB je možné nakonfigurovať tak, aby v prípade chyby overenia došlo k nedôveryhodnému sťahovaniu.
Takéto veci nechajte na uvážení predajcov...
Nástroj GUI poskytuje nasledujúce „hotové“ profily:
Nie.
režim
Popis
0
No_FVME
Technológia Intel BG je vypnutá
1
VE
Režim VB je povolený, vypnutie po uplynutí časového limitu
2
VME
oba režimy sú povolené (VB a MB), vypnutie časovým limitom
3
VM
oba režimy sú povolené bez vypnutia systému
4
FVE
Režim VB povolený, okamžité vypnutie
5
FVME
oba režimy zapnuté, okamžité vypnutie
Ako už bolo spomenuté, konfiguráciu Intel BG musí dodávateľ systému raz a navždy zapísať do poistiek čipsetu (FPF) - malého (podľa neoverených informácií len 256 bajtov) hardvérového úložiska informácií vo vnútri čipsetu, ktoré je možné naprogramovať. mimo výrobných zariadení Intelu (preto presne Programovateľné v teréne Poistky).
Je to skvelé na ukladanie konfigurácie, pretože:
má jednorazovo programovateľnú oblasť na ukladanie dát (presne tam, kde je zapísaná konfigurácia Intel BG);
Čítať a programovať ho dokáže iba Intel ME.
Aby bolo možné nastaviť konfiguráciu pre technológiu Intel BG na konkrétnom systéme, dodávateľ počas výroby vykoná nasledovné:
Pomocou utility Flash Image Tool (od Intel STK) vytvorí obraz firmvéru s danou konfiguráciou Intel BG vo forme premenných v rámci Intel ME regiónu (tzv. dočasné zrkadlo pre FPF);
Pomocou utility Flash Programming Tool (od Intel STK) zapíše tento obrázok do SPI flash pamäte systému a zatvorí tzv. výrobný režim (v tomto prípade sa príslušný príkaz odošle do Intel ME).
V dôsledku týchto operácií Intel ME odovzdá špecifikované hodnoty zo zrkadla pre FPF v oblasti ME do FPF, nastaví rozlíšenia v SPI flash deskriptoroch na hodnoty odporúčané spoločnosťou Intel (popísané na začiatku článok) a vykonajte RESET systému.
Analýza implementácie Intel Boot Guard
Aby sme analyzovali implementáciu tejto technológie na konkrétnom príklade, skontrolovali sme nasledujúce systémy, či neobsahujú stopy technológie Intel BG:
Pod „podporou“ rozumieme prítomnosť spúšťacieho modulu ACM Intel BG, vyššie spomínané manifesty a zodpovedajúci kód v BIOSe, t.j. implementácia na analýzu.
Ako príklad si vezmime ten stiahnutý z kancelárie. obrázok webovej stránky predajcu flash pamäte SPI pre Gigabyte GA-H170-D3H (verzia F4).
Zavádzacia ROM procesora Intel
Najprv si povedzme o činnosti procesora, ak je povolená technológia Intel BG.
Nebolo možné nájsť vzorky dešifrovaného mikrokódu, takže ako sú akcie opísané nižšie implementované (v mikrokóde alebo hardvéri), je otvorenou otázkou. Faktom však je, že moderné procesory Intel „môžu“ vykonávať tieto akcie.
Po opustení stavu RESET procesor (obsah flash pamäte už bol namapovaný do adresného priestoru) nájde tabuľku FIT (Firmware Interface Table). Je ľahké ho nájsť; ukazovateľ naň je napísaný na adrese FFFF FFC0h.
V uvažovanom príklade sa hodnota FFD6 9500h nachádza na tejto adrese. Prístupom na túto adresu procesor vidí tabuľku FIT, ktorej obsah je rozdelený do záznamov. Prvý záznam je hlavička nasledujúcej štruktúry:
typedef struct FIT_HEADER
{
char Tag[8]; // ‘_FIT_ ’
unsigned long NumEntries; // including FIT header entry
unsigned short Version; // 1.0
unsigned char EntryType; // 0
unsigned char Checksum;
};
Z nejakého neznámeho dôvodu nie je v týchto tabuľkách vždy vypočítaný kontrolný súčet (pole je ponechané nula).
Zvyšné položky poukazujú na rôzne binárne súbory, ktoré je potrebné analyzovať/spustiť pred spustením systému BIOS, t.j. pred prepnutím na starý vektor RESET (FFFF FFF0h). Štruktúra každého takéhoto záznamu je nasledovná:
typedef struct FIT_ENTRY
{
unsigned long BaseAddress;
unsigned long : 32;
unsigned long Size;
unsigned short Version; // 1.0
unsigned char EntryType;
unsigned char Checksum;
};
Pole EntryType vám hovorí o type bloku, na ktorý tento vstup ukazuje. Poznáme niekoľko typov:
Teraz je zrejmé, že jeden zo záznamov ukazuje na umiestnenie binárneho súboru ACM spúšťača Intel BG. Štruktúra hlavičky tohto binárneho súboru je typická pre moduly kódu vyvinuté spoločnosťou Intel (ACM, aktualizácie mikrokódu, sekcie kódu Intel ME, ...).
typedef struct BG_ACM_HEADER
{
unsigned short ModuleType; // 2
unsigned short ModuleSubType; // 3
unsigned long HeaderLength; // in dwords
unsigned long : 32;
unsigned long : 32;
unsigned long ModuleVendor; // 8086h
unsigned long Date; // in BCD format
unsigned long TotalSize; // in dwords
unsigned long unknown1[6];
unsigned long EntryPoint;
unsigned long unknown2[16];
unsigned long RsaKeySize; // in dwords
unsigned long ScratchSize; // in dwords
unsigned char RsaPubMod[256];
unsigned long RsaPubExp;
unsigned char RsaSig[256];
};
Procesor načíta tento binárny súbor do svojej vyrovnávacej pamäte, overí ho a spustí.
Spustenie Intel BG ACM
Výsledkom analýzy práce tohto ACM bolo jasné, že robí nasledovné:
prijíma konfiguráciu Intel BG od Intel ME, zapísanú do poistiek čipovej sady (FPF);
nájde manifesty KEYM a IBBM a overí ich.
Na nájdenie týchto manifestov používa ACM aj tabuľku FIT, ktorá má dva typy záznamov na označenie údajov o štruktúre (pozri FIT_ENTRY_TYPES vyššie).
Pozrime sa bližšie na manifesty. V štruktúre prvého manifestu vidíme niekoľko nejasných konštánt, hash verejného kľúča z druhého manifestu a verejný koreňový kľúč OEM podpísaný ako vnorená štruktúra:
Druhý obsahuje hash SHA256 IBB a počet deskriptorov, ktoré popisujú obsah IBB (t. j. z čoho sa hash vypočítava):
typedef struct IBBS
{
char Tag[8]; // ‘__IBBS__’
unsigned char : 8; // 10h
unsigned char : 8; // 0
unsigned char : 8; // 0
unsigned char : 8; // x <= 0Fh
unsigned long : 32; // x & FFFFFFF8h = 0
unsigned long Unknown[20];
unsigned short : 16; // 0Bh
unsigned short : 16; // 20h == hash size ?
unsigned char IbbHash[32]; // SHA256 of an IBB
unsigned char NumIbbDescriptors;
};
Deskriptory IBB sledujú túto štruktúru jeden po druhom. Ich obsah má nasledujúci formát:
typedef struct IBB_DESCRIPTOR
{
unsigned long : 32;
unsigned long BaseAddress;
unsigned long Size;
};
Je to jednoduché: každý deskriptor obsahuje adresu/veľkosť časti IBB. Teda zreťazenie blokov, na ktoré poukazujú tieto deskriptory (v poradí samotných deskriptorov), je IBB. A spravidla je IBB súborom všetkých modulov fáz SEC a PEI.
Druhý manifest je doplnený štruktúrou obsahujúcou verejný kľúč IBB (overený hashom SHA256 z prvého manifestu) a podpis tohto manifestu:
Takže ešte predtým, ako sa spustí UEFI BIOS, procesor spustí ACM, ktorý overí pravosť obsahu sekcií s kódom fázy SEC a PEI. Potom procesor ukončí ACM, nasleduje vektor RESET a začne vykonávať BIOS.
Overený oddiel PEI musí obsahovať modul, ktorý skontroluje zvyšok BIOSu (kód DXE). Tento modul už vyvíja IBV (Independent BIOS Vendor) alebo samotný dodávateľ systému. Pretože K dispozícii sme mali iba systémy Lenovo a Gigabyte a mali podporu Intel BG; pozrime sa na kód extrahovaný z týchto systémov.
Modul UEFI BIOS LenovoVerifiedBootPei
V prípade Lenova sa ukázalo, že ide o modul LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D} vyvinutý spoločnosťou Lenovo.
Jeho úlohou je vyhľadať (pomocou GUID) hašovaciu tabuľku pre DXE a overiť DXE.
if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
if (!FindHashTable())
return EFI_NOT_FOUND;
if (!VerifyDxe())
return EFI_SECURITY_VIOLATION;
}
Хеш таблица {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} имеет следующий формат:
typedef struct DXE_DESCRIPTOR
{
unsigned char BlockHash[32]; // SHA256
unsigned long Offset;
unsigned long Size;
};
Modul UEFI BIOS BootGuardPei
V prípade Gigabyte sa ukázalo, že ide o modul BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066} vyvinutý spoločnosťou AMI, teda prítomný v akomkoľvek AMI BIOS s podporou Intel BG.
Jeho operačný algoritmus je trochu odlišný, ale scvrkáva sa na to isté:
int bootMode = EFI_PEI_SERVICES->GetBootMode();
if (bootMode != BOOT_ON_S3_RESUME &&
bootMode != BOOT_ON_FLASH_UPDATE &&
bootMode != BOOT_IN_RECOVERY_MODE)
{
HOB* h = CreateHob();
if (!FindHashTable())
return EFI_NOT_FOUND;
WriteHob(&h, VerifyDxe());
return h;
}
Tabuľka hash {389CC6F2-1EA8-467B-AB8A-78E769AE2A15}, ktorú hľadá, má nasledujúci formát:
typedef HASH_TABLE DXE_DESCRIPTORS[];
typedef struct DXE_DESCRIPTOR
{
unsigned char BlockHash[32]; // SHA256
unsigned long BaseAddress;
unsigned long Size;
};
Intel Boot Guard 2.x
Poďme si v krátkosti povedať o ďalšej implementácii Intel Boot Guard, ktorá sa našla v novšom systéme založenom na Intel SoC s mikroarchitektúrou Apollo Lake – ASRock J4205-IT.
Hoci sa táto verzia bude používať iba v SoC (nové systémy s mikroarchitektúrou procesorov Kaby Lake naďalej využívajú Intel Boot Guard 1.x), je veľký záujem o štúdium novej možnosti architektúry pre platformy Intel SoC, ktoré zaznamenali významné zmeny, napríklad:
regióny BIOS a Intel ME (alebo skôr Intel TXE, podľa terminológie pre Intel SoC) sú teraz jedným regiónom IFWI;
hoci bol Intel BG povolený na platforme, štruktúry ako FIT, KEYM, IBBM sa nenašli vo flash pamäti;
okrem jadier TXE a ISH (x86) pribudlo do čipsetu (mimochodom opäť ARC) tretie jadro - PMC (Power Management Controller), spojené so zabezpečením prevádzkyschopnosti napájacieho subsystému a monitorovaním výkonu.
Obsahom nového regiónu IFWI je súbor nasledujúcich modulov:
Pri analýze firmvéru TXE vyšlo najavo, že po RESETe TXE udrží procesor v tomto stave, kým nepripraví základný obsah adresného priestoru pre CPU (FIT, ACM, RESET vektor ...). Okrem toho TXE umiestňuje tieto údaje do svojej pamäte SRAM, potom tam dočasne udelí prístup procesoru a „uvoľní“ ho z RESETu.
Na pozore pred rootkitmi
No a teraz prejdime k „horúcim“ veciam. Raz sme zistili, že na mnohých systémoch SPI flash deskriptory obsahujú oprávnenia na prístup k oblastiam SPI flash pamäte, takže všetci používatelia tejto pamäte môžu zapisovať a čítať ktorúkoľvek oblasť. Tie. v žiadnom prípade.
Po kontrole pomocou nástroja MEinfo (od Intel STK) sme videli, že výrobný režim na týchto systémoch nie je uzavretý, preto sú poistky čipovej sady (FPF) ponechané v nedefinovanom stave. Áno, Intel BG sa v takýchto prípadoch nezapína ani nevypína.
Hovoríme o nasledujúcich systémoch (v súvislosti s Intel BG a tým, čo bude popísané neskôr v článku, budeme hovoriť o systémoch s mikroarchitektúrou procesora Haswell a vyššou):
všetky produkty Gigabyte;
všetky produkty MSI;
21 modelov notebookov Lenovo a 4 modely serverov Lenovo.
Objav sme samozrejme nahlásili týmto predajcom, ako aj Intelu.
Adekvátna reakcia prišla len od Lenovoktorí rozpoznali problém a vydal opravu.
gigabyte Zdalo sa, že informáciu o zraniteľnosti prijali, no nijako to nekomentovali.
Komunikácia s MSI úplne zastavil na našej žiadosti o zaslanie vášho verejného kľúča PGP (zaslanie bezpečnostného upozornenia v zašifrovanej forme). Uviedli, že „sú výrobcom hardvéru a nevyrábajú kľúče PGP“.
Ale poďme k veci. Keďže poistky sú ponechané v nešpecifikovanom stave, používateľ (alebo útočník) ich môže naprogramovať samostatne (najzložitejšie je nájsť Intel STK). Ak to chcete urobiť, musíte vykonať nasledujúce kroky.
1. Spustite operačný systém Windows (vo všeobecnosti je možné nižšie popísané akcie vykonať aj pod Linuxom, ak pre požadovaný OS vytvoríte analóg Intel STK). Pomocou pomôcky MEinfo sa uistite, že v tomto systéme nie sú naprogramované poistky.
2. Prečítajte si obsah flash pamäte pomocou Flash Programming Tool.
3. Otvorte načítaný obraz pomocou ľubovoľného nástroja na úpravu UEFI BIOS, vykonajte potrebné zmeny (zaveďte napríklad rootkit), vytvorte/upravte existujúce štruktúry KEYM a IBBM v regióne ME.
Na obrázku je zvýraznená verejná časť kľúča RSA, ktorého hash bude naprogramovaný do poistiek čipsetu spolu so zvyškom konfigurácie Intel BG.
4. Pomocou nástroja Flash Image Tool vytvorte nový obraz firmvéru (nastavením konfigurácie Intel BG).
5. Napíšte nový obrázok do pamäte flash pomocou nástroja Flash Programming Tool a pomocou MEinfo overte, že oblasť ME teraz obsahuje konfiguráciu Intel BG.
6. Na zatvorenie výrobného režimu použite nástroj Flash Programming Tool.
7. Systém sa reštartuje a potom môžete použiť MEinfo na overenie, že FPF sú teraz naprogramované.
Tieto akcie navždy povoliť Intel BG v tomto systéme. Akciu nie je možné vrátiť späť, čo znamená:
Aktualizovať UEFI BIOS v tomto systéme bude môcť iba vlastník súkromnej časti koreňového kľúča (t. j. ten, kto povolil Intel BG);
ak do tohto systému vrátite pôvodný firmvér, napríklad pomocou programátora, ani sa nezapne (dôsledok vynucovacej politiky v prípade chyby overovania);
aby ste sa zbavili takéhoto UEFI BIOSu, musíte vymeniť čipset s naprogramovanými FPF za „čistý“ (t.j. prespájkovať čipset, ak máte prístup k infračervenej spájkovacej stanici v cene auta, alebo jednoducho vymeniť základnú dosku ).
Aby ste pochopili, čo takýto rootkit dokáže, musíte zhodnotiť, čo umožňuje spustiť váš kód v prostredí UEFI BIOS. Povedzme, že v najprivilegovanejšom režime procesora - SMM. Takýto rootkit môže mať nasledujúce vlastnosti:
vykonávané paralelne s operačným systémom (môžete nakonfigurovať spracovanie na generovanie prerušenia SMI, ktoré bude spustené časovačom);
mať všetky výhody režimu SMM (úplný prístup k obsahu pamäte RAM a hardvérovým zdrojom, utajenie pred OS);
Programový kód rootkitu je možné pri spustení v režime SMM zašifrovať a dešifrovať. Akékoľvek údaje dostupné iba v režime SMM možno použiť ako šifrovací kľúč. Napríklad hash zo sady adries v SMRAM. Ak chcete získať tento kľúč, budete sa musieť dostať do SMM. A to sa dá urobiť dvoma spôsobmi. Nájdite RCE v kóde SMM a využite ho alebo pridajte svoj vlastný modul SMM do systému BIOS, čo je nemožné, pretože sme povolili Boot Guard.
Táto zraniteľnosť teda umožňuje útočníkovi:
vytvoriť skrytý, neodstrániteľný rootkit neznámeho účelu v systéme;
spustite svoj kód na jednom z jadier čipovej sady vnútri Intel SoC, konkrétne na Intel ISH (pozorne sa pozrite na obrázok).
Hoci možnosti subsystému Intel ISH ešte neboli preskúmané, zdá sa, že ide o zaujímavý vektor útoku pre Intel ME.
Závery
Štúdia umožnila získať technický popis fungovania technológie Intel Boot Guard. Mínus pár tajomstiev v zabezpečení Intelu prostredníctvom modelu utajenia.
Je prezentovaný scenár útoku, ktorý vám umožňuje vytvoriť odinštalovateľný rootkit v systéme.
Videli sme, že moderné procesory Intel sú schopné spustiť množstvo proprietárneho kódu ešte pred spustením systému BIOS.
Platformy s architektúrou Intel 64 sú čoraz menej vhodné na prevádzkovanie slobodného softvéru: verifikácia hardvéru, rastúci počet proprietárnych technológií a podsystémov (tri jadrá v čipsete SoC: x86 ME, x86 ISH a ARC PMC).
zmiernenia
Predajcovia, ktorí úmyselne nechajú otvorený výrobný režim, by ho mali zatvoriť. Zatiaľ majú zatvorené iba oči a ukazujú to aj nové systémy Kaby Lake.
Používatelia môžu vypnúť Intel BG na svojich systémoch (ktoré sú náchylné na opísanú zraniteľnosť) spustením Flash Programming Tool s parametrom -closemnf. Najprv by ste sa mali uistiť (pomocou MEinfo), že konfigurácia Intel BG v oblasti ME umožňuje vypnúť túto technológiu po naprogramovaní v FPF.