Betrodd uppladdning av Schrödinger. Intel Boot Guard

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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 ZeroNights 2016 och det 29:e mötet DefCon Russia (bÄda presentationerna hÀr).

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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
Å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 artiklar, 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

  1. Fysisk skydd av SPI-flashminnets innehÄll med en write-protect jumper;
  2. Skydd av UEFI BIOS-regionens projektionsadress i CPU:s minnesutrymme med hjÀlp av PRx-register i chipsetet;
  3. 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;
  4. 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 denna artikel. För den intresserade rekommenderar vi att lÀsa hela artikelserien om sÀkerheten hos UEFI BIOS frÄn CodeRush.

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Ă„ buggar. 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 tvÄ artiklar. 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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard

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:

Betrodd uppladdning av Schrödinger. Intel Boot Guard

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

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

Betrodd uppladdning av Schrödinger. Intel Boot Guard

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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard

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:

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

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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;
};

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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;
};

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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];
};

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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];
};

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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;
};

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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 slÀppte en patch.

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 att hitta Intel STK). 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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
2. LÀsa innehÄllet i flashminnet med hjÀlp av Flash Programming Tool.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
Betrodd uppladdning av Schrödinger. Intel Boot Guard
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).

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
6. Med hjÀlp av Flash Programming Tool stÀnga av tillverkningslÀget.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
7. Systemet kommer att starta om, varefter man med MEinfo kan bekrÀfta att FPF:erna nu Àr programmerade.

Betrodd uppladdning av Schrödinger. Intel Boot Guard
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).

Betrodd uppladdning av Schrödinger. Intel Boot Guard
Betrodd uppladdning av Schrödinger. Intel Boot Guard
Ä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

  1. 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.
  2. Ett angreppsscenario har presenterats som möjliggör skapandet av en oupptÀckbar rootkit i systemet.
  3. Vi har sett att moderna Intel-processorer kan köra mycket proprietÀr kod innan BIOS börjar arbeta.
  4. 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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster