
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 (ne miješati s Intel BIOS Guard!) – hardverski podržana tehnologija pouzdano učitavanje BIOS-a, koju proizvođač računalnog sustava može trajno uključiti ili isključiti u fazi proizvodnje. A recept istraživanja nam je već poznat: fino narezati obrnutim inženjeringom implementaciju ove tehnologije, opisati njezinu arhitekturu, napuniti nedokumentiranim detaljima, dodati po ukusu vektore napada i izmiješati. Podbacimo vatru pričom o tome kako godinama klonirana pogreška u proizvodnji nekoliko proizvođača omogućava potencijalnom napadaču da iskoristi ovu tehnologiju za kreiranje u sustavu neizbrisivog (čak ni programatorom) skrivenog rootkita.
Usput, u osnovi članka su izvještaji "Na straži rootkita: Intel BootGuard" s konferencije i 29. sastanka (obe prezentacije ).
Firmver računalne platforme s arhitekturom Intel 64
Za početak, odgovorimo na pitanje: što je firmver moderne računalne platforme s arhitekturom Intel 64? Naravno, UEFI BIOS. No takav odgovor neće biti točan. Pogledajmo sliku koja prikazuje desktop (laptop) varijantu ove arhitekture.

Osnova je povezanost:
- Procesora (CPU, Central Processing Unit), koji, osim osnovnih jezgri, uključuje grafičku jezgru (ne u svim modelima) i integrirani memorijski kontroler (IMC, Integrated Memory Controller);
- Čipseta (PCH, Platform Controller Hub), koji sadrži razne kontrolere za komunikaciju s perifernim uređajima i upravljanje podsustavima. Među njima je poznati Intel Management Engine (ME), koji također ima firmver (Intel ME firmware).
Laptopi, osim navedenog, podrazumijevaju prisutnost ugrađenog kontrolera (ACPI EC, Advanced Control and Power Interface Embedded Controller), koji je odgovoran za rad sustava napajanja, touchpada, tipkovnice, Fn tipki (svjetlost ekrana, glasnoća, pozadinsko osvjetljenje tipkovnice itd.) i ostalog. I on također ima svoj firmver.
Dakle, kombinacija gore navedenih firmvera čini firmver računalne platforme (system firmware), koji se pohranjuje u zajedničkoj SPI flash memoriji. Kako se korisnici te memorije ne bi zbunjivali, sadržaj te memorije podijeljen je na sljedeće regije (kao što je prikazano na slici):
- UEFI BIOS;
- firmver ACPI EC (odvojena regija pojavila se s procesorskom mikroarkitekturom Skylake (2015. godina), no u praksi još nismo vidjeli primjere njegove upotrebe, tako da firmver ugrađenog kontrolera i dalje pripada UEFI BIOS-u);
- firmver Intel ME;
- konfiguracija (MAC adresa itd.) ugrađenog mrežnog adaptera GbE (Gigabit Ethernet);
- flash deskriptor (Flash Descriptors) – glavna regija flash memorije koja sadrži pokazivače na ostale regije, kao i dozvole za pristup njima.

Razgraničenjem pristupa regijama (u skladu s postavljenim dozvolama) bavi se master SPI sabirnice – ugrađeni SPI kontroler u chipsetu, kroz koji se i ostvaruje pristup toj memoriji. Ako su dozvole postavljene na preporučene (iz sigurnosnih razloga) vrijednosti od strane Intela, svaki korisnik SPI flash memorije ima pun pristup (čitanje/upis) samo svojoj regiji. Ostale su ili dostupne samo za čitanje, ili nisu dostupne. Poznato je da na mnogim sustavima CPU ima pun pristup UEFI BIOS-u i GbE, pristup samo za čitanje flash deskriptorima, dok regiji Intel ME nema pristupa uopće. Zašto na mnogim, a ne na svim? Ono što se preporučuje nije nužno obavezno. O tome ćemo detaljnije govoriti u nastavku članka.
Mehanizmi zaštite firmvera računalne platforme od modifikacije
Očito je da firmver računalne platforme treba zaštititi od mogućih kompromitacija koje bi potencijalnom napadaču omogućile da se u njemu učvrsti (preživi ažuriranja/reinstalacije OS-a), izvršava svoj kod u najprivilegiranijim režimima itd. I razgraničenje pristupa regijama SPI flash memorije, naravno, nije dovoljno. Stoga se za zaštitu firmvera od modifikacija primjenjuju različiti mehanizmi, specifični za svako okruženje izvršenja.
Tako je firmver Intel ME potpisan za kontrolu cjelovitosti i autentičnosti, i provjerava se od strane ME kontrolera pri svakom učitavanju u memoriju ME UMA. Ovaj proces verifikacije već smo razmatrali u jednom od , posvećena Intel ME podsustavu.
A ACPI EC firmware se obično provjerava samo na cjelovitost. Međutim, budući da je ovaj binarni dio uključen u UEFI BIOS, gotovo uvijek na njega se primjenjuju isti mehanizmi zaštite koji koristi UEFI BIOS. O njima ćemo govoriti.
Ovi mehanizmi možemo podijeliti u dvije kategorije.
Zaštita od pisanja u UEFI BIOS regiju
- Fizička zaštita sadržaja SPI flash memorije putem write-protect jumper-a;
- Zaštita projekcije UEFI BIOS regije u adresnom prostoru CPU-a putem PRx registara čipseta;
- Blokiranje pokušaja pisanja u UEFI BIOS regiju generiranjem i obradom odgovarajuće SMI prekida podešavanjem bitova BIOS_WE/BLE i SMM_BWP u registrima čipseta;
- Naprednija varijanta te zaštite je Intel BIOS Guard (PFAT).
Pored ovih mehanizama, vendorii mogu razvijati i primjenjivati vlastite sigurnosne mjere (na primjer, potpisivanje kapsula s ažuriranjima UEFI BIOS-a).
Važno je napomenuti da na konkretnoj sistemu (ovisno o vendoru) možda neće biti primijenjeni svi navedeni mehanizmi zaštite, mogu uopće biti neprimijenjeni ili mogu biti ranjivo implementirani. Više o ovim mehanizmima i situaciji s njihovom implementacijom možete pročitati u . Preporučujemo zainteresiranima da se upoznaju sa cijelim ciklusom članaka o sigurnosti UEFI BIOS-a od .
Verifikacija autentičnosti UEFI BIOS-a
Kada govorimo o tehnologijama pouzdane podizanja sustava, prvo što nam pada na pamet je Secure Boot. Međutim, arhitektonski je osmišljen za provjeru autentičnosti vanjskih, u odnosu na UEFI BIOS, komponenti (drivera, boot loader-a itd.), a ne same firmware.
Zato je Intel u SoC-ovima s mikroarhitekturom Bay Trail (2012. godine) implementirao hardverski nenadomjestivi Secure Boot (Verified Boot), koji nema nikakve veze s ranije spomenutom tehnologijom Secure Boot. Kasnije (2013. godine) ovaj mehanizam je unaprijeđen i pod imenom Intel Boot Guard predstavljen za desktop računala s mikroarhitekturom Haswell.
Prije nego opišemo Intel Boot Guard, razjasnimo medije izvršavanja u Intel 64 arhitekturi, koji su, uz to, korijeni povjerenja za ovu tehnologiju pouzdane podizanja sustava.
Intel CPU
Kapetan sugerira da je procesor osnovni medij izvršavanja u Intel 64 arhitekturi. Zašto je on korijen povjerenja? Ispostavilo se da on postaje korijen povjerenja zahvaljujući sljedećim elementima:
- Microcode ROM — nevolatilna, neprepisiva memorija za pohranu mikrokoda. Smatra se da je mikrokod implementacija sustava instrukcija procesora u najjednostavnijim uputama. U mikrokodu također dolaze . Tako se u BIOS-u mogu pronaći binarni datoteke s ažuriranjima mikrokoda (učitavaju se tijekom pokretanja, budući da ROM ne može biti prepisan). Sadržaj tih binarnih datoteka je šifriran, što znatno otežava analizu (zato konkretan sadržaj mikrokoda poznat je samo onima koji ga razvijaju), i potpisan, radi provjere cjelovitosti i autentičnosti;
- AES ključ za dešifriranje sadržaja ažuriranja mikrokoda;
- hash javnog RSA ključa kojim se provjerava potpis ažuriranja mikrokoda;
- hash javnog RSA ključa kojim se provjerava potpis kodnih modula ACM (Authenticated Code Module) razvijenih od strane tvrtke Intel, koje CPU može pokrenuti prije izvršavanja BIOS-a (pozdrav mikrokodu) ili tijekom njegovog rada, u slučaju određenih događaja.
Intel ME
Ova podskupina u našem blogu bila je posvećena . Podsjetimo, ova izvršna okolina temelji se na mikrokontroleru ugrađenom u čipset i najskrivenija je i privilegirana u sustavu.
Unatoč svojoj skrivenosti, Intel ME također je korijenski oslonac povjerenja, jer ima:
- ME ROM — nevolatilna, neprepisiva memorija (način ažuriranja nije predviđen), koja sadrži inicijalni kod, kao i SHA256 hash javnog RSA ključa kojim se provjerava potpis Intel ME firmware-a;
- AES ključ za pohranu povjerljivih informacija;
- pristup integriranom u čipset skupu fuzija (FPFs, Field Programmable Fuses) za trajno pohranjivanje nekih informacija, uključujući i onih koje odredi dobavljač računalnog sustava.
Intel Boot Guard 1.x
Mali odricanje. Brojevi verzija tehnologije Intel Boot Guard, kojima se služimo u ovom članku, su uvjetni i možda nemaju nikakve veze s brojevima koji se koriste u internoj dokumentaciji tvrtke Intel. Također, informacije o implementaciji ove tehnologije navedene ovdje prikupljene su tijekom reverznog inženjerstva i mogu sadržavati netočnosti u odnosu na specifikaciju Intel Boot Guard koja vjerojatno nikada neće biti objavljena.
Dakle, Intel Boot Guard (BG) je tehnologija hardverske podrške za verifikaciju autentičnosti UEFI BIOS-a. Sudеći po njenom kratkom opisu u knjizi [Platform Embedded Security Technology Revealed, poglavlje Boot with Integrity, or Not Boot], funkcioniše kao lanac pouzdane podizanja. I prvi članak u njemu je podizani kod (mikrokod) unutar CPU-a, koji se aktivira događajem RESET (ne mešati sa RESET-vektorom u BIOS-u!). CPU pronalazi kodni modul (Intel BG startup ACM) razvijen i potpisan od strane kompanije Intel u SPI flash memoriji, učitava ga u svoj cache, verifikuje (već je pomenuto da CPU ima heš javnog ključa kojim se proverava potpis ACM) i pokreće.

Ovaj kodni modul je odgovoran za verifikaciju malog početnog dela UEFI BIOS-a - Initial Boot Block (IBB), koji, zauzvrat, sadrži funkcionalnost za verifikaciju glavnog dela UEFI BIOS-a. Tako, Intel BG omogućava da se sa sigurnošću proveri autentičnost BIOS-a pre učitavanja operativnog sistema (koji može raditi pod nadzorom tehnologije Secure Boot).
Tehnologija Intel BG predviđa dva režima rada (pri čemu jedan ne ometa drugi, tj. oba režima se mogu uključiti u sistemu, ili oba mogu biti isključena).
Measured Boot
U režimu Measured Boot (MB) svaki podizani komponent (počevši od CPU boot ROM-a) "meri" sledeći, koristeći mogućnosti TPM-a (Trusted Platform Module). Za one koji nisu upoznati, da razjasnimo.
TPM ima PCR-ove (Platform Configuration Registers), u koje se zapisuje rezultat heširanja prema formuli:

Tj. trenutno vrednost PCR zavisi od prethodne, pri čemu se podaci iz registara resetuju samo prilikom RESET-a sistema.
Tako, u režimu MB, u određenom trenutku PCR-ovi odražavaju jedinstveni (u okviru mogućnosti operacije heširanja) identifikator koda ili podataka koji su "mereni". Vrednosti PCR mogu se koristiti prilikom šifriranja nekih podataka (TPM_Seal). Nakon toga, njihovo dešifrovanje (TPM_Unseal) biće moguće samo ako se vrednosti PCR prilikom podizanja nisu promenile (tj. nijedan "mereni" komponent nije izmenjen).
Verified Boot
Najstrašniji deo za ljubitelje modifikovanja UEFI BIOS-a je režim Verified Boot (VB), pri čemu svaki podizani komponent kriptografski proverava integritet i autentičnost sledećeg. A u slučaju greške u verifikaciji, dešava se (jedno od):
- isključivanje po vremenskom ograničenju od 1 min do 30 min (tako da korisnik ima vremena shvatiti zašto mu se računar ne pokreće i, ako je moguće, pokušati obnoviti BIOS);
- trenutno isključivanje (tako da korisnik ne shvati ništa i, pogotovo, ništa ne može učiniti);
- nastavak rada s nevjerojatnim izgledom (situacija kada nije važno sigurnost, jer postoje važniji poslovi).
Odabir radnje ovisi o zadanoj konfiguraciji Intel BG (odnosno, o takozvanoj enforcement policy), koja se trajno zapisuje od strane proizvođača računalne platforme u posebno predviđenu memoriju – fuzije čipseta (FPF-ovi). O ovom ćemo se detaljnije pozabaviti kasnije.
Osim konfiguracije, proizvođač generira dva RSA ključa 2048 i stvara dvije strukture podataka (prikazano na slici):
- Manifest korijenskog ključa proizvođača (KEYM, OEM Root Key Manifest), koji sadrži SVN (Security Version Number) ovog manifesta, SHA256 hash javnog ključa sljedećeg manifesta, javni RSA ključ (tj. javni dio korijenskog ključa proizvođača) za provjeru potpisa ovog manifesta i sam potpis;
- Manifest IBB (IBBM, Initial Boot Block Manifest), koji sadrži SVN ovog manifesta, SHA256 hash IBB-a, javni ključ za provjeru potpisa ovog manifesta i sam potpis.
SHA256 hash javnog ključa OEM Root Key trajno se zapisuje u fuzije čipseta (FPF-ovi), kao i konfiguracija Intel BG. Ako konfiguracija Intel BG omogućuje uključivanje ove tehnologije, tada na ovom sustavu ažurirati BIOS (tj. imati mogućnost ponovnog izračunavanja ovih manifestacija) može samo vlasnik privatnog dijela OEM Root Key, tj. proizvođač.

Pogledajuci sliku, odmah se javljaju sumnje u potrebu za tako dugim lancem verifikacije – moglo se koristiti jedan manifest. Zašto komplicirati?
U stvarnosti, kompanija Intel na ovaj način omogućuje proizvođaču korištenje različitih IBB ključeva za različite linije svojih proizvoda i jedan – kao korijenski. Ako dođe do curenja privatnog dijela IBB ključa (s kojim se potpisuje drugi manifest), incident će se odnositi samo na jednu liniju proizvoda i to samo dok proizvođač ne generira novi par i ne uključi ponovno izračunate manifeste u sljedećem ažuriranju BIOS-a.
No, ako bude kompromitiran korijenski ključ (s kojim se potpisuje prvi manifest), neće ga biti moguće zamijeniti, procedure revokacije nisu predviđene jer se heš javnog dijela ovog ključa programira u FPF-ove jednom zauvijek.
Intel Boot Guard konfiguracija
Sada ćemo se detaljnije osvrnuti na konfiguraciju Intel BG i proces njezine izrade. Ako pogledate odgovarajuću karticu u GUI alatu Flash Image Tool iz kompleta Intel System Tool Kit (STK), možete primijetiti da konfiguracija Intel BG uključuje heš javnog dijela korijenskog ključa dobavljača, par nejasnih vrijednosti i takozvani profil Intel BG.

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 – ne radi ništa
// 01b – isključivanje s vremenskim ograničenjem
// 11b – odmah isključivanje
unsigned long : 26;
};Uopće, konfiguracija Intel BG je vrlo fleksibilna. Razmotrimo, na primjer, oznaku Force_Boot_Guard_ACM. Kada je ona isključena, ako modul BG startup ACM na SPI flash memoriji nije pronađen, nećemo imati pouzdano pokretanje. Bit će nepouzdano.
Već smo spomenuli da policy izvršenja za VB način rada može biti postavljen tako da u slučaju pogreške verifikacije ponovo dođe do nepouzdanog pokretanja.
Ostaviti takve stvari na odluku dobavljača...
GUI alat predviđa sljedeće "gotove" profile:
Broj
Način
Opis
0
No_FVME
tehnologija Intel BG isključena
1
VE
uključen VB način rada, isključivanje s vremenskim ograničenjem
2
VME
uključena oba načina (VB i MB), isključivanje s vremenskim ograničenjem
3
VM
uključena oba načina, bez isključivanja sustava
4
FVE
uključen VB način rada, odmah isključivanje
5
FVME
uključena oba načina, odmah isključivanje
Kako je već rečeno, konfiguracija Intel BG mora biti jednom zauvijek napisana od strane dobavljača sustava u fuzije čipseta (FPF-ove) – mali (prema nepotvrđenim informacijama, samo 256 bajtova) hardverski skladište informacija unutar čipseta, koje se može programirati izvan proizvodnih kapaciteta kompanije Intel (zato, upravo Field Programmable Fuses).
Odlično je za pohranu konfiguracije, jer:
- ima one-time-programmable područje za pohranu podataka (upravo tamo gdje se pohranjuje konfiguracija Intel BG);
- može ga čitati i programirati samo Intel ME.
Dakle, da bi se konfiguracija za Intel BG tehnologiju postavila na određenom sustavu, proizvođač tokom proizvodnje radi sljedeće:
- Pomoću alata Flash Image Tool (iz Intel STK) stvara firmware sliku s zadatom Intel BG konfiguracijom u obliku varijabli unutar Intel ME regije (tzv. privremeni ogledalo za FPF-ove);
- Pomoću alata Flash Programming Tool (iz Intel STK) zapisuje ovu sliku na SPI flash memoriju sustava i zatvara tzv. manufacturing mode (prilikom toga, šalje se odgovarajuća komanda u Intel ME).
Kao rezultat ovih operacija, Intel ME će potvrditi zadane vrijednosti iz ogledala za FPF-ove u ME regiji, postaviti dozvole u SPI flash-deskripcijama na preporučene vrijednosti tvrtke Intel (opisana u početku članka) i izvršiti RESET sustava.
Analiza implementacije Intel Boot Guard
S ciljem analize implementacije ove tehnologije na konkretnoj primjeru, provjerili smo sljedeće sustave na prisutnost tragova Intel BG tehnologije:
Sustav
Napomena
Gigabyte GA-H170-D3H
Skylake, podrška je prisutna
Gigabyte GA-Q170-D3H
Skylake, podrška je prisutna
Gigabyte GA-B150-HD3
Skylake, podrška je prisutna
MSI H170A Gaming Pro
Skylake, podrška nije prisutna
Lenovo ThinkPad 460
Skylake, podrška je prisutna, tehnologija je omogućena
Lenovo Yoga 2 Pro
Haswell, podrška nije prisutna
Lenovo U330p
Haswell, podrška nije prisutna
Pod "podrškom" podrazumijeva se prisutnost Intel BG startup ACM modula, gore spomenutih manifestacija i odgovarajuće logike u BIOS-u, tj. implementacije za analizu.
Kao primjer, uzmimo preuzetu s službene stranice proizvođača sliku SPI flash memorije za Gigabyte GA-H170-D3H (verzija F4).
Intel CPU boot ROM
Prvo, razgovarajmo o radnjama procesora u slučaju da je Intel BG tehnologija uključena.
Uzoraka dešifriranog mikrokoda nismo uspjeli pronaći, stoga je pitanje kako su opisane radnje implementirane (u mikrokodu ili hardverski) otvoreno. Ipak, činjenica je da moderni Intel procesori "posjeduju" sposobnost provođenja ovih radnji.
Nakon izlaska iz stanja RESET, procesor (u čije je adresno područje već mapirana sadržina flash memorije) pronalazi FIT tablicu (Firmware Interface Table). Lako je pronaći, pokazivač na nju je zapisan na adresi FFFF FFC0h.

U ovom primjeru, na ovoj adresi se nalazi vrijednost FFD6 9500h. Kada se pozove na ovu adresu, procesor vidi FIT tablicu, čiji je sadržaj podijeljen na zapise. Prvi zapis je header sljedeće strukture:
typedef struct FIT_HEADER
{
char Tag[8]; // ‘_FIT_ ’
unsigned long NumEntries; // uključujući FIT header unos
unsigned short Version; // 1.0
unsigned char EntryType; // 0
unsigned char Checksum;
}; 
Iz nepoznatog razloga, checksum nije uvijek izračunat u ovim tablicama (polje ostavljeno na nuli).
Ostali unosi ukazuju na različite binarne datoteke koje je potrebno parsirati/izvršiti prije izvršavanja BIOS-a, tj. prije prijelaza na legacy 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;
}; 
Polje EntryType označava tip bloka na koji se ovaj unos odnosi. Poznato nam je nekoliko tipova:
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 binarne datoteke Intel BG startup ACM. Struktura zaglavlja ove binarne datoteke tipična je za kodne module (ACM-ove, ažuriranje mikro-koda, kodne dijelove Intel ME, ...) koje razvija kompanija Intel.
typedef struct BG_ACM_HEADER
{
unsigned short ModuleType; // 2
unsigned short ModuleSubType; // 3
unsigned long HeaderLength; // u dwordovima
unsigned long : 32;
unsigned long : 32;
unsigned long ModuleVendor; // 8086h
unsigned long Date; // u BCD formatu
unsigned long TotalSize; // u dwordovima
unsigned long unknown1[6];
unsigned long EntryPoint;
unsigned long unknown2[16];
unsigned long RsaKeySize; // u dwordovima
unsigned long ScratchSize; // u dwordovima
unsigned char RsaPubMod[256];
unsigned long RsaPubExp;
unsigned char RsaSig[256];
}; 
Procesor učitava ovu binarnu datoteku u svoju predmemoriju, verificira je i pokreće.
Intel BG startup ACM
Iz analize rada ovog ACM-a postalo je jasno da radi sljedeće:
- prima od Intel ME konfiguraciju Intel BG, zapisanu u fusnima čipseta (FPF-ovi);
- nalazi manifeste KEYM i IBBM, verificira ih.
Za pronalaženje ovih manifestacija, ACM također koristi FIT tablicu, u kojoj su dodijeljena dva tipa unosa za označavanje podataka strukture (vidi FIT_ENTRY_TYPES iznad).
U ovom trenutku, detaljnije ćemo se posvetiti manifestima. U strukturi prvog manifesta vidimo nekoliko nejasnih konstanti, hash javnog ključa iz drugog manifesta i javni ključ OEM Root Key s potpisom u obliku ugniježdene strukture:
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];
}; 
Za verifikaciju javnog ključa OEM Root Key, podsjećamo, koristi se SHA256 hash iz fuzija, koji je u tom trenutku već dobiven 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
};U prvom se nalaze neki konstanti:
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
};U drugom se nalazi SHA256 hash IBB i broj deskriptora koji opisuju sadržaj IBB (tj. ono od čega se računa 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;
};Deskriptor IBB 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;
};Sve je jednostavno: svaki deskriptor sadrži adresu/veličinu dijela IBB. Tako, konkatencija blokova na koje upućuju ti deskriptori (u redoslijedu rasporednosti samih deskriptora) čini IBB. I, obično, IBB je skup svih modula faza SEC i PEI.
Drugi manifest završava strukturom koja sadrži javni ključ IBB (verificira se SHA256 hashom iz prvog manifesta) i potpisom ovog manifesta:
typedef struct PMSG
{
char Tag[8]; // ‘__PMSG__’
unsigned char : 8; // 10h
BG_RSA_ENTRY IbbKey;
}; 
Prije nego što počne izvršavanje UEFI BIOS-a, procesor će pokrenuti ACM koji će provjeriti autentičnost sadržaja odjeljaka sa SEC i PEI kodom. Zatim procesor izlazi iz ACM-a, prelazi na RESET vektor i počinje izvršavati BIOS.
Verificirani PEI odjeljak mora sadržavati modul koji će provjeriti ostatak BIOS-a (DXE kod). Ovaj modul razvija IBV (Nezavisni BIOS dobavljač) ili sam dobavljač sustava. S obzirom na to da su nam najviše podržani Intel BG sustavi bili samo Lenovo i Gigabyte, razmotrit ćemo kod izvučen iz tih sustava.
UEFI BIOS modul LenovoVerifiedBootPei
U slučaju Lenova, to je bio modul LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, razvijen od strane Lenova.
Njegova funkcija je pretraživanje (prema GUID-u) hash tablice za DXE i verifikacija DXE-a.
if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
if (!FindHashTable())
return EFI_NOT_FOUND;
if (!VerifyDxe())
return EFI_SECURITY_VIOLATION;
}Hash tablica {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} ima sljedeći format:
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, to je bio modul BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, razvijen od strane AMI, stoga je prisutan u svakom AMI BIOS-u s podrškom za Intel BG.
Njegov algoritam rada je malo 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;
}Hash 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
Ukratko, još ćemo govoriti o jednoj implementaciji Intel Boot Guard koja je pronađena u novijem sustavu temeljenom na Intel SoC s mikroarhitekturom Apollo Lake — ASRock J4205-IT.
Iako će se ova verzija primjenjivati samo u SoC-ima (nove sustave s procesorima mikroarhitekture Kaby Lake i dalje koriste Intel Boot Guard 1.x), ona predstavlja velik interes kada se proučava nova verzija arhitekture za platforme na Intel SoC-u, gdje su se dogodile značajne promjene, na primjer:
- regije BIOS-a i Intel ME (točnije Intel TXE, prema terminologiji za Intel SoC) sada su jedna regija IFWI;
- iako je na platformi bio uključen Intel BG, takve strukture kao FIT, KEYM, IBBM nisu pronađene u flash memoriji;
- uz TXE i ISH jezgre (x86), čipset je dodao treću jezgru (opet ARC, usput rečeno) – PMC (Kontroler upravljanja napajanjem), povezan s osiguravanjem funkcionalnosti potkonstrukcije napajanja i praćenjem performansi.

Sadržaj novog IFWI regiona sastoji se od sljedećih modula:
Pomak
Ime
Opis
0000 2000h
SMIP
neka konfiguracija platforme, potpisana od strane dobavljača
0000 6000h
RBEP
koda odlomka firmvera Intel TXE, x86, potpisana od strane Intela
0001 0000h
PMCP
koda odlomka firmvera Intel PMC, ARC, potpisana od strane Intela
0002 0000h
FTPR
koda odlomka firmvera Intel TXE, x86, potpisana od strane Intela
0007 B000h
UCOD
ažuriranja mikrokoda za CPU, potpisana od strane Intela
0008 0000h
IBBP
UEFI BIOS, faze SEC/PEI, x86, potpisana od strane dobavljača
0021 8000h
ISHC
koda odlomka firmvera Intel ISH, x86, potpisana od strane dobavljača
0025 8000h
NFTP
koda odlomka firmvera Intel TXE, x86, potpisana od strane Intela
0036 1000h
IUNP
nepoznato
0038 1000h
OBBP
UEFI BIOS, faza DXE, x86, nije potpisana
Tijekom analize firmvera TXE 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 …). TXE smješta ove podatke u svoju SRAM, nakon čega privremeno omogućava procesoru pristup i 'oslobađa' ga iz RESET-a.
Na čuvanju od rootkitova
A sada prelazimo na 'vruće'. Jednom smo otkrili da su u SPI flash-deskriptorima mnogih sustava zapisane dozvole za pristup regijama SPI flash memorije tako da svi korisnici te memorije mogu pisati i čitati bilo koju regiju. Odnosno, nimalo.
Nakon provjere pomoću alata MEinfo (iz Intel STK) vidjeli smo da je proizvodni način na tim sustavima otvoren, stoga su fuzije čipseta (FPF-ovi) ostavljene u neodređenom stanju. Da, Intel BG u takvim slučajevima nije uključen ni isključen.
Riječ je o sljedećim sustavima (što se tiče Intel BG i onoga što će biti izloženo dalje u članku, govorimo o sustavima s mikroarhitekturom procesora Haswell i novijim):
- svi proizvodi Gigabyte;
- svi proizvodi MSI;
- 21 model laptopa Lenovo i 4 modela poslužitelja Lenovo.
Naravno, obavijestili smo te dobavljače, kao i tvrtku Intel.
Prikladna reakcija stigla je samo od Lenovo, koji su priznali problem i .
Gigabyte čini se da su primili informaciju o ranjivosti, ali nikako je nisu komentirali.
Komunikacija s MSI u potpunosti su se zaustavili na našem zahtjevu da pošalju svoj otvoreni PGP ključ (kako bismo im poslali sigurnosnu obavijest u šifriranom obliku). Izjavili su da su "proizvođači opreme i ne proizvode PGP ključeve."
Ali bliže stvarima. Budući da su fuzije ostavljene u neodređenom stanju, korisnik (ili napadač) može ih samostalno programirati (najteže je ). Da bi to učinio, potrebno je izvesti sljedeće korake.
1. Pokrenuti Windows OS (inače, opisane kasnije radnje mogu se napraviti i s Linuxom, ako se razvije analog Intel STK za potrebni OS). Koristeći alat MEinfo, provjeriti da fuzije na ovom sustavu nisu programirane.

2. Pročitati sadržaj flash memorije pomoću Flash Programming Tool.

3. Otvoriti pročitanu sliku pomoću bilo kojeg alata za uređivanje UEFI BIOS-a, unijeti potrebne izmjene (na primjer, implementirati rootkit), stvoriti/izmijeniti postojeće strukture KEYM i IBBM u ME regiji.


Na slici je označen javni dio RSA ključa, čiji će hash biti programiran u fuzije čipseta zajedno s ostatkom konfiguracije Intel BG.
4. Pomoću Flash Image Tool sastaviti novu sliku firmware-a (postavljajući konfiguraciju Intel BG).

5. Zapisati novu sliku na flash memoriju pomoću Flash Programming Tool, provjeriti pomoću MEinfo, da ME regija sada sadrži konfiguraciju Intel BG.

6. Pomoću Flash Programming Tool zatvoriti način rada za proizvodnju.

7. Sustav će se ponovno pokrenuti, nakon čega se pomoću MEinfo može provjeriti da su FPF-ovi sada programirani.

Ove radnje zauvijek uključit će Intel BG na ovom sustavu. Njihovo uklanjanje neće biti moguće, što znači:
- Ažurirati UEFI BIOS na ovom sustavu moći će samo vlasnik privatnog dijela korijenskog ključa (tj. onaj tko je uključio Intel BG);
- ako se ovom sustavu vrati originalni firmware, na primjer, pomoću programatora, on se čak neće uključiti (posljedica enforcement policy u slučaju greške verifikacije);
- da biste se riješili takvog UEFI BIOS-a, potrebno je zamijeniti čipset s programiranim FPF-ovima s "čistim" (tj. prepakirati čipset, ako imate pristup infracrvenoj lemljenju koja košta kao automobil, ili jednostavno zamijeniti matičnu ploču).
Da bismo razumjeli što može napraviti takav rootkit, potrebno je ocijeniti što omogućuje izvršavanje vlastitog koda u UEFI BIOS okruženju. Na primjer, u najprivilegiranijem režimu procesora – SMM. Takav rootkit može imati sljedeće osobine:
- izvršavati se paralelno s OS-om (može se konfigurirati da reagira na generiranje SMI prekida, koji će se aktivirati prema tajmeru);
- imati sve prednosti boravka u SMM režimu (potpun pristup sadržaju radne memorije i hardverskim resursima, skrivenost od OS-a);
- programski kod rootkita može biti u šifriranom obliku i dešifrirati se prilikom pokretanja u SMM režimu. Kao ključ za šifriranje mogu se upotrijebiti svi podaci dostupni samo u SMM režimu. Na primjer, hash skupa adresa u SMRAM-u. Da biste dobili ovaj ključ, potrebno je ući u SMM. To se može učiniti na dva načina. Prvo, pronaći RCE u SMM kodu i iskoristiti ga, ili dodati vlastiti SMM modul u BIOS, što nije moguće jer smo aktivirali Boot Guard.
Stoga, ova ranjivost omogućuje napadaču:
- stvariti u sustavu skriveni, neizbrisivi rootkit nepoznate namjene;
- izvršavati svoj kod na jednom od jezgri čipseta unutar Intel SoC, posebno, na Intel ISH (pažljivo pogledajmo sliku).


Iako mogućnosti Intel ISH podsustava još nisu istražene, čini se da je to zanimljiv vektor napada na Intel ME.
Zaključci
- Istraživanje je omogućilo dobivanje tehničkog opisa rada tehnologije Intel Boot Guard. Minus nekoliko tajni u Intelovom modelu sigurnosti kroz nejasnoću.
- Predstavljen je scenarij napada koji omogućuje stvaranje u sustavu neizbrisivog rootkita.
- Vidjeli smo da suvremeni Intel procesori mogu izvršiti mnogo vlastitog koda još prije nego što BIOS počne raditi.
- Platforme s Intel 64 arhitekturom postaju sve manje pogodne za pokretanje slobodnog softvera: hardverska verifikacija, sve veći broj vlasničkih tehnologija i podsustava (tri jezgre u čipsetu SoC: x86 ME, x86 ISH i ARC PMC).
Ublažavanje
Dobavljačima koji namjerno ostavljaju otvoren način proizvodnje, nužno je da ga zatvore. Za sada samo zatvaraju oči, a novi Kaby Lake sustavi to pokazuju.
Korisnici mogu sami isključiti Intel BG na svojim sustavima (koji su pogođeni navedenom ranjivošću) pokretanjem alata za programiranje Flash s parametrom -closemnf. Prethodno, treba provjeriti (pomoću MEinfo) da konfiguracija Intel BG u regiji ME omogućava isključivanje ove tehnologije nakon programiranja u FPF-ima.
Izvor: habr.com
