Schrödingerova pouzdana čizma. Intel Boot Guard

Schrödingerova pouzdana čizma. Intel Boot Guard
Predlažemo da se ponovo spustimo na niski nivo i razgovaramo o sigurnosti računarskih platformi kompatibilnih sa firmverom x86. Ovaj put, glavni sastojak studije je Intel Boot Guard (ne treba ga brkati sa Intel BIOS Guard!) - hardverski podržana BIOS pouzdana tehnologija pokretanja koju proizvođač računarskog sistema može trajno uključiti ili isključiti u fazi proizvodnje. Pa, već znamo istraživački recept: tanko isecite implementaciju ove tehnologije obrnutim inženjeringom, opišite njenu arhitekturu, ispunite je nedokumentovanim detaljima, začinite je vektorima napada po ukusu i pomešajte. Dodajmo vatru pričom o tome kako klonirana greška u proizvodnji nekoliko proizvođača godinama omogućava potencijalnom napadaču da koristi ovu tehnologiju za kreiranje skrivenog rootkita koji ne može biti uklonjen (čak ni programer) u sistemu.

Inače, članak je zasnovan na izvještajima “On Guard for Rootkits: Intel BootGuard” sa konferencije ZeroNights 2016 i 29. sastanak DefCon Russia (obe prezentacije ovdje).

Firmver za računarsku platformu sa Intel 64 arhitekturom

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

Schrödingerova pouzdana čizma. Intel Boot Guard
Osnova je link:

  • Procesor (CPU, Central Processing Unit), koji pored glavnih jezgara 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 sa perifernim uređajima i upravljanje podsistemima. Među njima je i ozloglašeni Intel Management Engine (ME), koji takođe ima firmver (Intel ME firmware).

Laptopi, pored navedenog, zahtevaju integrisani kontroler (ACPI EC, Advanced Control and Power Interface Embedded Controller), koji je odgovoran za rad podsistema napajanja, touchpada, tastature, Fn tastera (svetlina ekrana, jačina zvuka, tastatura pozadinsko osvetljenje, itd.) i još mnogo toga. I on također ima svoj firmware.

Dakle, kombinacija gore navedenog firmvera je firmver računarske platforme (sistemski firmver), koji je pohranjen na zajedničkoj SPI fleš memoriji. Kako se korisnici ove memorije ne bi zbunili gdje neko leži, sadržaj ove memorije podijeljen je u sljedeće regije (kao što je prikazano na slici):

  • UEFI BIOS;
  • ACPI EC firmver (pojavio se poseban region sa mikroarhitekturom procesora Skylake (2015), ali u prirodi još nismo videli primere njegove upotrebe, tako da je firmver ugrađenog kontrolera i dalje deo UEFI BIOS-a);
  • Intel ME firmver;
  • 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 pouzdana čizma. Intel Boot Guard
Diferenciranje pristupa regijama (u skladu sa navedenim dozvolama) obavlja SPI master - SPI kontroler ugrađen u čipset, preko kojeg se pristupa ovoj memoriji. Ako su dozvole postavljene na vrijednosti koje preporučuje (iz sigurnosnih razloga) Intel, tada svaki SPI flash korisnik ima puni pristup (čitanje/pisanje) samo svojoj regiji. Ostali su ili samo za čitanje ili nedostupni. Poznata činjenica: na mnogim sistemima, CPU ima potpuni pristup UEFI BIOS-u i GbE, pristup samo za čitanje fleš deskriptorima i uopšte nema pristup Intel ME regionu. Zašto mnogi, a ne svi? Ono što se preporučuje je opciono. Više ćemo vam reći kasnije u članku.

Mehanizmi za zaštitu firmvera računarske platforme od modifikacija

Očigledno, firmver računarske platforme treba zaštititi od mogućeg kompromitovanja, što bi potencijalnom napadaču omogućilo da se u njemu učvrsti (preživi ažuriranja/reinstalacije OS), izvrši svoj kod u najprivilegovanijim modovima itd. A razgraničenje pristupa regionima SPI fleš memorije, naravno, nije dovoljno. Stoga se za zaštitu firmvera od modifikacija koriste različiti mehanizmi specifični za svako okruženje izvršavanja.

Dakle, Intel ME firmver je potpisan za kontrolu integriteta i autentičnosti, i provjerava ga ME kontroler svaki put kada se učita u ME UMA memoriju. O ovom procesu verifikacije smo već raspravljali u jednom od članciposvećen Intel ME podsistemu.

A ACPI EC firmver se u pravilu provjerava samo na integritet. Međutim, zbog činjenice da je ova binarna datoteka uključena u UEFI BIOS, gotovo uvijek je podložna istim zaštitnim mehanizmima koje koristi UEFI BIOS. Hajde da pričamo o njima.

Ovi mehanizmi se mogu podijeliti u dvije kategorije.

Zaštita od pisanja u UEFI BIOS regiju

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

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

Važno je napomenuti da se na određenom sistemu (u zavisnosti od dobavljača) 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 primjenom možete pročitati u ovaj članak. Za one koji su zainteresovani, preporučujemo da pročitate čitav niz članaka o bezbednosti UEFI BIOS-a CodeRush.

UEFI BIOS provjera autentičnosti

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

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

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

Intel CPU

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

  • Microcode ROM je nepromjenjiva memorija koja se ne može ponovno upisivati ​​za pohranjivanje mikrokoda. Smatra se da je mikrokod implementacija procesorskog sistema instrukcija na najjednostavnijim instrukcijama. Događa se i u mikrokodu bubice. Dakle, u BIOS-u možete pronaći binarne datoteke sa ažuriranjima mikrokoda (oni su postavljeni u vrijeme pokretanja, jer ROM ne može biti prepisan). Sadržaj ovih binarnih datoteka je šifriran, što uvelike otežava analizu (dakle, specifičan sadržaj mikrokoda je poznat samo onima koji ga razvijaju), a potpisan je radi kontrole integriteta i autentičnosti;
  • AES ključ za dešifriranje sadržaja ažuriranja mikrokoda;
  • heš RSA javnog ključa koji provjerava potpis ažuriranja mikrokoda;
  • RSA heš javnog ključa, koji provjerava potpis ACM (Authenticated Code Module) modula koda koje je razvio Intel, koje CPU može pokrenuti prije nego što se BIOS pokrene (hello mikrokod) ili tokom njegovog rada, kada se dogode neki događaji.

Intel ME

Ovom podsistemu na našem blogu je posvećen dva članci. Podsjetimo da je ovo izvršno okruženje bazirano na mikrokontroleru ugrađenom u čipset i da je najskrivenije i najprivilegovanije u sistemu.

Uprkos skrivenosti, Intel ME je takođe koren poverenja, jer ima:

  • ME ROM - nepromjenjiva memorija koja se ne može ponovo upisivati ​​(nije predviđena metoda ažuriranja), koja sadrži početni kod, kao i SHA256 heš RSA javnog ključa, koji provjerava potpis Intel ME firmvera;
  • AES ključ za pohranjivanje tajnih informacija;
  • pristup setu osigurača (FPF, Field Programmable Fuses) integrisanih u čipset za trajno skladištenje nekih informacija, uključujući informacije koje je odredio proizvođač računarskog sistema.

Intel Boot Guard 1.x

Mala izjava o odricanju odgovornosti. Brojevi verzija tehnologije Intel Boot Guard koje koristimo u ovom članku su proizvoljni i možda nemaju nikakve veze sa numeracijom koja se koristi u internoj Intel dokumentaciji. Osim toga, ovdje date informacije o implementaciji ove tehnologije dobijene su tokom obrnutog inženjeringa i mogu sadržavati netačnosti u poređenju sa specifikacijom za Intel Boot Guard, što je malo vjerovatno da će ikada biti objavljeno.

Dakle, Intel Boot Guard (BG) je hardverski podržana UEFI BIOS tehnologija provjere autentičnosti. Sudeći po njegovom malom opisu u knjizi [Otkrivena platforma Embedded Security Technology, Poglavlje Boot with Integrity, or Not Boot], radi kao pouzdani lanac pokretanja. A prva veza u njemu je kod za pokretanje (mikrokod) unutar CPU-a, koji je pokrenut RESET događajem (ne treba ga brkati sa RESET vektorom u BIOS-u!). CPU pronalazi kodni modul (Intel BG startup ACM) koji je razvio i potpisao Intel na SPI fleš memoriji, učitava ga u svoju keš memoriju, verifikuje (već je navedeno da CPU ima heš javnog ključa koji verifikuje ACM potpis ) i počinje.

Schrödingerova pouzdana čizma. Intel Boot Guard

Ovaj kodni modul je odgovoran 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. Dakle, Intel BG vam omogućava da provjerite autentičnost BIOS-a prije pokretanja OS-a (što se može izvesti pod nadzorom tehnologije Secure Boot).

Intel BG tehnologija omogućava dva načina rada (i jedan ne ometa drugi, odnosno oba moda mogu biti omogućena na sistemu, a oba isključena).

Measured Boot

U režimu mjerenog pokretanja (MB), svaka komponenta za pokretanje (počevši od ROM-a za pokretanje procesora) "mjeri" sljedeću koristeći mogućnosti Trusted Platform Module (TPM). Za one koji ne znaju, da objasnim.

TPM ima PCR (Platform Configuration Registers), koji bilježe rezultat operacije heširanja prema formuli:

Schrödingerova pouzdana čizma. Intel Boot Guard

One. trenutna PCR vrijednost zavisi od prethodne, a ovi registri se resetuju samo kada je sistem RESET.

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

Provjereno pokretanje

Najstrašnija stvar za one koji vole mijenjati UEFI BIOS je Verified Boot (VB) mod, u kojem svaka komponenta pokretanja kriptografski provjerava integritet i autentičnost sljedeće. A u slučaju greške u verifikaciji, (jedno od sljedećeg) se javlja:

  • isključivanje po isteku od 1 minute do 30 minuta (kako bi korisnik imao vremena da shvati zašto se njegov računar ne pokreće i, ako je moguće, pokušao bi vratiti BIOS);
  • trenutno gašenje (tako da korisnik nema vremena da razumije i, štoviše, da uradi);
  • nastavak rada ravnog lica (slučaj kada nema vremena za sigurnost, jer ima važnijih stvari).

Izbor akcije zavisi od specificirane Intel BG konfiguracije (odnosno, od tzv. politike primene), koju prodavac računarske platforme trajno beleži u posebno dizajniranom skladištu – osiguračima za čipset (FPF). Kasnije ćemo se detaljnije zadržati na ovoj tački.

Pored konfiguracije, dobavljač generiše dva RSA 2048 ključa i kreira dve strukture podataka (prikazane na slici):

  1. Manifest korijenskog ključa dobavljača (KEYM, OEM Root Key Manifest), koji stavlja SVN (broj sigurnosne verzije) 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 heš IBB-a, javni ključ za verifikaciju potpisa ovog manifesta i sam potpis.

SHA256 heš OEM korijenskog ključa je trajno upisan u osigurače čipseta (FPF), baš kao i Intel BG konfiguracija. Ako Intel BG konfiguracija predviđa uključivanje ove tehnologije, onda od sada na ovom sistemu samo vlasnik privatnog dijela OEM Root ključa može ažurirati BIOS (tj. moći ponovo izračunati ove manifeste), tj. dobavljač.

Schrödingerova pouzdana čizma. Intel Boot Guard

Kada pogledate sliku, odmah se javlja sumnja u potrebu tako dugačkog lanca verifikacije – mogli ste koristiti jedan manifest. Zašto komplikovati?

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

Ali ako je korijenski ključ kompromitovan (kojim je potpisan prvi manifest), neće ga biti moguće zamijeniti, nije predviđena procedura opoziva. heš javnog dijela ovog ključa se programira u FPF jednom zauvijek.

Intel Boot Guard konfiguracija

Sada pogledajmo detaljnije konfiguraciju Intel BG i proces njenog kreiranja. Ako pogledate odgovarajuću karticu u GUI alata Flash Image Tool iz Intel System Tool Kita (STK), primijetit ćete da Intel BG konfiguracija uključuje heš javnog dijela korijenskog ključa dobavljača, nekoliko nejasnih vrijednosti, i tako dalje. Intel BG profil.

Schrödingerova pouzdana čizma. 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;
};

Generalno, Intel BG konfiguracija je vrlo fleksibilan entitet. Razmotrite, na primjer, oznaku Force_Boot_Guard_ACM. Kada se obriše, ako BG startup ACM modul na SPI flešu nije pronađen, neće doći do pouzdanog pokretanja. To će biti nepovjerljivo.

Već smo pisali iznad da se politika primjene za VB način može konfigurirati tako da ako provjera ne uspije, opet će doći do nepouzdanog preuzimanja.

Ostavite ovakve stvari prodavcima...

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

Soba
Režim
Opis

0
Ne_FVME
Intel BG tehnologija je onemogućena

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

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

3
VM
oba moda su omogućena, bez isključivanja sistema

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

5
FVME
oba moda su omogućena, trenutno gašenje

Kao što je već pomenuto, proizvođač sistema mora jednom za svagda da zapiše konfiguraciju Intel BG u osigurače čipseta (FPF) - malo (prema neproverenim informacijama, samo 256 bajtova) hardversko skladište informacija unutar čipseta, koje se može programirati izvana Intelovih proizvodnih pogona (pa zato Programabilno na terenu osigurači).

Odličan je za pohranjivanje konfiguracije jer:

  • ima jednokratno programabilnu oblast za skladištenje podataka (baš tamo gde je upisana Intel BG konfiguracija);
  • samo Intel ME to može čitati i programirati.

Dakle, da bi podesio konfiguraciju za Intel BG tehnologiju na određenom sistemu, dobavljač radi sledeće tokom proizvodnje:

  1. Koristeći uslužni program Flash Image Tool (iz Intel STK), kreira sliku firmvera sa datom Intel BG konfiguracijom kao varijablama unutar Intel ME regiona (tzv. privremeno ogledalo za FPF-ove);
  2. Koristeći Flash Programming Tool (iz Intel STK), upisuje ovu sliku u SPI fleš memoriju sistema i zatvara tzv. proizvodni režim (u ovom slučaju, odgovarajuća komanda se šalje Intel ME).

Kao rezultat ovih operacija, Intel ME će predati FPF-ovima date vrijednosti iz ogledala za FPF-ove u ME regiji, postaviti dozvole u SPI flash deskriptorima na vrijednosti koje preporučuje Intel (opisane na početku članak) i izvršite RESET sistema.

Analiza implementacije Intel Boot Guard-a

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

sistem
primjedba

Gigabyte 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ška dostupna, tehnologija omogućena

Lenovo Yoga 2 Pro
Haswell, nema podrške

Lenovo U330p
Haswell, nema podrške

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

Kao primjer, uzmimo onu preuzetu iz ureda. Slika lokacije dobavljača SPI fleš memorije za Gigabyte GA-H170-D3H (verzija F4).

Intel CPU boot ROM

Prije svega, hajde da pričamo o akcijama procesora ako je omogućena Intel BG tehnologija.

Nije bilo moguće pronaći uzorke dešifrovanog mikrokoda, stoga je otvoreno pitanje kako se dole opisane radnje implementiraju (u mikrokodu ili hardveru). Ipak, činjenica da savremeni Intel procesori „mogu“ da obavljaju ove radnje je činjenica.

Nakon izlaska iz stanja RESET, procesor (u čijem je adresnom prostoru sadržaj fleš memorije već mapiran) pronalazi FIT (Tabela interfejsa firmvera). Pronalaženje je lako, pokazivač na njega je napisan na adresi FFFF FFC0h.

Schrödingerova pouzdana čizma. Intel Boot Guard
U ovom primjeru, ova adresa sadrži vrijednost FFD6 9500h. Okrećući se na ovu adresu, procesor vidi FIT tabelu, č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 pouzdana čizma. Intel Boot Guard
Iz nekog nepoznatog razloga, kontrolni zbir se ne izračunava uvijek u ovim tabelama (polje je ostavljeno null).

Preostali unosi upućuju na različite binarne datoteke koje je potrebno raščlaniti/izvršiti prije nego što se BIOS izvrši, tj. prije prelaska na stari RESET vektor (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 pouzdana čizma. Intel Boot Guard
Polje EntryType označava tip bloka na koji ovaj unos ukazuje. 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čigledno da jedan od unosa ukazuje na lokaciju Intel BG startup ACM binarne datoteke. Struktura zaglavlja ove binarne datoteke tipična je za module koda koje je razvio Intel (ACM, ažuriranja mikrokoda, Intel ME kodovi sekcije, ...).

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 pouzdana čizma. Intel Boot Guard
Procesor učitava ovu binarnu datoteku u svoju keš memoriju, provjerava i pokreće.

Intel BG startup ACM

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

  • prima od Intel ME Intel BG konfiguraciju upisanu u osigurače za čipset (FPF);
  • pronalazi KEYM i IBBM manifeste, provjerava ih.

Da bi pronašao ove manifeste, ACM takođe koristi FIT tabelu, koja ima dva tipa unosa koji ukazuju na ove strukture (pogledajte FIT_ENTRY_TYPES iznad).

Pogledajmo pobliže manifeste. U strukturi prvog manifesta vidimo nekoliko nejasnih konstanti, heš 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 pouzdana čizma. Intel Boot Guard
Za provjeru javnog ključa OEM Root ključa, podsjećamo da se koristi SHA256 hash od osigurača, koji je u ovom trenutku već primljen od Intel ME.

Pređ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. od čega se heš izračunava):

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 komada. Dakle, konkatenacija blokova na koje ukazuju ovi deskriptori (po redoslijedu samih deskriptora) je IBB. I, po pravilu, IBB je kombinacija svih modula faza SEC i PEI.

Drugi manifest završava strukturom koja sadrži IBB javni ključ (provjeren hešom SHA256 iz prvog manifesta) i potpisom ovog manifesta:

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

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

PEI verifikovana particija mora sadržavati modul koji će provjeriti ostatak BIOS-a (DXE kod). Ovaj modul već razvija IBV (Nezavisni proizvođač BIOS-a) ili sam proizvođač sistema. Jer Ispostavilo se da su nam na raspolaganju samo sistemi Lenovo i Gigabyte koji imaju Intel BG podršku, hajde da razmotrimo kod izvučen iz ovih sistema.

UEFI BIOS modul LenovoVerifiedBootPei

U slučaju kompanije Lenovo, ispostavilo se da je to LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D} modul, koji je razvio Lenovo.

Njegov posao je da potraži (po GUID-u) hash tablicu za DXE i provjeri 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 Gigabyte-a, ispostavilo se da je to modul BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, koji je razvio AMI, i stoga prisutan u bilo kojem AMI BIOS-u sa Intel BG podrškom.

Njegov algoritam rada je nešto drugačiji, međutim, svodi se 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;
}

Haš tabela {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

Hajde da ukratko govorimo o još jednoj implementaciji Intel Boot Guard-a, koja je pronađena u novijem sistemu baziranom na Intel SoC-u sa Apollo Lake mikroarhitekturom - ASRock J4205-IT.

Iako će se ova verzija koristiti samo u SoC-ovima (novi sistemi sa mikroarhitekturom procesora Kaby Lake i dalje koriste Intel Boot Guard 1.x), od velikog je interesa za istraživanje nove opcije arhitekture za platforme zasnovane na Intelovim SoC-ovima, koja je bila opipljiva promjene, na primjer:

  • BIOS i Intel ME regioni (ili bolje rečeno Intel TXE, prema Intel SoC terminologiji) su sada jedan IFWI region;
  • iako je Intel BG bio omogućen na platformi, strukture kao što su FIT, KEYM, IBBM nisu pronađene u fleš memoriji;
  • pored TXE i ISH jezgara (x86), u čipset je dodano i treće jezgro (opet ARC, usput) - PMC (Power Management Controller), povezano sa osiguranjem operativnosti podsistema napajanja i praćenjem performansi.

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

Predrasude
ime
Opis

0000 2000h
SMIP
neke konfiguracije platforme, potpisane od strane dobavljača

0000 6000h
RBEP
Intel TXE odjeljak koda firmvera, x86, potpisan od strane Intela

0001 0000h
PMCP
kod firmvera odeljak Intel PMC, ARC, potpisan od strane Intela

0002 0000h
FTPR
Intel TXE odjeljak koda firmvera, x86, potpisan od strane Intela

0007B000h
UCOD
Ažuriranja mikrokodova procesora potpisana od strane Intela

0008 0000h
IBBP
UEFI BIOS, SEC/PEI faze, x86, dobavljač je potpisao

0021 8000h
ISHC
kodni dio Intel ISH firmvera, x86, potpisan od strane dobavljača

0025 8000h
NFTP
Intel TXE odjeljak koda firmvera, x86, potpisan od strane Intela

0036 1000h
IUNP
je nepoznato

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

Tokom analize TXE firmvera postalo je očigledno da nakon RESET-a, TXE drži procesor u ovom stanju sve dok ne pripremi osnovni sadržaj adresnog prostora za CPU (FIT, ACM, RESET vektor...). Štaviše, TXE postavlja ove podatke u svoj SRAM, nakon čega privremeno daje procesoru pristup tamo i „oslobađa“ ih od RESET-a.

Na čuvanju rootkita

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

Nakon provjere sa MEinfo uslužnim programom (iz Intel STK), vidjeli smo da proizvodni način na ovim sistemima nije zatvoren, pa su osigurači za čipset (FPF) ostali u neodređenom stanju. Da, Intel BG nije ni omogućen ni onemogućen u takvim slučajevima.

Govorimo o sljedećim sistemima (u vezi sa Intel BG i što će biti opisano kasnije u članku, govorit ćemo o sistemima sa mikroarhitekturom Haswell procesora i više):

  • svi Gigabyte proizvodi;
  • svi MSI proizvodi;
  • 21 model Lenovo laptopa i 4 Lenovo modela servera.

Naravno, prijavili smo pronalazak ovim dobavljačima, kao i Intelu.

Adekvatan odgovor uslijedio je samo od lenovokoji je priznao problem i izdao zakrpu.

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

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

Ali više na stvar. Pošto 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 Windows OS (općenito, dolje opisani koraci mogu se obaviti i iz Linuxa, ako razvijete analogni Intel STK za željeni OS). Koristeći uslužni program MEinfo, provjerite da osigurači na ovom sistemu nisu programirani.

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

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

Schrödingerova pouzdana čizma. Intel Boot Guard
Schrödingerova pouzdana čizma. Intel Boot Guard
Na slici je istaknut javni dio RSA ključa, čiji će se heš programirati u osigurače čipseta zajedno sa ostatkom Intel BG konfiguracije.

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

Schrödingerova pouzdana čizma. Intel Boot Guard
5. Napišite novu sliku za flešovanje koristeći Flash Programming Tool, proverite koristeći MEinfo da ME region sada sadrži Intel BG konfiguraciju.

Schrödingerova pouzdana čizma. Intel Boot Guard
6. Koristite Flash programski alat da zatvorite proizvodni mod.

Schrödingerova pouzdana čizma. Intel Boot Guard
7. Sistem će se ponovo pokrenuti, nakon čega, koristeći MEinfo, možete provjeriti da li su FPF-ovi sada programirani.

Schrödingerova pouzdana čizma. Intel Boot Guard
Ove akcije zauvek omogućite Intel BG na ovom sistemu. Biće nemoguće poništiti radnju, što znači:

  • samo vlasnik privatnog dijela root ključa (tj. onaj koji je omogućio Intel BG) moći će ažurirati UEFI BIOS na ovom sistemu;
  • ako vratite originalni firmver na ovaj sistem, na primjer, pomoću programatora, on se neće ni uključiti (posledica politike primjene u slučaju greške u verifikaciji);
  • da biste se riješili takvog UEFI BIOS-a, morate zamijeniti čipset sa programiranim FPF-ovima sa "čistim" (tj. prelemiti čipset ako imate pristup infracrvenoj stanici za lemljenje po cijeni automobila, ili samo zamijenite matičnu ploču ).

Da biste razumeli šta takav rootkit može da uradi, potrebno je da procenite šta omogućava izvršavanje vašeg koda u UEFI BIOS okruženju. Recimo, u najprivilegovanijem načinu rada procesora - SMM. Takav rootkit može imati sljedeća svojstva:

  • da se izvršava paralelno sa operativnim sistemom (možete konfigurisati obradu generisanjem SMI prekida, koji će biti pokrenut timerom);
  • imaju sve prednosti rada u SMM modu (pun pristup sadržaju RAM-a i hardverskih resursa, tajnost od OS-a);
  • Rutkit kod se može šifrirati i dešifrirati kada se pokrene u SMM modu. Svi podaci dostupni samo u SMM modu mogu se koristiti kao ključ za šifriranje. Na primjer, heš iz skupa adresa u SMRAM-u. Da biste dobili ovaj ključ, morat ćete se popeti u SMM. A to se može uraditi 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ćava napadaču da:

  • kreirajte skriveni, neuklonjivi rootkit nepoznate svrhe u sistemu;
  • izvršite svoj kod na jednoj od jezgri čipseta unutar Intel SoC-a, odnosno na Intel ISH-u (pogledajte bliže sliku).

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

nalazi

  1. Studija je pružila tehnički opis kako tehnologija Intel Boot Guard funkcioniše. Minus nekoliko tajni u Intelovoj sigurnosti kroz model opskurnosti.
  2. Predstavljen je scenario napada koji omogućava kreiranje neuklonjivog rootkita u sistemu.
  3. Videli smo da su moderni Intel procesori u stanju da izvrše mnogo vlasničkog koda čak i pre nego što se BIOS pokrene.
  4. Platforme sa Intel 64 arhitekturom postaju sve manje pogodne za pokretanje slobodnog softvera: verifikacija hardvera, sve veći broj vlasničkih tehnologija i podsistema (tri jezgra u SoC čipsetu: x86 ME, x86 ISH i ARC PMC).

Ublažavanja

Prodavci koji namjerno ostave proizvodni način otvorenim bi ga svakako trebali zatvoriti. Za sada samo zatvaraju oči i novi sistemi Kaby Lake to pokazuju.

Korisnici mogu onemogućiti Intel BG na svojim sistemima (na koje utiče opisana ranjivost) pokretanjem Flash programskog alata sa opcijom -closemnf. Prvo, treba da se uverite (koristeći MEinfo) da konfiguracija Intel BG u ME regionu omogućava tačno isključivanje ove tehnologije nakon programiranja u FPF-ovima.

izvor: www.habr.com

Dodajte komentar