Schrödingerova čizma od povjerenja. Intel Boot Guard

Schrödingerova čizma od povjerenja. Intel Boot Guard
Predlažemo da se ponovno spustimo na nisku razinu i razgovaramo o sigurnosti firmvera x86-kompatibilnih računalnih platformi. Ovaj put, glavni sastojak istraživanja je Intel Boot Guard (nemojte ga brkati s Intel BIOS Guard!) - hardverski podržana BIOS pouzdana tehnologija pokretanja koju dobavljač računalnog sustava može trajno omogućiti ili onemogućiti u fazi proizvodnje. Pa, već znamo istraživački recept: tanko izrežite implementaciju ove tehnologije obrnutim inženjeringom, opišite njenu arhitekturu, ispunite je nedokumentiranim detaljima, začinite je vektorima napada po ukusu i pomiješajte. Dodajmo vatru pričom o tome kako klonirani bug u proizvodnji nekoliko dobavljača godinama omogućuje potencijalnom napadaču da pomoću ove tehnologije stvori skriveni rootkit koji se ne može ukloniti (čak ni programer) u sustavu.

Usput, članak se temelji na izvješćima “Na straži za Rootkits: Intel BootGuard” s konferencije ZeroNights 2016 i 29. sastanak DefCon Rusija (obje prezentacije здесь).

Firmware za računalnu platformu s Intel 64 arhitekturom

Za početak, odgovorimo na pitanje: što je firmware moderne računalne platforme s Intel 64 arhitekturom? Naravno, UEFI BIOS. Ali ovaj odgovor neće biti točan. Pogledajmo sliku koja prikazuje desktop (laptop) verziju ove arhitekture.

Schrödingerova čizma od povjerenja. Intel Boot Guard
Link je osnova:

  • Procesor (CPU, Central Processing Unit), koji osim glavnih jezgri ima ugrađenu grafičku jezgru (ne u svim modelima) i memorijski kontroler (IMC, Integrated Memory Controller);
  • Čipset (PCH, Platform Controller Hub), koji sadrži različite kontrolere za interakciju s perifernim uređajima i upravljanje podsustavima. Među njima je i notorni Intel Management Engine (ME), koji ima i firmware (Intel ME firmware).

Prijenosna računala, osim navedenog, zahtijevaju integrirani kontroler (ACPI EC, Advanced Control and Power Interface Embedded Controller), koji je zadužen za rad podsustava napajanja, touchpada, tipkovnice, Fn tipki (svjetlina ekrana, glasnoća zvuka, tipkovnica). pozadinsko osvjetljenje itd.) ) i više. A ima i svoj firmware.

Dakle, kombinacija gore navedenog firmware-a je firmware računalne platforme (firmware sustava), koji je pohranjen na zajedničkoj SPI flash memoriji. Kako se korisnici ove memorije ne bi zbunili gdje netko leži, sadržaj ove memorije podijeljen je u sljedeće regije (kao što je prikazano na slici):

  • UEFI BIOS;
  • ACPI EC firmware (zasebna regija pojavila se s mikroarhitekturom Skylake procesora (2015.), ali u divljini još nismo vidjeli primjere njegove upotrebe, tako da je ugrađeni firmware kontrolera još uvijek dio UEFI BIOS-a);
  • Intel ME firmware;
  • konfiguracija (MAC adresa, itd.) ugrađenog GbE (Gigabit Ethernet) mrežnog adaptera;
  • flash deskriptori - glavna regija flash memorije, koja sadrži pokazivače na druge regije, kao i dozvole za pristup njima.

Schrödingerova čizma od povjerenja. Intel Boot Guard
Diferencijaciju pristupa regijama (u skladu s navedenim dopuštenjima) obavlja SPI bus master - SPI kontroler ugrađen u čipset, preko kojeg se pristupa toj memoriji. Ako su dopuštenja postavljena na vrijednosti koje (iz sigurnosnih razloga) preporučuje Intel, tada svaki korisnik SPI flasha ima puni pristup (čitanje/pisanje) samo svojoj regiji. Ostali su ili samo za čitanje ili nedostupni. Poznata činjenica: na mnogim sustavima CPU ima puni pristup UEFI BIOS-u i GbE, pristup samo za čitanje flash deskriptora i uopće nema pristupa Intel ME regiji. Zašto mnogi, a ne svi? Ono što se preporučuje nije obavezno. Više ćemo vam reći kasnije u članku.

Mehanizmi za zaštitu firmware-a računalne platforme od modifikacija

Očito, firmware računalne platforme treba zaštititi od moguće kompromitacije, što bi potencijalnom napadaču omogućilo da se učvrsti u njemu (preživi ažuriranja/ponovne instalacije OS-a), izvrši njihov kod u najpovlaštenijim modovima itd. A ograničavanje pristupa regijama SPI flash memorije, naravno, nije dovoljno. Stoga se za zaštitu firmvera od modifikacija koriste različiti mehanizmi specifični za svako izvršno okruženje.

Dakle, Intel ME firmware je potpisan za kontrolu integriteta i autentičnosti, a provjerava ga ME kontroler svaki put kada se učitava u ME UMA memoriju. O ovom postupku provjere već smo govorili u jednom od članciposvećen podsustavu Intel ME.

I ACPI EC firmware, u pravilu, provjerava se samo za integritet. Međutim, zbog činjenice da je ova binarna datoteka uključena u UEFI BIOS, gotovo uvijek podliježe istim zaštitnim mehanizmima koje koristi UEFI BIOS. Razgovarajmo o njima.

Ovi se mehanizmi mogu podijeliti u dvije kategorije.

Zaštita od pisanja u UEFI BIOS regiju

  1. Fizička zaštita sadržaja SPI flash memorije kratkospojnikom za zaštitu od pisanja;
  2. Zaštita projekcije UEFI BIOS regije u CPU adresnom prostoru pomoću PRx registara čipseta;
  3. Blokiranje pokušaja pisanja u UEFI BIOS regiju generiranjem i obradom odgovarajućeg SMI prekida postavljanjem bitova BIOS_WE / BLE i SMM_BWP u registrima čipseta;
  4. Naprednija verzija ove zaštite je Intel BIOS Guard (PFAT).

Osim ovih mehanizama, dobavljači mogu razviti i implementirati vlastite sigurnosne mjere (na primjer, potpisivanje kapsula s ažuriranjima UEFI BIOS-a).

Važno je napomenuti da se na određenom sustavu (ovisno o dobavljaču) ne mogu primijeniti svi gore navedeni mehanizmi zaštite, možda se uopće ne primjenjuju ili mogu biti implementirani na ranjiv način. Više o ovim mehanizmima i situaciji s njihovom implementacijom možete pročitati u ovaj članak. Za one koji su zainteresirani, preporučujemo da pročitaju cijeli niz članaka o sigurnosti UEFI BIOS-a od CodeRush.

UEFI BIOS provjera autentičnosti

Kada govorimo o pouzdanim tehnologijama pokretanja, prvo što nam pada na pamet je Secure Boot. Međutim, arhitektonski je dizajniran za provjeru autentičnosti komponenti izvan UEFI BIOS-a (pokretački programi, učitavači itd.), a ne samog firmvera.

Stoga je Intel u SoC-ovima s Bay Trail mikroarhitekturom (2012.) implementirao hardverski neswitchable Secure Boot (Verified Boot), koji nema nikakve veze sa spomenutom Secure Boot tehnologijom. Kasnije (2013.) ovaj je mehanizam poboljšan i pod imenom Intel Boot Guard objavljen je za stolna računala s Haswell mikroarhitekturom.

Prije nego što opišemo Intel Boot Guard, pogledajmo izvršna okruženja u Intel 64 arhitekturi, koja su, u kombinaciji, korijeni povjerenja za ovu pouzdanu tehnologiju pokretanja.

Intelov procesor

Cap sugerira da je procesor glavno okruženje za izvršavanje u arhitekturi Intel 64. Zašto je to također i korijen povjerenja? Ispostavilo se da ga takvim čini posjedovanje sljedećih elemenata:

  • Microcode ROM je trajna memorija koja se ne može ponovno pisati za pohranu mikrokoda. Smatra se da je mikrokod implementacija sustava naredbi procesora na najjednostavnijim naredbama. Događa se i u mikrokodu bube. Dakle, u BIOS-u možete pronaći binarne datoteke s ažuriranjem mikrokoda (prekrivaju se prilikom podizanja sustava, jer se ROM ne može prebrisati). Sadržaj ovih binarnih datoteka je šifriran, što uvelike komplicira analizu (dakle, konkretan sadržaj mikrokoda je poznat samo onima koji ga razvijaju), i potpisan za kontrolu integriteta i autentičnosti;
  • AES ključ za dekriptiranje sadržaja ažuriranja mikrokoda;
  • hash RSA javnog ključa koji se koristi za provjeru potpisa ažuriranja mikrokoda;
  • RSA javni ključ hash, koji provjerava potpis Intelovih kodnih modula ACM (Authenticated Code Module), koje CPU može pokrenuti prije pokretanja BIOS-a (hello microcode) ili tijekom njegovog rada, kada se dogode neki događaji.

Intel ME

Ovaj podsustav u našem blogu bio je posvećen dva Članak. Podsjetimo da se ovo izvršno okruženje temelji na mikrokontroleru ugrađenom u čipset te je najskrivenije i najprivilegiranije u sustavu.

Unatoč tajnosti, Intel ME također je temelj povjerenja jer ima:

  • ME ROM - trajna memorija koja se ne može ponovno prepisivati ​​(nije dostupna metoda ažuriranja), koja sadrži početni kod, kao i SHA256 hash RSA javnog ključa, koji provjerava potpis Intel ME firmware-a;
  • AES ključ za pohranu tajnih podataka;
  • pristup skupu osigurača (FPF-ovi, Field Programmable Fuses) integriranih u čipset za trajno pohranjivanje nekih informacija, uključujući informacije koje je odredio dobavljač računalnog sustava.

Intel Boot Guard 1.x

Malo odricanje od odgovornosti. Brojevi verzija tehnologije Intel Boot Guard koje koristimo u ovom članku proizvoljni su i možda nemaju nikakve veze s numeriranjem koje se koristi u internoj Intelovoj dokumentaciji. Osim toga, ovdje dane informacije o implementaciji ove tehnologije dobivene su tijekom obrnutog inženjeringa i mogu sadržavati netočnosti u usporedbi sa specifikacijom za Intel Boot Guard, za koju je malo vjerojatno da će ikada biti objavljena.

Dakle, Intel Boot Guard (BG) je hardverski podržana UEFI BIOS tehnologija provjere autentičnosti. Sudeći prema njegovom kratkom opisu u knjizi [Otkrivena sigurnosna tehnologija ugrađena u platformu, poglavlje Pokretanje s integritetom ili bez pokretanja], radi kao pouzdani lanac pokretanja. A prva poveznica u njemu je kod za pokretanje (mikrokod) unutar CPU-a, koji se pokreće događajem RESET (nemojte ga brkati s vektorom RESET u BIOS-u!). CPU pronalazi kodni modul (Intel BG startup ACM) koji je razvio i potpisao Intel na SPI flash memoriji, učitava ga u svoju predmemoriju, provjerava (gore je već navedeno da CPU ima hash javnog ključa koji provjerava ACM potpis ) i počinje.

Schrödingerova čizma od povjerenja. Intel Boot Guard

Ovaj kodni modul odgovoran je za provjeru malog početnog dijela UEFI BIOS-a - Initial Boot Block (IBB), koji zauzvrat sadrži funkcionalnost za provjeru glavnog dijela UEFI BIOS-a. Stoga vam Intel BG omogućuje provjeru autentičnosti BIOS-a prije pokretanja OS-a (što se može izvesti pod nadzorom tehnologije Secure Boot).

Intel BG tehnologija omogućuje dva načina rada (i jedan ne ometa drugi, tj. oba načina mogu biti omogućena na sustavu ili oba mogu biti onemogućena).

Izmjerena čizma

U načinu mjerenja pokretanja (MB), svaka komponenta pokretanja (počevši od ROM-a za pokretanje CPU-a) "mjeri" sljedeću pomoću mogućnosti TPM-a (Trusted Platform Module). Za one koji nisu upućeni, da objasnim.

TPM ima PCR (registre konfiguracije platforme), koji bilježe rezultat operacije raspršivanja prema formuli:

Schrödingerova čizma od povjerenja. Intel Boot Guard

Oni. trenutna PCR vrijednost ovisi o prethodnoj, a ti se registri resetiraju samo kada se sustav RESETIRA.

Stoga, u MB modu, u nekom trenutku u vremenu, PCR-ovi odražavaju jedinstveni (unutar mogućnosti hash operacije) identifikator koda ili podataka koji su "mjereni". PCR vrijednosti se mogu koristiti u operaciji šifriranja nekih podataka (TPM_Seal). Nakon toga, njihovo dešifriranje (TPM_Unseal) bit će moguće samo ako se PCR vrijednosti nisu promijenile kao rezultat učitavanja (tj. niti jedna "izmjerena" komponenta nije modificirana).

Provjereno pokretanje

Najstrašnija stvar za one koji vole modificirati UEFI BIOS je Verified Boot (VB) način rada, u kojem svaka komponenta za pokretanje kriptografski provjerava integritet i autentičnost sljedeće. A u slučaju pogreške pri potvrdi, događa se (jedno od sljedećeg):

  • isključivanje po vremenskom ograničenju od 1 minute do 30 minuta (tako da korisnik ima vremena razumjeti zašto se njegovo računalo ne pokreće i, ako je moguće, pokušava vratiti BIOS);
  • trenutačno isključivanje (tako da korisnik nema vremena razumjeti i, štoviše, učiniti);
  • nastavak rada ravnog lica (slučaj kada nema vremena za sigurnost, jer ima važnijih stvari).

Odabir akcije ovisi o navedenoj Intel BG konfiguraciji (naime, o tzv. politici provedbe), koju prodavač računalne platforme trajno bilježi u posebno dizajniranu pohranu - osigurače čipseta (FPF). Kasnije ćemo se detaljnije zadržati na ovoj točki.

Osim konfiguracije, dobavljač generira dva ključa RSA 2048 i stvara dvije strukture podataka (prikazano na slici):

  1. Manifest korijenskog ključa dobavljača (KEYM, OEM Root Key Manifest), koji stavlja SVN (Security Version Number) ovog manifesta, SHA256 hash javnog ključa sljedećeg manifesta, RSA javni ključ (tj. javni dio korijenski ključ dobavljača) za provjeru potpisa ovog manifesta i samog potpisa;
  2. IBB Manifest (IBBM, Initial Boot Block Manifest), koji stavlja SVN ovog manifesta, SHA256 hash IBB-a, javni ključ za provjeru potpisa ovog manifesta i sam potpis.

SHA256 raspršivanje OEM korijenskog ključa trajno se zapisuje u osigurače čipseta (FPF), baš kao i konfiguracija Intel BG. Ako konfiguracija Intel BG predviđa uključivanje ove tehnologije, tada nadalje ovaj sustav samo vlasnik privatnog dijela OEM korijenskog ključa može ažurirati BIOS (tj. moći ponovno izračunati ove manifeste), tj. prodavač.

Schrödingerova čizma od povjerenja. Intel Boot Guard

Kad pogledate sliku, odmah se javljaju sumnje u potrebu za tako dugim lancem provjere - mogli ste koristiti jedan manifest. Zašto komplicirati?

Zapravo, Intel na taj način dobavljaču pruža priliku da koristi različite IBB ključeve za različite linije proizvoda i jedan kao root. Ako privatni dio IBB ključa (koji potpisuje drugi manifest) procuri, incident će utjecati samo na jednu liniju proizvoda i samo dok dobavljač ne generira novi par i omogući ponovno izračunate manifeste u sljedećem ažuriranju BIOS-a.

Ali ako je root ključ (kojim je potpisan prvi manifest) ugrožen, neće ga biti moguće zamijeniti; ne postoji postupak opoziva. hash javnog dijela ovog ključa programiran je u FPF jednom zauvijek.

Intel Boot Guard konfiguracija

Sada pobliže pogledajmo Intel BG konfiguraciju i postupak njezina stvaranja. Ako pogledate odgovarajuću karticu u GUI uslužnog programa Flash Image Tool iz Intel System Tool Kit (STK), primijetit ćete da konfiguracija Intel BG uključuje hash javnog dijela korijenskog ključa dobavljača, nekoliko nejasne vrijednosti itd. Intel BG profil.

Schrödingerova čizma od povjerenja. Intel Boot Guard

Struktura ovog profila:

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

Općenito, Intel BG konfiguracija je vrlo fleksibilna cjelina. Razmotrite, na primjer, oznaku Force_Boot_Guard_ACM. Kada se poništi, ako BG startup ACM modul na SPI flashu nije pronađen, neće doći do pouzdanog pokretanja. Bit će nepovjerljivo.

Gore smo već napisali da se politika provedbe za VB način može konfigurirati tako da ako provjera ne uspije, ponovno će doći do nepouzdanog preuzimanja.

Ovakve stvari prepustite prodavačima...

GUI uslužnog programa pruža sljedeće "gotove" profile:

Ne.
režim
Opis

0
Ne_FVME
Intel BG tehnologija onemogućena

1
VE
VB način rada omogućen, isključivanje nakon isteka vremena

2
VME
oba su načina rada omogućena (VB i MB), isključivanje po isteku vremena

3
VM
oba su načina rada omogućena, bez gašenja sustava

4
FVE
VB način rada omogućen, trenutno gašenje

5
FVME
oba načina rada omogućena, trenutno gašenje

Kao što je već spomenuto, dobavljač sustava jednom zauvijek mora zapisati Intel BG konfiguraciju u osigurače čipseta (FPF) - malu (prema neprovjerenim informacijama, samo 256 bajtova) pohranu informacija o hardveru unutar čipseta, koja se može programirati izvana Intelovih proizvodnih pogona (to je razlog zašto Programabilno na terenu osigurači).

Izvrstan je za pohranu konfiguracije jer:

  • ima prostor za pohranu podataka koji se može jednokratno programirati (upravo tamo gdje je zapisana Intel BG konfiguracija);
  • samo ga Intel ME može čitati i programirati.

Dakle, kako bi postavio konfiguraciju za Intel BG tehnologiju na određenom sustavu, dobavljač čini sljedeće tijekom proizvodnje:

  1. Korištenjem Flash Image Tool (od Intel STK), stvara sliku firmvera s danom Intel BG konfiguracijom kao varijablama unutar Intel ME regije (tzv. privremeno ogledalo za FPF-ove);
  2. Koristeći Flash Programming Tool (od Intel STK), zapisuje ovu sliku u SPI flash memoriju sustava i zatvara tzv. način proizvodnje (u ovom slučaju odgovarajuća naredba šalje se Intel ME).

Kao rezultat ovih operacija, Intel ME će FPF-ovima predati navedene vrijednosti iz zrcala za FPF-ove u ME regiji, postaviti dopuštenja u SPI flash deskriptorima na vrijednosti koje preporučuje Intel (opisano na početku članak) i izvršite RESETIRANJE sustava.

Analiza implementacije Intel Boot Guarda

Kako bismo analizirali implementaciju ove tehnologije na konkretnom primjeru, provjerili smo sljedeće sustave na tragove Intel BG tehnologije:

Sistem
Primijetiti

Gigabajt GA-H170-D3H
Skylake, postoji podrška

Gigabyte GA-Q170-D3H
Skylake, postoji podrška

Gigabyte GA-B150-HD3
Skylake, postoji podrška

MSI H170A Gaming Pro
Skylake, nema podrške

Lenovo ThinkPad 460
Skylake, podržan, tehnologija omogućena

Lenovo Yoga 2 Pro
Haswell, nema podrške

Lenovo U330p
Haswell, nema podrške

"Podrška" znači prisutnost Intel BG startup ACM modula, gore navedenih manifesta i odgovarajućeg koda u BIOS-u, tj. implementacije za analizu.

Kao primjer, uzmimo onaj preuzet iz ureda. slika prodavača SPI flash memorije za Gigabyte GA-H170-D3H (verzija F4).

Intel CPU ROM za pokretanje

Prije svega, razgovarajmo o radnjama procesora ako je omogućena Intel BG tehnologija.

Nije bilo moguće pronaći uzorke dekriptiranog mikrokoda, stoga je otvoreno pitanje kako su dolje opisane radnje implementirane (u mikrokodu ili hardveru). Unatoč tome, činjenica je da moderni Intelovi procesori "mogu" izvršiti ove radnje.

Nakon izlaska iz stanja RESET, procesor (u čijem je adresnom prostoru već mapiran sadržaj flash memorije) pronalazi FIT (Firmware Interface Table). Lako ga je pronaći, pokazivač na njega je zapisan na adresi FFFF FFC0h.

Schrödingerova čizma od povjerenja. Intel Boot Guard
U ovom primjeru ova adresa sadrži vrijednost FFD6 9500h. Okrećući se na ovu adresu, procesor vidi FIT tablicu, čiji je sadržaj podijeljen u zapise. Prvi unos je naslov sljedeće strukture:

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ödingerova čizma od povjerenja. Intel Boot Guard
Iz nekog nepoznatog razloga, kontrolni zbroj nije uvijek izračunat u ovim tablicama (polje je ostavljeno null).

Preostali unosi upućuju na različite binarne datoteke koje je potrebno analizirati/izvršiti prije pokretanja BIOS-a, tj. prije prebacivanja na naslijeđeni vektor RESET (FFFF FFF0h). Struktura svakog takvog unosa je sljedeća:

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ödingerova čizma od povjerenja. Intel Boot Guard
Polje EntryType označava tip bloka na koji ovaj unos pokazuje. Poznajemo nekoliko vrsta:

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

Sada je očito da jedan od unosa ukazuje na lokaciju Intel BG startup ACM binarne datoteke. Struktura zaglavlja ove binarne datoteke tipična je za kodne module koje je razvio Intel (ACM-ovi, ažuriranja mikrokoda, odjeljci Intel ME koda, ...).

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ödingerova čizma od povjerenja. Intel Boot Guard
Procesor učitava ovu binarnu datoteku u svoju predmemoriju, provjerava i pokreće.

Intel BG pokretanje ACM

Kao rezultat analize rada ovog ACM-a postalo je jasno da on radi sljedeće:

  • prima od Intel ME konfiguraciju Intel BG zapisanu na osigurače čipseta (FPF);
  • pronalazi KEYM i IBBM manifeste, provjerava ih.

Za pronalaženje ovih manifesta, ACM također koristi FIT tablicu, koja ima dvije vrste unosa koji ukazuju na te strukture (pogledajte FIT_ENTRY_TYPES gore).

Pogledajmo pobliže manifeste. U strukturi prvog manifesta vidimo nekoliko nejasnih konstanti, hash javnog ključa iz drugog manifesta i javni OEM korijenski ključ potpisan kao ugniježđena struktura:

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ödingerova čizma od povjerenja. Intel Boot Guard
Za provjeru javnog ključa OEM Root Keya, podsjećamo da se koristi SHA256 hash iz osigurača, koji je u ovom trenutku već primljen od Intel ME.

Prijeđimo na drugi manifest. Sastoji se od tri strukture:

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

Prvi sadrži neke konstante:

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

Drugi sadrži SHA256 hash IBB-a i broj deskriptora koji opisuju sadržaj IBB-a (tj. iz čega se izračunava hash):

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

IBB deskriptori slijede ovu strukturu, jedan za drugim. Njihov sadržaj ima sljedeći format:

typedef struct IBB_DESCRIPTOR
{
	unsigned long  : 32;
	unsigned long  BaseAddress;
	unsigned long  Size;
};

Jednostavno je: svaki deskriptor sadrži adresu/veličinu IBB dijela. Dakle, ulančavanje blokova na koje ukazuju ovi deskriptori (prema redoslijedu samih deskriptora) je IBB. I, u pravilu, IBB je kombinacija svih modula SEC i PEI faze.

Drugi manifest završava strukturom koja sadrži IBB javni ključ (potvrđen hashom SHA256 iz prvog manifesta) i potpis ovog manifesta:

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

Schrödingerova čizma od povjerenja. Intel Boot Guard
Dakle, i prije početka izvršavanja UEFI BIOS-a, procesor će pokrenuti ACM, koji će provjeriti autentičnost sadržaja odjeljaka sa SEC i PEI faznim kodom. Zatim, procesor izlazi iz ACM-a, kreće se duž RESET vektora i počinje izvršavati BIOS.

Provjerena PEI particija mora sadržavati modul koji će provjeriti ostatak BIOS-a (DXE kod). Ovaj modul već razvija IBV (Independent BIOS Vendor) ili sam dobavljač sustava. Jer Na raspolaganju su nam bili samo Lenovo i Gigabyte sustavi koji su imali Intel BG podršku; pogledajmo kod izvađen iz tih sustava.

UEFI BIOS modul LenovoVerifiedBootPei

U slučaju Lenova pokazalo se da se radi o modulu LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, koji je razvio Lenovo.

Njegov posao je tražiti (po GUID-u) hash tablicu za DXE i potvrditi 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;
};

UEFI BIOS modul BootGuardPei

U slučaju Gigabytea pokazalo se da je to modul BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, koji je razvio AMI, dakle prisutan u bilo kojem AMI BIOS-u s podrškom za Intel BG.

Njegov algoritam rada je nešto drugačiji, ali se svodi na isto:

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

Raspršena tablica {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} koju traži ima sljedeći format:

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

Recimo ukratko o još jednoj implementaciji Intel Boot Guarda, koja je pronađena u novijem sustavu temeljenom na Intel SoC-u s mikroarhitekturom Apollo Lake - ASRock J4205-IT.

Iako će se ova verzija koristiti samo u SoC-ovima (novi sustavi s mikroarhitekturom procesora Kaby Lake nastavljaju koristiti Intel Boot Guard 1.x), od velikog je interesa istraživanje nove opcije arhitekture za platforme temeljene na Intel SoC-ovima, što je postalo opipljivo promjene, na primjer:

  • BIOS i Intel ME regije (ili bolje rečeno Intel TXE, prema Intel SoC terminologiji) sada su jedna IFWI regija;
  • iako je Intel BG bio omogućen na platformi, strukture kao što su FIT, KEYM, IBBM nisu pronađene u flash memoriji;
  • uz TXE i ISH jezgre (x86), treća jezgra (usput, opet ARC) dodana je čipsetu - PMC (Power Management Controller), povezana s osiguravanjem operativnosti podsustava napajanja i nadzorom performansi.

Schrödingerova čizma od povjerenja. Intel Boot Guard
Sadržaj nove IFWI regije je skup sljedećih modula:

premještanje
ime
Opis

0000 2000 sati
SMIP
neka konfiguracija platforme, potpisana od strane dobavljača

0000 6000 sati
RBEP
Odjeljak koda firmvera Intel TXE, x86, potpisan od strane Intela

0001 0000 sati
PMCP
Odjeljak koda firmvera Intel PMC, ARC, potpisan Intel

0002 0000 sati
FTPR
Odjeljak koda firmvera Intel TXE, x86, potpisan od strane Intela

0007B000h
UCOD
Ažuriranja CPU mikrokoda potpisana od strane Intela

0008 0000 sati
IBBP
UEFI BIOS, SEC/PEI faze, x86, potpis dobavljača

0021 8000 sati
ISHC
Odjeljak Intel ISH programskog koda, x86, potpisan od strane dobavljača

0025 8000 sati
FTP
Odjeljak koda firmvera Intel TXE, x86, potpisan od strane Intela

0036 1000 sati
IUNP
je nepoznato

0038 1000 sati
OBBP
UEFI BIOS, DXE faza, x86, nepotpisano

Tijekom analize TXE firmware-a postalo je očito da nakon RESET-a, TXE drži procesor u ovom stanju dok ne pripremi osnovni sadržaj adresnog prostora za CPU (FIT, ACM, RESET vektor ...). Štoviše, TXE te podatke smješta u svoj SRAM, nakon čega procesoru privremeno omogućuje pristup tamo i “oslobađa” ga iz RESET-a.

Na straži rootkita

E, sad idemo na "vruće". Jednom smo otkrili da na mnogim sustavima SPI flash deskriptori imaju dozvole za pristup regijama SPI flash memorije tako da svi korisnici ove memorije mogu pisati i čitati bilo koju regiju. Oni. nema šanse.

Nakon provjere s uslužnim programom MEinfo (od Intel STK), vidjeli smo da način proizvodnje na ovim sustavima nije zatvoren, stoga su osigurači čipseta (FPF) ostavljeni u neodređenom stanju. Da, Intel BG nije ni omogućen ni onemogućen u takvim slučajevima.

Riječ je o sljedećim sustavima (što se tiče Intel BG i onoga što će biti opisano kasnije u članku, govorit ćemo o sustavima s Haswell procesorskom mikroarhitekturom i višom):

  • svi Gigabyte proizvodi;
  • svi MSI proizvodi;
  • 21 model prijenosnih računala Lenovo i 4 modela poslužitelja Lenovo.

Naravno, otkriće smo prijavili ovim dobavljačima, kao i Intelu.

Adekvatan odgovor uslijedio je tek od Lenovokoji je priznao problem i izdao zakrpu.

Gigabyte Čini se da su prihvatili informaciju o ranjivosti, ali nisu ništa komentirali.

Komunikacija sa MSI potpuno zaustavljen na naš zahtjev da pošaljemo naš javni PGP ključ (kako bismo im poslali šifrirano sigurnosno savjetovanje). Izjavili su da su "proizvođač hardvera i ne proizvode PGP ključeve."

Ali još bitnije. Budući da su osigurači ostavljeni u nedefiniranom stanju, korisnik (ili napadač) ih može sam programirati (najteže je pronađite Intel STK). Ovo zahtijeva sljedeće korake.

1. Pokrenite sustav Windows OS (općenito, dolje opisani koraci mogu se izvesti i iz Linuxa, ako razvijete analogni Intel STK za željeni OS). Pomoću uslužnog programa MEinfo provjerite da osigurači na ovom sustavu nisu programirani.

Schrödingerova čizma od povjerenja. Intel Boot Guard
2. Pročitajte sadržaj flash memorije koristeći Flash programski alat.

Schrödingerova čizma od povjerenja. Intel Boot Guard
3. Otvorite očitanu sliku pomoću bilo kojeg alata za uređivanje UEFI BIOS-a, napravite potrebne promjene (implementirajte rootkit, na primjer), stvorite/uredite postojeće KEYM i IBBM strukture u ME regiji.

Schrödingerova čizma od povjerenja. Intel Boot Guard
Schrödingerova čizma od povjerenja. Intel Boot Guard
Javni dio RSA ključa istaknut je na slici, čiji će hash biti programiran u osigurače čipseta zajedno s ostatkom Intel BG konfiguracije.

4. Koristeći Flash Image Tool, izgradite novu firmware sliku (postavljanjem Intel BG konfiguracije).

Schrödingerova čizma od povjerenja. Intel Boot Guard
5. Napišite novu sliku za bljeskanje pomoću Flash Programming Tool-a, potvrdite pomoću MEinfo da ME regija sada sadrži Intel BG konfiguraciju.

Schrödingerova čizma od povjerenja. Intel Boot Guard
6. Upotrijebite Flash programski alat za zatvaranje načina proizvodnje.

Schrödingerova čizma od povjerenja. Intel Boot Guard
7. Sustav će se ponovno pokrenuti, nakon čega, koristeći MEinfo, možete provjeriti jesu li FPF-ovi sada programirani.

Schrödingerova čizma od povjerenja. Intel Boot Guard
Ove radnje zauvijek omogućiti Intel BG na ovom sustavu. Bit će nemoguće poništiti radnju, što znači:

  • samo vlasnik privatnog dijela korijenskog ključa (tj. onaj koji je omogućio Intel BG) moći će ažurirati UEFI BIOS na ovom sustavu;
  • ako ovom sustavu vratite originalni firmware, na primjer, pomoću programatora, on se neće ni uključiti (posljedica politike provedbe u slučaju pogreške verifikacije);
  • da biste se riješili takvog UEFI BIOS-a, trebate zamijeniti čipset s programiranim FPF-ovima "čistim" (tj. ponovno zalemiti čipset ako imate pristup infracrvenoj stanici za lemljenje po cijeni automobila ili samo zamijeniti matičnu ploču ).

Da biste razumjeli što takav rootkit može učiniti, trebate procijeniti što omogućuje izvršavanje vašeg koda u UEFI BIOS okruženju. Recimo, u najprivilegiranijem načinu rada procesora - SMM. Takav rootkit može imati sljedeća svojstva:

  • izvršavati se paralelno s OS-om (možete konfigurirati obradu generiranjem SMI prekida, koji će biti pokrenut mjeračem vremena);
  • imaju sve prednosti SMM načina (puni pristup sadržaju RAM-a i hardverskih resursa, tajnost od OS-a);
  • Kod rootkita može se šifrirati i dešifrirati kada se pokrene u SMM modu. Svi podaci dostupni samo u SMM načinu rada mogu se koristiti kao ključ za šifriranje. Na primjer, hash iz skupa adresa u SMRAM-u. Da biste dobili ovaj ključ, morat ćete se popeti u SMM. A to se može učiniti na dva načina. Pronađite RCE u SMM kodu i iskoristite ga ili dodajte svoj vlastiti SMM modul u BIOS, što je nemoguće jer smo omogućili Boot Guard.

Dakle, ova ranjivost omogućuje napadaču da:

  • stvoriti skriveni rootkit nepoznate namjene koji se ne može ukloniti u sustavu;
  • izvršite svoj kod na jednoj od jezgri čipseta unutar Intel SoC-a, naime na Intel ISH-u (pogledajte pobliže sliku).

Schrödingerova čizma od povjerenja. Intel Boot Guard
Schrödingerova čizma od povjerenja. Intel Boot Guard
Iako mogućnosti podsustava Intel ISH još nisu istražene, čini se da je to zanimljiv vektor napada za Intel ME.

Zaključci

  1. Studija je pružila tehnički opis rada tehnologije Intel Boot Guard. Minus nekoliko tajni u Intelovom modelu sigurnosti kroz opskurnost.
  2. Predstavljen je scenarij napada koji vam omogućuje stvaranje rootkita koji se ne može instalirati u sustavu.
  3. Vidjeli smo da moderni Intel procesori mogu izvršiti mnogo vlasničkog koda čak i prije pokretanja BIOS-a.
  4. Platforme s Intel 64 arhitekturom postaju sve manje prikladne za pokretanje slobodnog softvera: provjera hardvera, sve veći broj vlasničkih tehnologija i podsustava (tri jezgre u SoC čipsetu: x86 ME, x86 ISH i ARC PMC).

Ublažavanja

Prodavači koji namjerno ostave otvoren način proizvodnje trebali bi ga svakako zatvoriti. Zasad samo zatvaraju oči i to pokazuju novi sustavi Kaby Lake.

Korisnici mogu onemogućiti Intel BG na svojim sustavima (na koje utječe opisana ranjivost) pokretanjem Flash Programming Tool-a s opcijom -closemnf. Prvo biste se trebali uvjeriti (pomoću MEinfo) da konfiguracija Intel BG u ME regiji omogućuje točno isključivanje ove tehnologije nakon programiranja u FPF-ovima.

Izvor: www.habr.com

Dodajte komentar