
Vi erbjuder att Ă„terigen dyka ner pĂ„ en lĂ„g nivĂ„ och diskutera sĂ€kerheten för x86-kompatibla datorplattformars firmware. Denna gĂ„ng Ă€r huvudingredienserna i undersökningen Intel Boot Guard (inte att förvĂ€xla med Intel BIOS Guard!) â en hĂ„rdvaruunderstödd teknik för betrodd BIOS-booting, som datorleverantören kan permanent aktivera eller inaktivera i tillverkningsskedet. Det bekanta receptet för undersökningen Ă€r att noggrant skiva med reverse engineering implementationen av denna teknik, beskriva dess arkitektur och fylla den med odocumenterade detaljer, samt krydda den med attackvektorer. LĂ„t oss tĂ€nda till med berĂ€ttelsen om hur en felaktighet i produktionen som har klonats under mĂ„nga Ă„r tillĂ„ter en potentiell angripare att anvĂ€nda denna teknik för att skapa en osynlig (Ă€ven för programmeraren) rootkit i systemet.
Förresten, grundvalen för artikeln Àr rapporter frÄn "Vid rutkitens försvar: Intel BootGuard" frÄn konferensen och det 29:e mötet (bÄda presentationerna ).
Firmware för datorplattformar med Intel 64-arkitektur
För att börja med ska vi besvara frÄgan: vad utgör firmware för moderna datorplattformar med Intel 64-arkitektur? SjÀlvklart Àr svaret UEFI BIOS. Men det svaret skulle inte vara helt korrekt. LÄt oss ta en titt pÄ bilden, dÀr en desktop- (eller laptop-)version av denna arkitektur visas.

Grunden Àr en kombination av:
- Processorn (CPU, Central Processing Unit), som, förutom huvudkÀrnorna, har en inbyggd grafikkÀrna (inte i alla modeller) och en inbyggd minneskontroller (IMC, Integrated Memory Controller);
- Chipsatsen (PCH, Platform Controller Hub), som innehÄller olika kontroller för interaktion med perifera enheter och för att hantera subsystem. Bland dessa finns den inte sÄ okÀnda Intel Management Engine (ME), som ocksÄ har firmware (Intel ME firmware).
BÀrbara datorer, utöver ovanstÄende, förutsÀtter Àven att det finns en inbyggd kontroller (ACPI EC, Advanced Control and Power Interface Embedded Controller), som ansvarar för funktionen av strömhanteringssystemet, pekplattan, tangentbordet, Fn-tangenterna (skÀrmens ljusstyrka, ljudvolym, tangentbordsbelysning osv.) och mer. Och den har ocksÄ sin egen firmware.
SÄ, sammanstÀllningen av de ovan nÀmnda firmware Àr firmware för dataplattformen (system firmware), som lagras i gemensam SPI-flashminne. För att anvÀndarna av detta minne inte ska blanda ihop vad som tillhör vem, Àr innehÄllet i detta minne uppdelat i följande regioner (som visas i bilden):
- UEFI BIOS;
- firmware för ACPI EC (en separat region introducerades med processormikroarkitekturen Skylake (2015), men i verkliga anvÀndningsfall har vi hittills inte sett exempel pÄ dess anvÀndning, sÄ firmware för den inbyggda kontrolleraren ingÄr fortfarande i UEFI BIOS);
- firmware för Intel ME;
- konfiguration (MAC-adress osv.) för den inbyggda nÀtverksadaptern GbE (Gigabit Ethernet);
- Flash-beskrivare (Flash Descriptors) â den huvudsakliga regionen i flashminnet som innehĂ„ller pekare till de andra regionerna, samt Ă„tkomstbehörigheter till dem.

Ă
tkomstbegrĂ€nsningen till regionerna (enligt angivna behörigheter) hanteras av huvudkontrollenheten för SPI-bussen â en inbyggd SPI-kontroller i chipsetet, genom vilken Ă„tkomsten till detta minne sker. Om behörigheterna Ă€r instĂ€llda pĂ„ de rekommenderade (av sĂ€kerhetsskĂ€l) vĂ€rdena av Intel, har varje anvĂ€ndare av SPI-flashminnet fullstĂ€ndig Ă„tkomst (lĂ€sning/skrivning) endast till sin region. De andra â Ă€r antingen endast lĂ€sbara eller helt otillgĂ€ngliga. En vĂ€lkĂ€nd fakta: i mĂ„nga system har CPU:n fullstĂ€ndig Ă„tkomst till UEFI BIOS och GbE, lĂ€sĂ„tkomst till flash-beskrivarna, och det finns ingen Ă„tkomst till regionen Intel ME. Varför i mĂ„nga fall, men inte alla? Vad som rekommenderas Ă€r inte nödvĂ€ndigtvis obligatoriskt. Vi berĂ€ttar mer om detta senare i artikeln.
Skyddsmekanismer för firmware för dataplattformen mot modifiering
Det Àr uppenbart att firmware för dataplattformen mÄste skyddas mot potentiell kompromiss som skulle möjliggöra en potentiell angripare att fÄ fotfÀste i den (överleva uppdateringar/installeringar av operativsystem), köra sin kod i de mest privilegierade lÀgena, etc. Och att begrÀnsa Ätkomst till regionerna i SPI-flashminnet Àr sjÀlvklart inte tillrÀckligt. DÀrför anvÀnds olika mekanismer, specifika för varje körningsmiljö, för att skydda firmware mot modifieringar.
SÄ, firmware för Intel ME Àr signerad för att sÀkerstÀlla integritet och autenticitet, och kontrolleras av ME-kontrolleraren vid varje laddning i ME UMA-minnet. Denna verifieringsprocess har redan diskuterats av oss i en av , som handlar om Intel ME-systemet.
Firmware för ACPI EC kontrolleras vanligtvis bara för integritet. Men eftersom denna binÀrfil ingÄr i UEFI BIOS omfattas den nÀstan alltid av samma skyddsmekanismer som anvÀnds av UEFI BIOS. LÄt oss prata om dem.
Dessa mekanismer kan delas in i tvÄ kategorier.
Skrivskydd av UEFI BIOS-regionen
- Fysisk skydd av SPI-flashminnets innehÄll med en write-protect jumper;
- Skydd av UEFI BIOS-regionens projektionsadress i CPU:s minnesutrymme med hjÀlp av PRx-register i chipsetet;
- Blockering av skrivförsök i UEFI BIOS-regionen genom att generera och hantera en motsvarande SMI-avbrott genom att stÀlla in bios_WE/BLE och SMM_BWP-bitar i chipsetets register;
- Ett mer avancerat alternativ till detta skydd Àr Intel BIOS Guard (PFAT).
Utöver dessa mekanismer kan leverantörerna utveckla och implementera egna sÀkerhetsÄtgÀrder (till exempel signering av kapslar med UEFI BIOS-uppdateringar).
Det Àr viktigt att notera att pÄ ett specifikt system (beroende pÄ leverantören) kanske inte alla ovanstÄende skyddsmekanismer tillÀmpas, kanske helt inte tillÀmpas, eller kanske Àr sÄrbart implementerade. Mer om dessa mekanismer och deras implementation kan lÀsas i . För den intresserade rekommenderar vi att lÀsa hela artikelserien om sÀkerheten hos UEFI BIOS frÄn .
Verifiering av UEFI BIOS-autenticitet
NÀr vi pratar om teknologier för pÄlitlig uppstart Àr det första som kommer i Ätanke Secure Boot. Men arkitektoniskt Àr det avsett för att verifiera autentiteten hos externa komponenter relativt UEFI BIOS (drivrutiner, boot loaders etc.), inte sjÀlva firmware.
DÀrför införde Intel i SoC:er med Bay Trail-mikroarkitektur (2012) en hÄrdvaru-icke-avstÀngningsbar Secure Boot (Verified Boot), som inte har nÄgot att göra med den tidigare nÀmnda Secure Boot-teknologin. Senare (2013) förbÀttrades denna mekanism och slÀpptes under namnet Intel Boot Guard för stationÀra datorer med Haswell-mikroarkitektur.
Innan vi beskriver Intel Boot Guard, lÄt oss titta pÄ exekveringsmiljöerna i Intel 64-arkitekturen, som samtidigt Àr grundlÀggande för denna teknik för pÄlitlig uppstart.
Intel CPU
KÀppe sÀger att processorn Àr den primÀra exekveringsmiljön i Intel 64-arkitekturen. Varför Àr den ocksÄ grundstenen? Det visar sig att detta Àr fallet pÄ grund av att den har följande element:
- Mikrokod ROM â icke-flyktig, icke-överskrivbar minne för lagring av mikrokod. Man anser att mikrokod Ă€r implementeringen av processorns instruktionsuppsĂ€ttning pĂ„ grundlĂ€ggande instruktioner. Det kan ocksĂ„ uppstĂ„ . SĂ„ i BIOS kan man hitta binĂ€rer med uppdateringar av mikrokod (de tillĂ€mpas under uppstart, eftersom ROM inte kan överskrivas). InnehĂ„llet i dessa binĂ€rer Ă€r krypterat, vilket betydligt komplicerar analysen (dĂ€rför Ă€r det specifika innehĂ„llet i mikrokoden kĂ€nt endast av dem som utvecklar det), och signerat för integritets- och Ă€kthetskontroll;
- AES nyckel för avkryptering av innehÄllet i mikrokodsuppdateringarna;
- hash av RSA offentliga nyckeln, som anvÀnds för att verifiera signaturen av mikrokodsuppdateringar;
- hash av RSA offentliga nyckeln, som anvÀnds för att verifiera signaturen av de av företaget Intel utvecklade kodmodulerna ACM (Authenticated Code Module), som CPU kan köra innan BIOS exekvering (hejdÄ mikrokod) eller under dess drift, vid uppkomsten av vissa hÀndelser.
Intel ME
Denna subsystem har varit dedikerad i vÄr blogg i hela . LÄt oss pÄminna om att denna körbara miljö Àr baserad pÄ en mikrocontroller inbÀddad i chipsettet och Àr den mest dolda och privilegierade i systemet.
Trots sin dolda natur Àr Intel ME ocksÄ en förtroendebas, eftersom den har:
- ME ROM â icke-flyktig, icke-överskrivbar minne (det finns ingen möjlighet till uppdatering), som innehĂ„ller startkod samt en SHA256 hash av RSA offentliga nyckeln, som anvĂ€nds för att verifiera signaturen av Intel ME-firmware;
- AES nyckel för lagring av hemlig information;
- Ätkomst till den inbÀddade chipsets uppsÀttning av fusions (FPFs, Field Programmable Fuses) för permanent lagring av viss information, inklusive den som anges av datorleverantören.
Intel Boot Guard 1.x
En liten avskylning. Versionsnumren för Intel Boot Guard-teknologin som vi hanterar i denna artikel Àr konditionella och kanske inte har nÄgot att göra med numreringen som anvÀnds i Interna dokumentationen hos Intel. Dessutom har informationen hÀr om implementeringen av denna teknologi erhÄllits genom omvÀnd teknik och kan innehÄlla oegentligheter jÀmfört med specifikationen för Intel Boot Guard, som knappast nÄgonsin kommer att publiceras.
SÄ, Intel Boot Guard (BG) Àr en hÄrdvarustödd teknik för autentisering av UEFI BIOS. Enligt dess korta beskrivning i boken [Platform Embedded Security Technology Revealed, kapitel Boot with Integrity, or Not Boot], fungerar den som en kedja av betrodd bootning. Det första ledet i denna kedja Àr bootkoden (mikrokoden) inuti CPU:n, som aktiveras vid RESET (inte att förvÀxla med RESET-vektorn i BIOS!). CPU:n hittar en utvecklad och signerad kodmodul (Intel BG startup ACM) i SPI-flashminnet, laddar ner den till sin cache, verifierar (det har tidigare nÀmnts att CPU:n har en hash av den offentliga nyckeln som anvÀnds för att kontrollera signaturen pÄ ACM) och startar.

Denna kodmodul ansvarar för att verifiera en liten startdel av UEFI BIOS - Initial Boot Block (IBB), som i sin tur innehÄller funktionalitet för att verifiera huvuddelen av UEFI BIOS. PÄ sÄ sÀtt gör Intel BG det möjligt att sÀkerstÀlla BIOS:s Àkthet innan operativsystemet laddas (som kan köras under övervakning av teknologin Secure Boot).
Intel BG-teknologin har tvÄ driftslÀgen (och det ena stör inte det andra, det vill sÀga att bÄda lÀgena kan vara aktiverade i systemet, eller bÄda kan vara avstÀngda).
Measured Boot
I lÀget Measured Boot (MB) "mÀter" varje bootkomponent (frÄn och med CPU boot ROM) den nÀsta, med hjÀlp av TPM (Trusted Platform Module). För de som inte Àr bekanta med detta, lÄt oss förklara.
TPM har PCR:er (Platform Configuration Registers), dÀr resultatet av hashoperationen skrivs in enligt formeln:

Det vill sÀga det aktuella vÀrdet pÄ PCR beror pÄ det föregÄende, medan dessa register endast ÄterstÀlls vid systemets RESET.
SÄledes reflekterar PCR:erna i lÀget MB vid en viss tidpunkt en unik (inom ramen för hashoperationens möjligheter) identifierare av den kod eller data som har "mÀtts". VÀrdena pÄ PCR kan anvÀndas vid kryptering av vissa data (TPM_Seal). Efter detta kan deras avkryptering (TPM_Unseal) endast ske om vÀrdena pÄ PCR inte har förÀndrats som ett resultat av bootningen (det vill sÀga att ingen "mÀtt" komponent har modifierats).
Verified Boot
Det mest skrÀmmande för dem som Àlskar att modifiera UEFI BIOS Àr lÀget Verified Boot (VB), dÀr varje bootkomponent kryptografiskt verifierar integriteten och Àktheten av nÀsta. Och i hÀndelse av verifieringsfel intrÀffar (ett av):
- timeout av 1 minut till 30 minuter (för att anvÀndaren ska hinna förstÄ varför datorn inte startar och, om möjligt, försöka ÄterstÀlla BIOS);
- omedelbar avstÀngning (för att anvÀndaren inte ska hinna förstÄ nÄgot och, Ànnu mer, göra nÄgot);
- fortsatt arbete med ostörd uppsyn (det tillfÀllet nÀr sÀkerhet inte Àr en prioritet, dÄ det finns viktigare saker att göra).
Valet av Ă„tgĂ€rd beror pĂ„ den angivna konfigurationen av Intel BG (det vill sĂ€ga, den sĂ„ kallade enforcement policy), som stĂ€ndigt skrivs in av plattformsleverantören i ett speciellt avsett lagringsutrymme â chipsets fusing (FPF). Vi kommer att gĂ„ vidare med detta Ă€mne senare.
Utöver konfigurationen genererar leverantören tvÄ RSA 2048 nycklar och skapar tvÄ datastrukturer (visas pÄ bilden):
- Manifest för leverantörens rotnyckel (KEYM, OEM Root Key Manifest), i vilket den lÀgger SVN (Security Version Number) för detta manifest, SHA256 hash av den offentliga nyckeln för nÀsta manifest, den offentliga RSA-nyckeln (dvs. den offentliga delen av leverantörens rotnyckel) för att verifiera signaturen av detta manifest och sjÀlva signaturen;
- Manifest för IBB (IBBM, Initial Boot Block Manifest), i vilket den lÀgger SVN för detta manifest, SHA256 hash av IBB, den offentliga nyckeln för verifikation av signaturen av detta manifest och sjÀlva signaturen.
SHA256 hash av den offentliga nyckeln för OEM Root Key skrivs permanent in i chipsets fusing (FPF), precis som konfigurationen av Intel BG. Om konfigurationen av Intel BG tillÄter aktivering av denna teknologi, kan pÄ denna system BIOS (dvs. ha möjlighet att rÀkna om dessa manifester) endast uppdateras av Àgaren av den privata delen av OEM Root Key, det vill sÀga leverantören.

Vid en blick pĂ„ bilden uppstĂ„r genast tvivel om behovet av en sĂ„ lĂ„ng verifieringskedja â skulle man inte kunna anvĂ€nda ett enda manifest? Varför komplicera?
I sjÀlva verket ger Intel pÄ detta sÀtt leverantören möjlighet att anvÀnda olika IBB-nycklar för olika produktlinjer och en som rotnyckel. Om den privata delen av IBB-nyckeln (som signerar det andra manifestet) lÀcker, kommer incidenten endast att pÄverka en produktlinje och bara tills leverantören skapar ett nytt nyckelpar och inkluderar de omrÀknade manifesten i nÀsta BIOS-uppdatering.
Men om den rotade nyckeln (som signerar den första manifestfilen) komprometteras kan den inte bytas ut, eftersom det inte finns nÄgon Äterkallande procedur; hashen av den offentliga delen av denna nyckel programmeras i FPF:erna en gÄng för alla.
Konfiguration av Intel Boot Guard
LÄt oss nu titta nÀrmare pÄ konfigurationen av Intel BG och processen för dess skapande. Om man ser pÄ den relevanta fliken i GUI-verktyget Flash Image Tool frÄn Intel System Tool Kit (STK) kan man notera att konfigurationen av Intel BG inkluderar hashen av den offentliga delen av rotnyckeln frÄn leverantören, ett par otydliga vÀrden och sÄ kallad Intel BG-profil.

Strukturen för denna profil:
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 â gör ingenting
// 01b â stĂ€ng av med timeout
// 11b â omedelbar avstĂ€ngning
unsigned long : 26;
};Generellt sett Àr konfigurationen av Intel BG en mycket flexibel entitet. LÄt oss ta en titt pÄ flaggan Force_Boot_Guard_ACM, till exempel. NÀr den Àr avstÀngd, om BG startup ACM-modulen pÄ SPI-flashminnet inte hittas, kommer ingen sÀker uppstart att ske. Det blir en osÀker uppstart.
Vi har redan nÀmnt ovan att efterlevnadspolicyn för VB-lÀget kan stÀllas in sÄ att en verifieringsmiss gör att osÀker uppstart intrÀffar igen.
Att lĂ€mna sĂ„dana saker till leverantörernas bedömningâŠ
GUI-verktyget förutsÀtter följande 'klara' profiler:
Nummer
LĂ€ge
Beskrivning
0
No_FVME
Intel BG-teknik Àr avstÀngd
1
VE
VB-lÀge Àr aktiverat, avstÀngning efter timeout
2
VME
BÄda lÀgena (VB och MB) Àr aktiverade, avstÀngning efter timeout
3
VM
BÄda lÀgena Àr aktiverade, utan avstÀngning av systemet
4
FVE
VB-lÀge Àr aktiverat, omedelbar avstÀngning
5
FVME
BÄda lÀgena Àr aktiverade, omedelbar avstÀngning
Som redan nĂ€mnts bör konfigurationen av Intel BG en gĂ„ng för alla skrivas av systemleverantören i chipsetets fuser (FPF:erna) â en liten (enligt obekrĂ€ftade uppgifter, endast 256 byte) hĂ„rdvarulagring för information inom chipsetet, som kan programmeras utanför tillverkningsanlĂ€ggningarna hos Intel (dĂ€rför, specifikt Field Programmable Fuses).
Det passar utmÀrkt för att lagra konfigurationen eftersom:
- det har ett engÄngsprogrammerbart omrÄde för datalagring (precis dit konfigurationen av Intel BG skrivs);
- det kan endast lÀsas och programmeras av Intel ME.
SÄ, för att stÀlla in konfigurationen för Intel BG-teknologin pÄ ett specifikt system, gör tillverkaren följande under produktionen:
- Med hjÀlp av Flash Image Tool (frÄn Intel STK) skapas en firmware-avbild med den angivna konfigurationen av Intel BG i form av variabler inom Intel ME-regionen (det sÄ kallade temporÀra spegeln för FPF:er);
- Med hjÀlp av Flash Programming Tool (frÄn Intel STK) skrivs denna avbild till SPI-flashminnet för systemet och det sÄ kallade manufacturing mode stÀngs (samtidigt skickas motsvarande kommando till Intel ME).
Som ett resultat av dessa operationer kommer Intel ME att kommitta de angivna vÀrdena frÄn spegeln för FPF:er i ME-regionen, stÀlla in behörigheterna i SPI-flashdeskriptorerna till de rekommenderade vÀrdena frÄn Intel (som beskrevs i början av artikeln) och utföra en RESET av systemet.
Analys av implementering av Intel Boot Guard
För att analysera implementeringen av denna teknologi pÄ ett specifikt exempel har vi kontrollerat följande system för spÄr av Intel BG-teknologin:
Systemet
AnmÀrkning
Gigabyte GA-H170-D3H
Skylake, stöd finns
Gigabyte GA-Q170-D3H
Skylake, stöd finns
Gigabyte GA-B150-HD3
Skylake, stöd finns
MSI H170A Gaming Pro
Skylake, inget stöd
Lenovo ThinkPad 460
Skylake, stöd finns, teknologin Àr aktiverad
Lenovo Yoga 2 Pro
Haswell, inget stöd
Lenovo U330p
Haswell, inget stöd
Med 'stöd' avses förekomsten av Intel BG startup ACM-modulen, de nÀmnda manifesten och motsvarande kod i BIOS, det vill sÀga implementeringar för analys.
Som exempel, lÄt oss ta den nedladdade SPI-flashminnesavbilden för Gigabyte GA-H170-D3H (version F4) frÄn tillverkarens officiella webbplats.
Intel CPU boot ROM
Först och frÀmst, lÄt oss tala om processorernas handlingar om Intel BG-teknologin Àr aktiverad.
Exempel pĂ„ avkrypterad mikrokod har inte kunnat hittas, sĂ„ hur de följande handlingarna genomförs (i mikrokoden eller hĂ„rdvaran) Ă€r en öppen frĂ„ga. ĂndĂ„ Ă€r det ett faktum att moderna Intel-processorer "kan" utföra dessa handlingar.
Efter att ha gÄtt ur RESET tillstÄndet hittar processorn (vars adresseringsomrÄde redan Àr mappat med innehÄllet i flashminnet) FIT-tabellen (Firmware Interface Table). Det Àr enkelt att hitta den, pekaren pÄ den Àr lagrad pÄ adressen FFFF FFC0h.

I det aktuella exemplet ligger vÀrdet FFD6 9500h pÄ denna adress. Genom att adressera denna plats ser processorn FIT-tabellen, vars innehÄll Àr uppdelat i poster. Den första posten Àr en rubrik av följande struktur:
typedef struct FIT_HEADER
{
char Tag[8]; // â_FIT_ â
unsigned long NumEntries; // inklusive FIT rubrikpost
unsigned short Version; // 1.0
unsigned char EntryType; // 0
unsigned char Checksum;
}; 
Av okÀnda skÀl berÀknas checksumma inte alltid i dessa tabeller (fÀltet lÀmnas null).
Ăvriga poster anger olika binĂ€rer som mĂ„ste parseas/exekveras innan BIOS-exekveringen, det vill sĂ€ga innan övergĂ„ngen till legacy RESET-vektor (FFFF FFF0h). Strukturen för varje sĂ„dan post Ă€r följande:
typedef struct FIT_ENTRY
{
unsigned long BaseAddress;
unsigned long : 32;
unsigned long Size;
unsigned short Version; // 1.0
unsigned char EntryType;
unsigned char Checksum;
}; 
FÀltet EntryType anger typen av block som denna post pekar pÄ. Vi kÀnner till flera typer:
enum FIT_ENTRY_TYPES
{
FIT_HEADER = 0,
MICROCODE_UPDATE,
BG_ACM,
BIOS_INIT = 7,
TPM_POLICY,
BIOS_POLICY,
TXT_POLICY,
BG_KEYM,
BG_IBBM
};Det Ă€r nu uppenbart att en av posterna pekar pĂ„ platsen för binĂ€ren Intel BG startup ACM. Strukturen för huvudet av denna binĂ€r Ă€r typisk för de kodmoduler som utvecklas av Intel (ACM:er, mikrokodsuppdateringar, kodsektioner för Intel ME, âŠ).
typedef struct BG_ACM_HEADER
{
unsigned short ModuleType; // 2
unsigned short ModuleSubType; // 3
unsigned long HeaderLength; // i dwords
unsigned long : 32;
unsigned long : 32;
unsigned long ModuleVendor; // 8086h
unsigned long Date; // i BCD-format
unsigned long TotalSize; // i dwords
unsigned long unknown1[6];
unsigned long EntryPoint;
unsigned long unknown2[16];
unsigned long RsaKeySize; // i dwords
unsigned long ScratchSize; // i dwords
unsigned char RsaPubMod[256];
unsigned long RsaPubExp;
unsigned char RsaSig[256];
}; 
Processorn laddar denna binÀr i sin cache, verifierar och startar.
Intel BG startup ACM
Genom analys av arbetet med denna ACM blev det klart att den gör följande:
- hÀmtar konfigurationen för Intel BG frÄn Intel ME, skriven i chipsetets fuser (FPF);
- hittar manifester KEYM och IBBM, verifierar dem.
För att hitta dessa manifester anvÀnder ACM ocksÄ FIT-tabellen, dÀr tvÄ typer av poster Àr avsatta för att peka pÄ datatyper (se FIT_ENTRY_TYPES ovan).
LÄt oss titta nÀrmare pÄ manifesten. I strukturen för den första manifestet ser vi flera oklara konstanter, hash av den offentliga nyckeln frÄn den andra manifestet och den offentliga nyckeln för OEM Root Key med en signatur i form av en inbÀddad struktur:
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 av en IBBM publik nyckel
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];
}; 
För att verifiera den offentliga nyckeln OEM Root Key, pÄminner vi om att SHA256-hashen frÄn fuse har anvÀnts, vilken redan har erhÄllits frÄn Intel ME.
LÄt oss gÄ vidare till den andra manifestet. Den bestÄr av tre strukturer:
typedef struct IBB_MANIFEST
{
ACBP Acbp; // Boot policies
IBBS Ibbs; // IBB beskrivning
IBB_DESCRIPTORS[];
PMSG Pmsg; // IBBM signatur
};I den första â nĂ„gra konstanter:
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
};I den andra finns SHA256-hashen av IBB och antalet beskrivare som beskriver innehÄllet i IBB (dvs. det som hash berÀknas frÄn):
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 av en IBB
unsigned char NumIbbDescriptors;
};IBB-beskrivarna följer efter denna struktur, en efter en. Deras innehÄll har följande format:
typedef struct IBB_DESCRIPTOR
{
unsigned long : 32;
unsigned long BaseAddress;
unsigned long Size;
};Det Àr enkelt: varje beskrivare innehÄller adress/size av en del av IBB. SÄledes Àr sammankopplingen av blocken, som dessa beskrivare pekar pÄ (i ordningen som beskrivarna sjÀlva finns), IBB. Och vanligtvis Àr IBB en samling av alla modulerna i faserna SEC och PEI.
Den andra manifestet avslutas med en struktur som innehÄller den offentliga nyckeln för IBB (som verifieras med SHA256-hashen frÄn den första manifestet) och signaturen för denna manifest:
typedef struct PMSG
{
char Tag[8]; // '__PMSG__'
unsigned char : 8; // 10h
BG_RSA_ENTRY IbbKey;
}; 
Innan UEFI BIOS börjar genomföra sitt arbete kommer processorn att starta ACM, som kontrollerar autentiteten av innehÄllet i sektionerna med SEC- och PEI-kod. DÀrefter gÄr processorn ur ACM, gÄr till RESET-vÀrdet och börjar köra BIOS.
Den verifierade PEI-sektionen mÄste innehÄlla en modul som kontrollerar resten av BIOS (DXE-kod). Denna modul utvecklas av antingen IBV (Independent BIOS Vendor) eller av systemleverantören sjÀlv. Eftersom vi endast hade system frÄn Lenovo och Gigabyte som stöder Intel BG, kommer vi att titta pÄ koden som extraherats frÄn just dessa system.
UEFI BIOS-modul LenovoVerifiedBootPei
I fallet med Lenovo visade det sig vara modulen LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, utvecklad av Lenovo.
Dess funktion Àr att söka (via GUID) hash-tabellen för DXE och verifiera DXE.
if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
if (!FindHashTable())
return EFI_NOT_FOUND;
if (!VerifyDxe())
return EFI_SECURITY_VIOLATION;
}Hash-tabellen {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} har följande 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
I fallet med Gigabyte visade det sig vara modulen BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, utvecklad av AMI, och dÀrav finns i varje AMI BIOS som stöder Intel BG.
Dess arbetsalgoritm Àr nÄgot annorlunda, men den syftar till samma sak:
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-tabellen {389CC6F2-1EA8-467B-AB8A-78E769AE2A15}, som den söker efter, har följande 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
LĂ„t oss kort diskutera en annan implementering av Intel Boot Guard som har hittats i ett nyare system baserat pĂ„ Intel SoC med mikroarkitekturen Apollo Lake â ASRock J4205-IT.
Ăven om denna version endast kommer att anvĂ€ndas i SoC:er (nya system med processorarkitekturen Kaby Lake fortsĂ€tter att anvĂ€nda Intel Boot Guard 1.x), Ă€r den av stort intresse för att studera det nya arkitekturalternativet för plattformar pĂ„ Intel SoC, dĂ€r betydande förĂ€ndringar har intrĂ€ffat, till exempel:
- BIOS-regioner och Intel ME (snarare Intel TXE, enligt terminologin för Intel SoC) har nu blivit en enda IFWI-region;
- Ăven om Intel BG var aktiverat pĂ„ plattformen, hittades inga strukturer som FIT, KEYM, IBBM i flashminnet;
- Förutom TXE- och ISH-kĂ€rnorna (x86) har chipsetet fĂ„tt en tredje kĂ€rna (Ă„terigen ARC, förresten) â PMC (Power Management Controller), som Ă€r kopplad till att sĂ€kerstĂ€lla driftsĂ€kerheten för strömförsörjningssystemet och övervakningen av prestanda.

InnehÄllet i det nya IFWI-regionen bestÄr av en uppsÀttning följande moduler:
AvstÄnd
Namn
Beskrivning
0000 2000h
SMIP
nÄgon plattformsconfiguration, signerad av leverantören
0000 6000h
RBEP
kodavsnitt för firmware Intel TXE, x86, signerad av Intel
0001 0000h
PMCP
kodavsnitt för firmware Intel PMC, ARC, signerad av Intel
0002 0000h
FTPR
kodavsnitt för firmware Intel TXE, x86, signerad av Intel
0007 B000h
UCOD
mikrocodeuppdateringar för CPU, signerad av Intel
0008 0000h
IBBP
UEFI BIOS, faser SEC/PEI, x86, signerad av leverantören
0021 8000h
ISHC
kodavsnitt för firmware Intel ISH, x86, signerad av leverantören
0025 8000h
NFTP
kodavsnitt för firmware Intel TXE, x86, signerad av Intel
0036 1000h
IUNP
OkÀnt
0038 1000h
OBBP
UEFI BIOS, fas DXE, x86, osignerad
Under analysen av TXE-firmwaren blev det uppenbart att efter en RESET hĂ„ller TXE processorn i detta tillstĂ„nd tills den har förberett en grundlĂ€ggande innehĂ„ll för CPU:ns adresseringsutrymme (FIT, ACM, RESET-vektor âŠ). TXE placerar dessa data i sin egen SRAM och ger tillfĂ€lligt processorn tillgĂ„ng till dem och "frigör" den frĂ„n RESET.
HÄller rötterkit pÄ avstÄnd
Nu över till det "heta". En gÄng upptÀckte vi att pÄ mÄnga system i SPI-flashbeskrivningar fanns behörigheter för Ätkomst till SPI-flashminnesregioner sÄ att alla anvÀndare av detta minne kan lÀsa och skriva till vilken region som helst. Dvs. ingenting.
Efter att ha verifierat med hjÀlp av verktyget MEinfo (frÄn Intel STK) sÄg vi att manufacturing mode pÄ dessa system inte var stÀngt, vilket innebÀr att chipsetets fus inte var i ett definierat tillstÄnd. Ja, Intel BG var varken aktiverat eller inaktiverat i sÄdana fall.
Det handlar om följande system (vad gÀller Intel BG och det som kommer att framstÀllas senare i artikeln, pratar vi om system med processormikroarkitektur Haswell och uppÄt):
- alla produkter frÄn Gigabyte;
- alla produkter frÄn MSI;
- 21 modeller av Lenovo-bÀrbara datorer och 4 modellt av Lenovo-servrar.
SjÀlvklart rapporterade vi vÄr upptÀckte till dessa leverantörer samt till Intel.
Ett adekvat svar kom endast frÄn Lenovo, som erkÀnde problemet och .
Gigabyte verkade ha tagit informationen om sÄrbarheten, men kommenterade ingenting.
Kommunikationen med MSI det har helt stagnerat pÄ vÄr begÀran att skicka sin öppna PGP-nyckel (för att skicka dem sÀkerhetsmeddelandet i krypterad form). De hÀvdade att "de Àr tillverkare av hÄrdvara, och PGP-nycklar tillverkas inte."
Men till saken. Eftersom fusen lÀmnas i odefinierat skick kan anvÀndaren (eller en angripare) programmera dem sjÀlv (det mest komplicerade Àr ). För detta krÀvs följande steg.
1. Ladda in i Windows OS (i allmÀnhet kan de efterföljande ÄtgÀrderna Àven göras under Linux, om en motsvarande Intel STK utvecklas för det aktuella operativsystemet). AnvÀnda verktyget MEinfo, se till att fusen pÄ detta system inte Àr programmerade.

2. LÀsa innehÄllet i flashminnet med hjÀlp av Flash Programming Tool.

3. Ăppna den lĂ€sta bilden med hjĂ€lp av vilket verktyg som helst för att redigera UEFI BIOS, göra nödvĂ€ndiga Ă€ndringar (infoga en rootkit, till exempel), skapa/redigera befintliga strukturer KEYM och IBBM i ME-regionen.


I bilden Àr den offentliga delen av RSA-nyckeln markerad, vars hash kommer att programmeras i chipsetets fus samt övrig konfiguration av Intel BG.
4. AnvÀnda Flash Image Tool för att samla en ny firmwareavbildning (genom att ange Intel BG-konfigurationen).

5. Skriva den nya bilden till flashminnet med hjÀlp av Flash Programming Tool, och med hjÀlp av MEinfo bekrÀfta att ME-regionen nu innehÄller Intel BG-konfigurationen.

6. Med hjÀlp av Flash Programming Tool stÀnga av tillverkningslÀget.

7. Systemet kommer att starta om, varefter man med MEinfo kan bekrÀfta att FPF:erna nu Àr programmerade.

Dessa Ă„tgĂ€rder kommer förevigt att aktivera Intel BG pĂ„ detta system. Ă
tgÀrderna kan inte Äterkallas, vilket innebÀr:
- att uppdatera UEFI BIOS pÄ detta system kan endast göras av den som har den privata delen av rotnyckeln (dvs. den som aktiverade Intel BG);
- om man ÄterstÀller systemet till den ursprungliga firmware, till exempel med en programmerare, kommer det inte ens att starta (konsekvens av enforcement policy vid verifieringsfel);
- för att bli av med sÄdan UEFI BIOS krÀvs att chipsetet med programmerade FPF:er byts till ett "rent" (dvs. lödas om chipsetet, om du har tillgÄng till en infraröd lödstation som kostar som en bil, eller helt enkelt byta moderkortet).
För att förstĂ„ vad en sĂ„dan rootkit kan Ă„stadkomma, mĂ„ste man bedöma möjligheten att köra sin kod i miljön för UEFI BIOS. LĂ„t oss sĂ€ga, i den mest privilegierade processorlĂ€get â SMM. En sĂ„dan rootkit kan ha följande egenskaper:
- kunna köras parallellt med OS (kan stÀllas in för att aktiveras via generering av SMI-interruption, som triggas av en timer);
- ha alla fördelar av att befinna sig i SMM-lÀget (full tillgÄng till innehÄllet i arbetsminnet och hÄrdvaruresurser, osynlighet för OS);
- programkoden för rootkit kan finnas i krypterad form och avkodas vid körning i SMM-lÀget. Som nyckel för krypteringen kan man anvÀnda vilken data som helst som endast Àr tillgÀnglig i SMM-lÀget. Till exempel, en hash av en uppsÀttning adresser i SMRAM. För att fÄ denna nyckel krÀvs det att man tar sig in i SMM. Och detta kan göras pÄ tvÄ sÀtt. Hitta RCE i SMM-koden och exploatera den, eller lÀgga till sin egen SMM-modul i BIOS, vilket inte Àr möjligt eftersom vi har aktiverat Boot Guard.
SÄledes tillÄter denna sÄrbarhet en angripare att:
- skapa en dold, oupptÀckbar rootkit av okÀnt syfte i systemet;
- kör sin kod pÄ ett av kÀrnorna i chipsets inuti Intel SoC, nÀmligen pÄ Intel ISH (titta noga pÄ bilden).


Ăven om möjligheterna för subsystems Intel ISH Ă€nnu inte har utforskats, framstĂ„r den som en intressant angreppsvĂ€g pĂ„ Intel ME.
Slutsatser
- Undersökningen har lett till en teknisk beskrivning av hur teknologin Intel Boot Guard fungerar. Minus ett par hemligheter i Intels modell security through obscurity.
- Ett angreppsscenario har presenterats som möjliggör skapandet av en oupptÀckbar rootkit i systemet.
- Vi har sett att moderna Intel-processorer kan köra mycket proprietÀr kod innan BIOS börjar arbeta.
- Plattformar med Intel 64-arkitektur blir allt mindre lÀmpliga för att köra fri programvara: hÄrdvaruvalidering, det ökande antalet proprietÀra teknologier och subsystems (tre kÀrnor i SoC-chipsetet: x86 ME, x86 ISH och ARC PMC).
Mildrande ÄtgÀrder
Leverantörer som avsiktligt lÀmnar manufacturing mode öppet bör stÀnga det. Hittills blundar man bara och nya Kaby Lake-system visar detta.
AnvÀndare kan sjÀlva stÀnga av Intel BG pÄ sina system (som Àr utsatta för den beskrivna sÄrbarheten) genom att köra verktyget Flash Programming Tool med parametern -closemnf. Först bör man kontrollera (med hjÀlp av MEinfo) att konfigurationen av Intel BG i regionen ME faktiskt tillÄter att denna teknik stÀngs av efter programmering i FPF:er.
KĂ€lla: habr.com
