Schrödinger's Trusted Download. Intel Boot Guard

Schrödinger's Trusted Download. Intel Boot Guard
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.

Schrödinger's Trusted Download. Intel Boot Guard
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) ;
  • Firmvér Intel ME;
  • konfigurácia (MAC adresa atď.) vstavaného sieťového adaptéra GbE (Gigabit Ethernet);
  • Flash deskriptory sú hlavnou oblasťou flash pamäte, ktorá obsahuje ukazovatele na iné oblasti, ako aj povolenia na prístup k nim.

Schrödinger's Trusted Download. Intel Boot Guard
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

  1. Fyzická ochrana obsahu SPI flash pamäte pomocou prepojky na ochranu proti zápisu;
  2. Ochrana premietania oblasti UEFI BIOS v adresnom priestore CPU pomocou registrov čipovej sady PRx;
  3. 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;
  4. 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.

Schrödinger's Trusted Download. Intel Boot Guard

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:

Schrödinger's Trusted Download. Intel Boot Guard

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):

  1. 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;
  2. 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.

Schrödinger's Trusted Download. Intel Boot Guard

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.

Schrödinger's Trusted Download. Intel Boot Guard

Š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é:

  1. 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);
  2. 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:

Systém
Poznámka

Gigabyte GA-H170-D3H
Skylake, je tu podpora

Gigabyte GA-Q170-D3H
Skylake, je tu podpora

Gigabyte GA-B150-HD3
Skylake, je tu podpora

MSI H170A Gaming Pro
Skylake, žiadna podpora

Lenovo ThinkPad 460
Skylake, podporované, technológia povolená

Lenovo Yoga 2 Pro
Haswell, žiadna podpora

Lenovo U330p
Haswell, žiadna podpora

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.

Schrödinger's Trusted Download. Intel Boot Guard
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;
};

Schrödinger's Trusted Download. Intel Boot Guard
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;
};

Schrödinger's Trusted Download. Intel Boot Guard
Pole EntryType vám hovorí o type bloku, na ktorý tento vstup ukazuje. Poznáme niekoľko typov:

enum FIT_ENTRY_TYPES
{
	FIT_HEADER = 0,
	MICROCODE_UPDATE,
	BG_ACM,
	BIOS_INIT = 7,
	TPM_POLICY,
	BIOS_POLICY,
	TXT_POLICY,
	BG_KEYM,
	BG_IBBM
};

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];
};

Schrödinger's Trusted Download. Intel Boot Guard
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:

typedef struct KEY_MANIFEST
{
	char           Tag[8];          // ‘__KEYM__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned char  : 8;             // 1
	unsigned short : 16;            // 0Bh
	unsigned short : 16;            // 20h == hash size?
	unsigned char  IbbmKeyHash[32]; // SHA256 of an IBBM public key
	BG_RSA_ENTRY   OemRootKey;
};

typedef struct BG_RSA_ENTRY
{
	unsigned char  : 8;             // 10h
	unsigned short : 16;            // 1
	unsigned char  : 8;             // 10h
	unsigned short RsaPubKeySize;   // 800h
	unsigned long  RsaPubExp;
	unsigned char  RsaPubKey[256];
	unsigned short : 16;            // 14
	unsigned char  : 8;             // 10h
	unsigned short RsaSigSize;      // 800h
	unsigned short : 16;            // 0Bh
	unsigned char  RsaSig[256];
};

Schrödinger's Trusted Download. Intel Boot Guard
Na overenie verejného kľúča OEM Root Key si pripomíname, že používame hash poistiek SHA256, ktorý už bol prijatý od Intel ME.

Prejdime k druhému manifestu. Pozostáva z troch štruktúr:

typedef struct IBB_MANIFEST
{
	ACBP Acbp;         // Boot policies
	IBBS Ibbs;         // IBB description
	IBB_DESCRIPTORS[];
	PMSG Pmsg;         // IBBM signature
};

Prvý obsahuje niekoľko konštánt:

typedef struct ACBP
{
	char           Tag[8];          // ‘__ACBP__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 1
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned short : 16;            // x & F0h = 0
	unsigned short : 16;            // 0 < x <= 400h
};

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:

typedef struct PMSG
{
	char           Tag[8];            // ‘__PMSG__’
	unsigned char  : 8;               // 10h
	BG_RSA_ENTRY   IbbKey;
};

Schrödinger's Trusted Download. Intel Boot Guard
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 HASH_TABLE
{
	char          Tag[8];            // ‘$HASHTBL’
	unsigned long NumDxeDescriptors;
	DXE_DESCRIPTORS[];
};

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.

Schrödinger's Trusted Download. Intel Boot Guard
Obsahom nového regiónu IFWI je súbor nasledujúcich modulov:

výtlak
názov
Popis

0000 2000h
SMIP
určitú konfiguráciu platformy podpísanú predajcom

0000 6000h
RBEP
Časť kódu firmvéru Intel TXE, x86, podpísaná Intel

0001 0000h
PMCP
Časť firmvéru Intel PMC, ARC, podpísaná Intel

0002 0000h
FTPR
Časť kódu firmvéru Intel TXE, x86, podpísaná Intel

0007 B000h
UCOD
aktualizácie mikrokódu pre CPU, podpísané spoločnosťou Intel

0008 0000h
IBBP
UEFI BIOS, fázy SEC/PEI, x86, podpísané predajcom

0021 8000h
ISHC
Časť kódu firmvéru Intel ISH, x86, podpísaná dodávateľom

0025 8000h
NFTP
Časť kódu firmvéru Intel TXE, x86, podpísaná Intel

0036 1000h
IUNP
nie je známy

0038 1000h
OBBP
UEFI BIOS, fáza DXE, x86, nepodpísané

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.

Schrödinger's Trusted Download. Intel Boot Guard
2. Prečítajte si obsah flash pamäte pomocou Flash Programming Tool.

Schrödinger's Trusted Download. Intel Boot Guard
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.

Schrödinger's Trusted Download. Intel Boot Guard
Schrödinger's Trusted Download. Intel Boot Guard
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).

Schrödinger's Trusted Download. Intel Boot Guard
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.

Schrödinger's Trusted Download. Intel Boot Guard
6. Na zatvorenie výrobného režimu použite nástroj Flash Programming Tool.

Schrödinger's Trusted Download. Intel Boot Guard
7. Systém sa reštartuje a potom môžete použiť MEinfo na overenie, že FPF sú teraz naprogramované.

Schrödinger's Trusted Download. Intel Boot Guard
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).

Schrödinger's Trusted Download. Intel Boot Guard
Schrödinger's Trusted Download. Intel Boot Guard
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

  1. Š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.
  2. Je prezentovaný scenár útoku, ktorý vám umožňuje vytvoriť odinštalovateľný rootkit v systéme.
  3. Videli sme, že moderné procesory Intel sú schopné spustiť množstvo proprietárneho kódu ešte pred spustením systému BIOS.
  4. 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.

Zdroj: hab.com

Pridať komentár