Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
RÀÀgime jĂ€lle madalast tasemest ja kĂ”neleme x86-ĂŒhilduvate arvutusplatvormide tarkvarade turvalisusest. Seekord on uurimise peamine komponent Intel Boot Guard (mitte segi ajada Intel BIOS Guard'iga!) – riistvaraliselt toetatud BIOS-i usaldusvÀÀrse kĂ€ivitamise tehnoloogia, mille tootja saab tootmisprotsessi kĂ€igus pidevalt aktiveerida vĂ”i deaktiveerida. Uurimise retsept on meile juba tuttav: viilutada rikka pikaajalise analĂŒĂŒsi abil selle tehnoloogia rakendust, kirjeldada selle arhitektuuri, tĂ€iendades dokumenteerimata detailidega, lisada maitse jĂ€rgi rĂŒnnakusuundi ning segada kokku. Tuleb lisada ka tuleku jutustamine, kuidas mitmete tootjate pikaajaline tootmisviga vĂ”imaldab potentsiaalsetel kurjategijatel kasutada seda tehnoloogiat sĂŒsteemis eemaldamatute (isegi programmeerija poolt) varjatud rootkitide loomiseks.

Muide, artikli aluseks on ettekanded "Ruutkittide kaitsel: Intel BootGuard" konverentsil ZeroNights 2016 ja 29. kohtumine DefCon Russia (mÔlemad esitlused siit).

Arvutusplatvormi tarkvara Intel 64 arhitektuuriga

Alustuseks vastame kĂŒsimusele: mis on tĂ€napĂ€eva Intel 64 arhitektuuri arvutiplatvormi pĂŒsivara? Muidugi, UEFI BIOS. Kuid see vastus ei ole tĂ€pne. Vaatame joonist, kus on kujutatud selle arhitektuuri lauaarvuti (vĂ”i sĂŒlearvuti) versiooni.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Aluseks on kombinatsioon:

  • Protsessor (CPU, Central Processing Unit), kuhu on integreeritud graafikatuum (kui mitte kĂ”igis mudelites) ja mĂ€lukontroller (IMC, Integrated Memory Controller);
  • Kiibist (PCH, Platform Controller Hub), mis sisaldab erinevaid kontrollerite komponente, mis suhtlevad perifeersete seadmetega ning haldavad all sĂŒsteeme. Nende seas on ka tuntud Intel Management Engine (ME), millel on samuti oma pĂŒsivara (Intel ME firmware).

SĂŒlearvutites eeldatakse, et lisaks ĂŒlaltoodud komponentidele on olemas ka sisseehitatud kontroller (ACPI EC, Advanced Control and Power Interface Embedded Controller), mis vastutab toitesĂŒsteemi, puuteplaadi, klaviatuuri, Fn-klahvide (ekraani heledus, heli valjus, klaviatuuri valgustus jne) ja muu töövĂ”ime eest. Ka sellel on oma pĂŒsivara.

Seega on ĂŒlaltoodud pĂŒsivara kogum arvutiplatvormi pĂŒsivara (system firmware), mis salvestatakse ĂŒhisesse SPI vĂ€lkmĂ€lusse. Et kasutajad ei segaks, kellel on milline, on see mĂ€lu jagatud jĂ€rgnevateks piirkondadeks (nagu on nĂ€idatud joonisel):

  • UEFI BIOS;
  • ACPI EC pĂŒsivara (eraldi piirkond ilmus koos Skylake protsessori mikroarhitektuuriga (2015. aasta), kuid praktikas ei ole me veel nĂ€inud selle kasutamise nĂ€iteid, seega jÀÀb sisseehitatud kontrolleri pĂŒsivara endiselt UEFI BIOS-i koostisosaks);
  • Intel ME pĂŒsivara;
  • integreeritud GbE (Gigabit Ethernet) vĂ”rkaadlase konfiguratsioon (MAC-aadress jne);
  • vĂ€lkmĂ€lude descriptorid (Flash Descriptors) – peamine vĂ€lkmĂ€lu piirkond, mis sisaldab viiteid teistele piirkondadele ning juurdepÀÀsus lubade haldamist.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
SPI-vööndi haldamine (s vastavalt mÀÀratud lubadele) toimub SPI-sillaga, mis on integreeritud SPI-kontrollerisse, mille kaudu pÀÀseb juurde sellele mĂ€lule. Kui loodud load on Intel'i soovitatud vÀÀrtustes (turvalisuse kaalutlustel), siis on iga SPI flash-mĂ€lu kasutajal tĂ€ielik ligipÀÀs (lugemine/kirjutamine) ainult oma piirkonnale. ÜlejÀÀnud on kas ainult lugemiseks vĂ”i ĂŒldse ligipÀÀsetavad. On teada, et paljudes sĂŒsteemides on CPU-l tĂ€ielik ligipÀÀs UEFI BIOS-ile ja GbE-le, lugemisĂ”igus ainult flash-deskriptoritele ning Intel ME piirkonnale ei ole ĂŒldse ligipÀÀsu. Miks paljudes, mitte kĂ”igis? See, mis on soovitatav, ei ole tingimata kohustuslik. Loodame sellest rohkem rÀÀkida artikli edasises osas.

Arvutiplatvormi pĂŒsivara kaitsemehhanismid modifitseerimise vastu

On ilmne, et arvutiplatvormi pĂŒsivara tuleks kaitsta vĂ”imaliku kompromiteerimise vastu, mis vĂ”iks vĂ”imaldada potentsiaalsel rĂŒndajal sĂŒsteemi jÀÀda (elu uuendustes / OS-i uuesti installimises), kĂ€ivitada oma koodi kĂ”ige privileege pakkuvatel reĆŸiimidel jne. Ja juurdepÀÀsu jagamine SPI flash-mĂ€lu piirkondadele ei ole loomulikult piisav. SeetĂ”ttu kasutatakse pĂŒsivara kaitsmiseks muudatuste eest erinevaid mehhanisme, mis on spetsiifilised iga tĂ€itmiskeskkonna jaoks.

NĂ€iteks on Intel ME pĂŒsivara allkirjastatud, et kontrollida terviklikkust ja autentsust, ning seda kontrollitakse ME-kontrolleri poolt iga kord, kui see laaditakse ME UMA mĂ€llu. Seda kontrollimisprotsessi oleme juba kĂ€sitlenud ĂŒhes meie artiklites, mis kĂ€sitleb Intel ME alamsĂŒsteemi.

ACPI EC pĂŒsivara kontrollitakse tavaliselt vaid terviklikkuse osas. Kuid kuna see binaarosa on osa UEFI BIOS-ist, kehtivad sellele peaaegu alati samad kaitsemehhanismid, mida kasutab UEFI BIOS. Nendest rÀÀgimegi.

Need mehhanismid vÔib jagada kahte kategooriasse.

Kirjutuskaitse UEFI BIOS piirkonnas

  1. SPI flash-mĂ€lu sisu fĂŒĂŒsiline kaitse write-protect jumperiga;
  2. UEFI BIOS-i piirkonna kaitse CPU aadressiruumi PRx registreerimiseks chipseti kaudu;
  3. Katsed UEFI BIOS-i piirkonna kirjutamisÔiguste lukustamine vastava SMI katkestuse genereerimise ja töötlemise kaudu chipseti BIOS_WE/BLE ja SMM_BWP bitide seadistamisega;
  4. Kavandatud kaitse edasiarendus on Intel BIOS Guard (PFAT).

Lisaks nendele mehhanismidele saavad tarnijad arendada ja rakendada ka oma turvameetmeid (nÀiteks UEFI BIOS-i uuenduste kapslite allkirjastamine).

Oluline on mĂ€rkida, et konkreetses sĂŒsteemis (tarnijast sĂ”ltuvalt) ei pruugi rakenduda kĂ”ik eespool nimetatud kaitsemehhanismid, need ei pruugi ĂŒldse rakenduda vĂ”i vĂ”ivad olla haavatavalt rakendatud. TĂ€psemalt nende mehhanismide ja nende rakendamise olukorra kohta saab lugeda selles artiklis. Soovitame huvilistel tutvuda terve UEFI BIOS-i turvateemaline artiklite tsĂŒkkel CodeRush.

UEFI BIOS-i autentimise kontrollimine

Kui rÀÀgime usaldusvÀÀrsete kĂ€ivitustehnoloogiate kohta, tuleb esimesena meelde Secure Boot. Siiski on see arhitektuuriliselt mĂ”eldud UEFI BIOS'ile vĂ€liste komponentide (draiverite, kĂ€ivitajate jne) autentimise kontrollimiseks, mitte selle enda pĂŒsivara kontrollimiseks.

SeetĂ”ttu rakendas Intel 2012. aastal Bay Trail mikroarhitektuuriga SoC-ides riistvaralist mittevĂ€ljalĂŒlitatavat Secure Boot'i (Verified Boot), mis ei ole seotud eelnevalt mainitud Secure Boot tehnoloogiaga. Hiljem (2013. aastal) tĂ€iustati seda mehhanismi ja see toodi turule Intel Boot Guard nime all lauaarvutitele Haswell mikroarhitektuuriga.

Enne Intel Boot Guard'i kirjeldamist uurime Intel 64 arhitektuuri tÀitmise keskkondi, mis samal ajal on selle usaldusvÀÀrse kÀivitustehnoloogia usaldusallikad.

Intel CPU

KĂ€p ĂŒtleb, et protsessor on pĂ”hiline tĂ€itmise keskkond Intel 64 arhitektuuris. Miks ta on usaldusallikas? Tundub, et see tuleneb tema jĂ€rgmistest omadustest:

  • Mikrokood ROM — volatility-free, non-rewritable memory for storing microcode. It is believed that microcode is the implementation of the processor's instruction set in simple commands. Bugs can also occur in microcode. bugs. Therefore, the BIOS can contain binaries with microcode updates (applied during boot time, as ROM cannot be rewritten). The content of these binaries is encrypted, which greatly complicates analysis (thus, specific microcode content is known only to those who develop it) and is signed to ensure integrity and authenticity;
  • AES key for decrypting the content of the microcode updates;
  • hash of the RSA public key used to verify the signature of the microcode updates;
  • hash of the RSA public key used to verify the signature of the Intel company's ACM (Authenticated Code Module) code modules, which the CPU can execute before BIOS execution begins (hello microcode) or during its operation in case of certain events.

Intel ME

Our blog has even dedicated two artikkel. Tulet teadmiseks, et see tĂ€itmis keskkond pĂ”hineb mikrokontrolleris, mis on integreeritud kiibistikku ja on sĂŒsteemis kĂ”ige varjatum ja privileege tĂ€is.

Hoolimata oma varjatusest on Intel ME usaldusallikas, kuna sellel on:

  • ME ROM — energiat mitte vajav, mitte ĂŒmbertĂ”stetav mĂ€lu (uuendamise vĂ”imalust ei ole ette nĂ€htud), mis sisaldab kĂ€ivituskoodi ning SHA256 RSa avaliku keyhashi, millega kontrollitakse Intel ME pĂŒsivara allkirja;
  • AES-vĂ”ti salajase teabe sĂ€ilitamiseks;
  • aitab pÀÀseda kiibistikuga integreeritud fuse'ide komplektile (FPFs, Field Programmable Fuses), et pĂŒsivalt salvestada teatud teavet, sealhulgas selliseid, nagu on mÀÀranud arvutisĂŒsteemi tarnija.

Intel Boot Guard 1.x

VÀike vabandus. Intel Boot Guardi tehnoloogia versiooninumbrid, millega me selles artiklis opereerime, on tinglikud ja ei pruugi mingil moel vastata numbritele, mida kasutatakse Intel'i sise-dokumentatsioonis. Lisaks vÔivad siin toodud andmed selle tehnoloogia rakendamise kohta olla saadud tagasitehnoloogia abil ja need vÔivad sisaldada ebatÀpsusi vÔrreldes Intel Boot Guard'i spetsifikatsiooniga, mis tÔenÀoliselt kunagi ei avalikustata.

Nii et Intel Boot Guard (BG) on riistvaraliselt toetatud UEFI BIOS'i autentimise tehnoloogia. LĂ€htuvalt selle vĂ€ikesest kirjelduse lĂ”igust raamatus [Platform Embedded Security Technology Revealed, PeatĂŒkk Boot with Integrity, or Not Boot] toimib see kui usaldusvÀÀrne kĂ€ivitusketi element. Ja esimene lĂŒli selles on kĂ€ivituskood (mikrokood), mis on CPU sees ja mis aktiveeritakse RESET sĂŒndmuse korral (Ă€ra sega seda BIOS'i RESET-vektoriga!). CPU leiab SPI vĂ€lkmĂ€lust Intel'i vĂ€lja töötatud ja allkirjastatud koodimooduli (Intel BG startup ACM), laadib selle oma vahemĂ€llu, verifitseerib (eelnevalt mainitud, et CPU-l on selleks avaliku vĂ”tme hash, millega kontrollitakse ACM'i allkirja) ja kĂ€ivitab.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard

See koodimoodul vastutab UEFI BIOS-i vĂ€ikese algusosa — algse laadimissektori (IBB) tuvastamise eest, mis omakorda sisaldab funktsionaalsust UEFI BIOS-i pĂ”hiosa tuvastamiseks. Nii vĂ”imaldab Intel BG veenduda BIOS-i autentsuses enne operatsioonisĂŒsteemi kĂ€ivitamist (mis vĂ”ib toimuda Secure Boot tehnoloogia jĂ€relevalve all).

Intel BG tehnoloogia hĂ”lmab kahte tööreĆŸiimi (kusjuures ĂŒks ei sega teist, st mĂ”lemad reĆŸiimid vĂ”ivad olla sĂŒsteemis sisselĂŒlitatud vĂ”i vĂ€lja lĂŒlitatud).

Measured Boot

Measured Boot (MB) reĆŸiimis "mÔÔdab" iga laadimisosa (alustades CPU boot ROM-ist) jĂ€rgmist, kasutades TPM (Trusted Platform Module) vĂ”imalusi. Neile, kes ei ole kursis, anname lĂŒhikese seletuse.

TPM-il on PCR-id (Platform Configuration Registers), kuhu salvestatakse sÔnumi hashimise tulemused, kasutades valemit:

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard

Seega sĂ”ltub praegune PCR-i vÀÀrtus eelmisest, kusjuures andmed registreid nullitakse ainult sĂŒsteemi RESET-i korral.

Seega, MB-reĆŸiimis peegeldavad PCR-id mingil hetkel unikaalset (vastavalt hashing-operations vĂ”imalustele) koodi vĂ”i andmete identifikaatorit, mis on "mÔÔdetud". PCR-i vÀÀrtusi vĂ”ib kasutada mĂ”nede andmete krĂŒpteerimise operatsioonides (TPM_Seal). PĂ€rast seda on nende dekodeerimine (TPM_Unseal) vĂ”imalik ainult siis, kui PCR-i vÀÀrtused ei ole laadimise kĂ€igus muutunud (st ĂŒhtegi "mÔÔdetud" komponenti ei ole modifitseeritud).

Verified Boot

Verified Boot (VB) reĆŸiim on kĂ”ige hirmutavam UEFI BIOS-i modifitseerimise armastajate jaoks, kuna iga kĂ€ivitamise komponent kontrollib krĂŒptograafiliselt jĂ€rgmise terviklikkust ja ehtsust. Ja kui kontrollimisel tekib viga, toimub ĂŒks jĂ€rgmistest:

  • vĂ€ljalĂŒlitamine 1 minutist 30 minutini (et kasutaja saaks aru, miks tema arvuti ei kĂ€ivitu ja vajadusel prooviks BIOS-i taastada);
  • kohene vĂ€ljalĂŒlitamine (et kasutaja ei oleks suuteline aru saama ja veel vĂ€hem midagi tegema);
  • töötamine rahuliku nĂ€oga (tuleb ette haruldasi olukordi, kus turvalisus ei ole prioriteet, kuna tegemist on olulisematega).

Tegevuse valik sĂ”ltub mÀÀratud Intel BG konfiguratsioonist (nimelt nn enforcement policy), mis on arvutiplatvormi mĂŒĂŒja pĂŒsivalt salvestatud spetsiaalsesse salvestusse – chipseti fuse'desse (FPF-id). Sellel hetkel peatume hiljem rohkem.

Lisaks konfiguratsioonile genereerib mĂŒĂŒja kaks RSA 2048 vĂ”tit ja loob kaks andmestruktuuri (nagu on kujutatud pildil):

  1. MĂŒĂŒja juurvĂ”tme manifest (KEYM, OEM Root Key Manifest), kuhu lisatakse selle manifesti SVN (Security Version Number), jĂ€rgnevate manifestide SHA256 rĂ€mps, RSA avalik vĂ”tme (st mĂŒĂŒja juurvĂ”tme avalik osa) allkirja kontrollimiseks ja ise allkiri;
  2. IBB manifest (IBBM, Initial Boot Block Manifest), kuhu lisatakse selle manifesti SVN, IBB SHA256 rÀmps, allkirja kontrollimiseks avalik vÔtme ja ise allkiri.

OEM Root Key SHA256 avaliku vĂ”tme hash salvestatakse pĂŒsivalt kiibi fusioonides (FPF), nagu ka Intel BG konfiguratsioonis. Kui Intel BG konfiguratsioon vĂ”imaldab selle tehnoloogia aktiveerimist, siis alates sellest hetkest saab antud sĂŒsteemis BIOS-i uuendada (st nende manifestide uuesti arvutamine) ainult OEM Root Key privaatse osa omanik, st tarnija.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard

Pildile vaadates tekivad kohe kĂŒsimused, kas on tĂ”epoolest vajalik nii pikk kontrollimisĂ”hk — oleks vĂ”inud kasutada ĂŒht manifesti. Miks keerulisemaks muuta?

Tegelikult annab Intel sel viisil tarnijale vĂ”imaluse kasutada erinevaid IBB vĂ”tmeid oma toodete erinevate rida jaoks ning ĂŒht — juurena. Kui IBB vĂ”tme privaatne osa (millega teine manifest allkirjastatakse) lekib, mĂ”jutab intsident ainult ĂŒht toote seeriat ja ainult seni, kuni tarnija genereerib uue paari ja hĂ”lvab arvutatud manifestid jĂ€rgmises BIOS-i uuenduses.

Kuid kui juurvĂ”ti (mille abil allkirjastatakse esimene manifakt) on kompromiteeritud, ei ole selle vahetamine vĂ”imalik, kuna revokatsiooniprotseduuri ei ole ette nĂ€htud. Selle pĂ”hivĂ”tme avaliku osa hash on programmeeritud FPF-idesse ĂŒks kord ja igaveseks.

Intel Boot Guardi konfiguratsioon

NĂŒĂŒd vaatame lĂ€hemalt Intel BG konfiguratsiooni ja selle loomise protsessi. Kui vaadata Intel System Tool Kit (STK) komplekti Flash Image Tool kasutajaliideses vastavat vahekaarti, on nĂ€ha, et Intel BG konfiguratsioon sisaldab tootja juurvĂ”tme avaliku osa hash'i, paar arusaamatut vÀÀrtust ja nn Intel BG profiili.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard

Selle profiili struktuur:

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 – ei midagi teha
                                              // 01b – vĂ€ljalĂŒlitamine ajaga
                                              // 11b – kohene vĂ€ljalĂŒlitamine
	unsigned long : 26;
};

Üldiselt on Intel BG konfiguratsioon vĂ€ga paindlik. Vaatame nĂ€iteks lippu Force_Boot_Guard_ACM. Kui see on vĂ€lja lĂŒlitatud ja kui BG startup ACM mitte leiab SPI vĂ€lkmĂ€lust, siis ei toimu usaldusvÀÀrset laadimist. Toimub usaldusvÀÀrne laadimine.

Oleme juba varem maininud, et VB reĆŸiimi jĂ”ustamispoliitikat saab seadistada nii, et kinnituse tĂ”rke korral toimub jĂ€llegi usaldusvÀÀrne laadimine.

JĂ€tta sellised asjad tarnijate otsustada


GUI tööriist sisaldab jÀrgmisi "valmis" profiile:

Number
ReĆŸiim
Kirjeldus

0
No_FVME
Intel BG tehnoloogia on vÀljas

1
VE
VB reĆŸiim on aktiveeritud, vĂ€ljalĂŒlitus ajapiiranguga

2
VME
mĂ”lemad reĆŸiimid (VB ja MB) on aktiveeritud, vĂ€ljalĂŒlitus ajapiiranguga

3
VM
mĂ”lemad reĆŸiimid on aktiveeritud, sĂŒsteemi ei vĂ€ljalĂŒlitata

4
FVE
VB reĆŸiim on aktiveeritud, kohene vĂ€ljalĂŒlitus

5
FVME
mĂ”lemad reĆŸiimid on aktiveeritud, kohene vĂ€ljalĂŒlitus

Kuna juba mainitud, peab Intel BG konfiguratsioon olema ĂŒks kord ja igaveseks tarnija poolt kirjutatud sĂŒsteemi fusioonidesse (FPF-id) – vĂ€ikesele (vĂ€idetavalt ainult 256 baidi) riistvaralisele andmehoidla, mis asub kiibistikus ja mida saavad programmeerida vĂ€ljaspool ettevĂ”tte Intel tootmisvĂ”imekust (seetĂ”ttu just Field Programmable Fuses).

See on suurepÀrane konfiguratsiooni salvestamiseks, kuna:

  • tal on ĂŒhekordselt programmeeritav ala andmete salvestamiseks (just sinna, kuhu salvestatakse Intel BG konfiguratsioon);
  • seda suudab lugeda ja programmeerida ainult Intel ME.

Seega, et konfiguratsioon teha Intel BG tehnoloogiat konkreetsele sĂŒsteemile, teostab tootja tootmisprotsessi kĂ€igus jĂ€rgmist:

  1. Intel STK-s asuva Flash Image Tooli abil loob ta spetsifitseeritud Intel BG konfiguratsiooni firmavariandi (nn ajutine peegel FPF-ide jaoks);
  2. Flash Programming Tooli abil (ka Intel STK-s) kirjutab selle pildi sĂŒsteemi SPI vilkuvale mĂ€lule ja lĂ”petab nn tootmisreĆŸiimi (samal ajal saadetakse vastav kĂ€sk Intel ME-le).

Nende toimingute tulemusena kinnitab Intel ME FPF-idesse peeglisse salvestatud vÀÀrtused ja seadistab SPI vilkuva mĂ€lu descriptorid soovitatavateks ettevĂ”tte Intel vÀÀrtusteks (nagu artikli alguses kirjeldatud) ning teostab sĂŒsteemi RESET-i.

Intel Boot Guardi implementatsiooni analĂŒĂŒs

Konkreetse nĂ€ite analĂŒĂŒsimiseks kontrollisime jĂ€rgmisi sĂŒsteeme Intel BG tehnoloogia jĂ€lgede osas:

SĂŒsteem
MĂ€rkus

Gigabyte GA-H170-D3H
Skylake, toetus olemas

Gigabyte GA-Q170-D3H
Skylake, toetus olemas

Gigabyte GA-B150-HD3
Skylake, toetus olemas

MSI H170A Gaming Pro
Skylake, toetus puudub

Lenovo ThinkPad 460
Skylake, toetus olemas, tehnoloogia sisse lĂŒlitatud

Lenovo Yoga 2 Pro
Haswell, toetus puudub

Lenovo U330p
Haswell, toetus puudub

Allal "toetuse" all mĂ”istetakse Intel BG kĂ€ivitamise ACM mooduli olemasolu, eespool mainitud manifestide ja vastava koodi olemasolu BIOS-is, st rakendust analĂŒĂŒsimiseks.

NÀiteks vÔtame ametlikult veebisaidilt alla laaditud Gigabyte GA-H170-D3H (versioon F4) SPI mÀlupulga pildi.

Intel CPU kÀivitamise ROM

Esiteks rÀÀgime processor'i tegevustest, kui Intel BG tehnoloogia on aktiveeritud.

Dekodeeritud mikroprogrammi nĂ€idiseid ei leitud, seetĂ”ttu on kĂŒsimus, kuidas allpool kirjeldatud tegevused on rakendatud (mikroprogrammis vĂ”i riistvaras) endiselt avatud. Sellegipoolest on fakt, et kaasaegsed Intel protsessorid "oskavad" neid toiminguid teostada.

PÀrast RESET olekust vÀljumist leiab protsessor (mille aadressiruumi on juba mappitud flash-mÀlu sisu) FIT (Firmware Interface Table) tabeli. Selle leidmine on lihtne, viidatud aadress on kirjutatud aadressile FFFF FFC0h.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
TÀpsemal juhul on sellel aadressil vÀÀrtus FFD6 9500h. Kui protsessor pöördub sellele aadressile, nÀeb ta FIT tabelit, mille sisu on jagatud kirjeteks. Esimene kirje on jÀrgmise struktuuri pealkiri:

typedef struct FIT_HEADER
{
	char           Tag[8];     // ‘_FIT_   ’
	unsigned long  NumEntries; // including FIT header entry
	unsigned short Version;    // 1.0
	unsigned char  EntryType;  // 0
	unsigned char  Checksum;
};

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Tundub, et kontrollsummat ei arvestata nendes tabelites sageli (vÀli jÀÀb nulliks).

ÜlejÀÀnud kirjed viitavad erinevatele binaarfailidele, mille need tuleb parsoida/teostada enne BIOSi kĂ€ivitamist, st enne ĂŒleminekut pĂ€rand RESET-vektorile (FFFF FFF0h). Iga sellise kirje struktuur on jĂ€rgmine:

typedef struct FIT_ENTRY
{
	unsigned long  BaseAddress;
	unsigned long  : 32;
	unsigned long  Size;
	unsigned short Version;     // 1.0
	unsigned char  EntryType;
	unsigned char  Checksum;
};

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
EntryType vĂ€li nĂ€itab ploki tĂŒĂŒpi, millele see kirje viitab. Meil on teada mitmeid tĂŒĂŒpe:

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

On nĂŒĂŒd selge, et ĂŒks kirje viitab Intel BG kĂ€ivitamise ACM binaari asukohale. Selle binaari pĂ€ise struktuur on tĂŒĂŒpiline Intel ettevĂ”tte arendatud koodimoodulitele (ACM-ed, mikrokoodi vĂ€rskendused, Intel ME koodijooned, 
).

typedef struct BG_ACM_HEADER
{
	unsigned short ModuleType;     // 2
	unsigned short ModuleSubType;  // 3
	unsigned long  HeaderLength;   // in dwords
	unsigned long  : 32;
	unsigned long  : 32;
	unsigned long  ModuleVendor;   // 8086h
	unsigned long  Date;           // in BCD format
	unsigned long  TotalSize;      // in dwords
	unsigned long  unknown1[6];
	unsigned long  EntryPoint;
	unsigned long  unknown2[16];
	unsigned long  RsaKeySize;     // in dwords
	unsigned long  ScratchSize;    // in dwords
	unsigned char  RsaPubMod[256];
	unsigned long  RsaPubExp;
	unsigned char  RsaSig[256];
};

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Protsessor laadib selle binaari enda vahemÀllu, kinnitab selle ja kÀivitab.

Intel BG kÀivitamise ACM

Selle ACM-i tööanalĂŒĂŒsi tulemusena sai selgeks, et see teeb jĂ€rgmist:

  • saab Intel ME-lt Intel BG konfigureerimise, mis on salvestatud kiibi fusioonidesse (FPF-id);
  • leiab KEYM ja IBBM manifestid, kinnitab need.

Nende manifestide leidmiseks kasutab ACM samuti FIT tabelit, kus on mÀÀratud kaks tĂŒĂŒpi kirjeid struktuuri andmete nĂ€itamiseks (vt FIT_ENTRY_TYPES eespool).

Keskendume lÀhemalt manifestidele. Esimese manifesti struktuuris nÀeme mitmeid ebaselgeid konstante, teise manifesti avaliku vÔti ja avaliku vÔtme OEM Root Key koos allkirjaga, mis on sisemises struktuuris:

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

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
OEM Root Key avalikuklahvi verifitseerimiseks kasutatakse SHA256 hash'i fuse'idest, mis on juba saadud Intel ME poolt.

Liigume edasi teise manifesti juurde. See koosneb kolmest struktuurist:

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

Esimeses – mĂ”ned konstantide kirjeldused:

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

Teises on SHA256 hash IBB-st ja number deskriptoritest, mis kirjeldavad IBB sisu (st. millest hash'i arvutatakse):

typedef struct IBBS
{
	char           Tag[8];            // ‘__IBBS__’
	unsigned char  : 8;               // 10h
	unsigned char  : 8;               // 0
	unsigned char  : 8;               // 0
	unsigned char  : 8;               // x <= 0Fh
	unsigned long  : 32;              // x & FFFFFFF8h = 0
	unsigned long  Unknown[20];
	unsigned short : 16;              // 0Bh
	unsigned short : 16;              // 20h == hash size ?
	unsigned char  IbbHash[32];       // SHA256 of an IBB
	unsigned char  NumIbbDescriptors;
};

IBB deskriptorid jĂ€rgivad seda struktuuri ĂŒksteise jĂ€rel. Nende sisu on jĂ€rgmises formaadis:

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

KĂ”ik on lihtne: iga deskriptor sisaldab IBB tĂŒki aadressi/suurust. Seega, nende deskriptorite viidatud plokkide concatenatsioon (deskriptorite jĂ€rjekorras) moodustab IBB. Üksikasjalikumalt on IBB kĂ”igi SEC ja PEI faasi moodulite kogu.

Teine manifest lÔpetab struktureeritud, mis sisaldab IBB avalikku vÔtit (kontrollitakse esimesest manifestist SHA256 hash'iga) ja selle manifesti allkirja:

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

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Seega, enne UEFI BIOS kÀivitamist alustab protsessor ACM-i, mis kontrollib SEC ja PEI koodifaasi sektsioonide sisu autentisust. Edasi liigub protsessor ACM-ist vÀlja, lÀheb RESET-vektorile ja hakkab BIOS-i tÀitma.

Verifitseeritud PEI sektsioon peab sisaldama moodulit, mis kontrollib BIOS-i ĂŒlejÀÀnud osa (DXE kood). Selle mooduli arendab IBV (Independent BIOS Vendor) vĂ”i sĂŒsteemi tootja ise. Kuna meie kĂ€sutuses olevad ja Intel BG-d toetavad sĂŒsteemid olid ainult Lenovo ja Gigabyte, vaatleme koodi, mis on vĂ€lja tĂ”stetud just nendest sĂŒsteemidest.

UEFI BIOS moodul LenovoVerifiedBootPei

Lenovo korral osutus see mooduliks LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, mille on arendanud Lenovo.

Selle töö seisneb DXE jaoks hash-tabeli otsimises (GUID jÀrgi) ja DXE kontrollimises.

if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
	if (!FindHashTable())
		return EFI_NOT_FOUND;
	if (!VerifyDxe())
		return EFI_SECURITY_VIOLATION;
}

Hash tabel {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} on jÀrgneva vorminguga:

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 moodul BootGuardPei

Gigabyte'i puhul osutus see olema BootGuardPei moodul {B41956E1-7CA2-42DB-9562-168389F0F066}, mille on vÀlja töötanud AMI, seega on see olemas igas AMI BIOS-is, mis toetab Intel BG.

Selle töö algoritm on veidi teine, kuid pÔhineb samadel pÔhimÔtetel:

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

Otsitav hash tabel {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} on jÀrgmise vorminguga:

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

RÀÀkime lĂŒhidalt veel ĂŒhest Intel Boot Guard rakendusest, mis leiti uuemas Intel SoC-pĂ”hises sĂŒsteemis, mille mikroarhitektuur on Apollo Lake — ASRock J4205-IT.

Kuigi see versioon rakendub ainult SoC-ides (uued sĂŒsteemid Kaby Lake'i mikroarhitektuuriga jĂ€tkavad Intel Boot Guard 1.x kasutamist), on see suur huvi uue arhitektuuri variandi uurimise osas Intel SoC platvormide jaoks, kus on toimunud mĂ€rgatavad muutused, nĂ€iteks:

  • BIOS-i ja Intel ME (tĂ€psemalt Intel TXE, vastavalt Intel SoC terminoloogiale) piirkonnad on nĂŒĂŒd ĂŒks IFWI piirkond;
  • Kuigi platvormil oli sisse lĂŒlitatud Intel BG, ei leitud mĂ€lust selliseid struktuure nagu FIT, KEYM, IBBM;
  • Lisaks x86 TXE ja ISH tuumadele on kiibistikku lisatud kolmas tuum (muide, taas ARC) – PMC (Power Management Controller), mis on seotud energiahalduse ja jĂ”udluse jĂ€lgimise tagamisega.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Uue IFWI piirkonna sisu koosneb jÀrgmistest moodulitest:

Asemik
Nimi
Kirjeldus

0000 2000h
SMIP
mingi platvormi konfiguratsioon, allkirjastatud tarnijaga

0000 6000h
RBEP
Intel TXE, x86, allkirjastatud Intel’i poolt, firmware koodiosa

0001 0000h
PMCP
Intel PMC, ARC, allkirjastatud Intel’i poolt, firmware koodiosa

0002 0000h
FTPR
Intel TXE, x86, allkirjastatud Intel’i poolt, firmware koodiosa

0007 B000h
UCOD
CPU mikrokoodi vĂ€rskendused, allkirjastatud Intel’i poolt

0008 0000h
IBBP
UEFI BIOS, SEC/PEI faasid, x86, allkirjastatud tarnijaga

0021 8000h
ISHC
Intel ISH, x86, allkirjastatud tarnijaga, firmware koodiosa

0025 8000h
NFTP
Intel TXE, x86, allkirjastatud Intel’i poolt, firmware koodiosa

0036 1000h
IUNP
teadmata

0038 1000h
OBBP
UEFI BIOS, DXE faas, x86, ei ole allkirjastatud

TXE firmware’ analĂŒĂŒsi kĂ€igus selgus, et pĂ€rast RESET-i hoiab TXE protsessorit selles olekus kuni pĂ”hilise aadressiruumi sisu valmistamiseni CPU jaoks (FIT, ACM, RESET-vektor ...). Samuti paigutab TXE need andmed endasse SRAM-i, pĂ€rast mida annab ajutiselt protsessorile sinna ligipÀÀsu ja "vabastab" selle RESET-ist.

Rootkitide kaitsel

KĂ€ime nĂŒĂŒd "kuumade" teemade juurde. Üks kord avastasime, et paljudes sĂŒsteemides on SPI-flaashi descriptorites salvestatud Ă”igused SPI-flaashmĂ€lu piirkondadele nii, et kĂ”ik selle mĂ€lu kasutajad saavad lugeda ja kirjutada ĂŒkskĂ”ik millisesse piirkonda. See tĂ€hendab, et ei mingit.

MEinfo utiliidi (Intel STK) abil kontrollides nĂ€gime, et nende sĂŒsteemide tootmisreĆŸiim ei olnud suletud, seega on chipseti fusid (FPF-id) jĂ€tatud mÀÀramatuks. Jah, Intel BG ei ole sellistes olukordades kas sisse vĂ”i vĂ€lja lĂŒlitatud.

RÀÀgime jĂ€rgmistest sĂŒsteemidest (intel BG ja selle kohta, mis jĂ€rgnevas artiklis kajastub, kĂ€sitleme Haswelli ja uuemate protsessori mikroarhitektuuride sĂŒsteeme):

  • kogu Gigabyte'i tooteportfell;
  • kogu MSI tooteportfell;
  • 21 Lenovo sĂŒlearvuti mudelit ja 4 Lenovo serveri mudelit.

Loomulikult teavitasime selle leidmisest neid tootjaid ja ka ettevÔtet Intel.

Adekvaatne reaktsioon jÀrgnes ainult Lenovo, kes tunnustasid probleemi ja vÀljastasid plaastri.

Gigabyte kuigi nad tunnustasid haavatavuse teavet, ei kommenteerinud nad kuidagi.

Suhtlemine MSI meie palve saata oma avatud PGP-vĂ”ti (et edastada neile turveteade krĂŒpteeritud kujul) jĂ€i tĂ€ielikult toppama. Nad vĂ€itsid, et "nad on seadmete tootja ja PGP-vĂ”tmeid ei tooda."

Aga lĂ€heme asja juurde. Kuna fusid on jĂ€etud mÀÀramata olekusse, saab kasutaja (vĂ”i rĂŒndaja) need ise programmeerida (kĂ”ige keerulisem on leida Intel STK). Selleks on vaja teha jĂ€rgmised toimingud.

1. Laadige Windowsi opsĂŒsteemi (ĂŒldiselt, jĂ€rgmisi toiminguid saadakse teha ka Linuxilt, kui arendada vajalik Intel STK selle opsĂŒsteemi jaoks). Kasutades MEinfo utiliiti, veenduge, et fusid ei ole antud sĂŒsteemis programmeeritud.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
2. Loe vÀlkmÀlu sisu Flash Programming Tool abil.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
3. Avage loetud pilt igasuguste UEFI BIOSi redigeerimise vahenditega, tehke vajalikud muudatused (nÀiteks sisestage rootkit), looge/muudetage olemasolevad KEYM ja IBBM struktuurid ME piirkonnas.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Pildil on esile tÔstetud RSA vÔtme avalik osa, mille hash programmeeritakse koos muu Intel BG konfiguratsiooniga kiibi fusidesse.

4. Flash Image Tooli abil luua uus parda pildifail (seades Intel BG konfigureerimise).

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
5. Uue pildifaili kirjutamine vĂ€lkmĂ€lu Flash Programming Tooli abil, veenduda MEinfo abil, et ME piirkond sisaldab nĂŒĂŒd Intel BG konfigureerimist.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
6. Flash Programming Tooli abil sulgeda tootereĆŸiim.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
7. SĂŒsteem taaskĂ€ivitub, pĂ€rast mida saab MEinfo abil veenduda, et FPF-id on nĂŒĂŒd programmeeritud.

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Need toimingud kehtestavad Intel BG sellel sĂŒsteemil igaveseks. Tulemusi ei saa tagasi vĂ”tta, mis tĂ€hendab: Uuendada UEFI BIOS-i sellel sĂŒsteemil saab ainult privaatse juurvĂ”tme omanik (st see, kes aktiveeris Intel BG);

  • kui proovida sellele sĂŒsteemile taastada originaal parda pildifail nĂ€iteks programmeerija kaudu, ei kĂ€ivitu see isegi (tagajĂ€rg vigase tĂ”endi olukorras);
  • Selle UEFI BIOS-ist vabanemiseks tuleb asendada kiibistik, millel on programmeeritud FPF-id, "puhas" (st uuesti joota kiibistik, kui pÀÀsete ligi infrapuna jootmisjaamale, mille hind on nagu auto, vĂ”i lihtsalt asendada emaplaat).
  • selliset UEFI BIOS-ist vabanemiseks on vajalik asendada FPF-idega programmeeritud kiibistik "puhta" vastu (st. kui teil on juurdepÀÀs auto hinnalaga infrapuna jootmisjaamale, siis jootke kiibistik ĂŒmber vĂ”i lihtsalt vahetage emaplaat).

Kuna mĂ”ista, mida selline rootkit teha suudab, tuleb hinnata, milliseid vĂ”imalusi annab see oma koodi tĂ€itmiseks UEFI BIOS keskkonnas. Ütleme, et see on protsessori kĂ”ige privileege antud olek – SMM. Sellisel rootkitil vĂ”ivad olla jĂ€rgmised omadused:

  • töötada paralleelselt operatsioonisĂŒsteemiga (saab seadistada töötamise SMI katkestuse genereerimise kaudu, mis aktiveeritakse ajastaja jĂ€rgi);
  • omada kĂ”iki SMM reĆŸiimi eeliseid (tĂ€ielik juurdepÀÀs RAM-i sisule ja riistvarale, varjatus OS-i eest);
  • rootkiti tarkvarakood vĂ”ib olla krĂŒpteeritud kujul ja dekrĂŒpteeritakse SMM reĆŸiimis kĂ€ivitamisel. KrĂŒptimise vĂ”tmena vĂ”ib kasutada mis tahes andmeid, mis on kergesti kĂ€tte saadavad ainult SMM reĆŸiimis. NĂ€iteks SMRAM-i aadresside kogumi hajutamine. Selle vĂ”tme saamiseks tuleb pÀÀseda SMM-i. Ja seda saab teha kahel viisil. Leida RCE SMM koodist ja seda Ă€ra kasutada vĂ”i lisada BIOS-i oma SMM moodul, mis ei ole vĂ”imalik, kuna me oleme sisse lĂŒlitanud Boot Guard.

Seega vĂ”imaldab see haavatavus rĂŒndajal:

  • luua sĂŒsteemis varjatud, eemaldamatud rootkitid teadmata otstarbeks;
  • tĂ€itma oma koodi ĂŒhe Intel SoC kiibi tuuma sees, nimelt Intel ISH (vaatame pilti hoolikalt).

Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Ơrödingeri usaldusvÀÀrne laadimine. Intel Boot Guard
Kuigi Intel ISH allhangete vĂ”imeid pole veel uuritud, tundub see olevat huvitav rĂŒndesuund Intel ME-le.

JĂ€reldused

  1. Uuring vÔimaldas saada tehnilist kirjeldust Intel Boot Guard tehnoloogia toimimisest. Miinus paar saladust Intel'i turvalisuse mudelis, mis tugineb varjamisele.
  2. Esitati rĂŒnnakuskeem, mis vĂ”imaldab sĂŒsteemis luua kustutamatut rootkit'i.
  3. NÀitasime, et tÀnapÀeva Intel protsessorid suudavad kÀivitada palju patenteeritud koodi enne BIOS-i tööle asumist.
  4. Intel 64 arhitektuuriga platvormid muutuvad jĂ€rjest vĂ€hem sobilikuks vabavarade kĂ€itamiseks: riistvaraline kontroll, kasvav arv patenteeritud tehnoloogiaid ja alusĂŒsteeme (kolm tuuma SoC kiibis: x86 ME, x86 ISH ja ARC PMC).

Leevendused

Tarnijad, kes jĂ€tavad tahtlikult tootmisreĆŸiimi avatuks, peaksid selle kindlasti sulgema. Seni sulgevad vaid silmad ja uued Kaby Lake sĂŒsteemid seda nĂ€itavad.

Kasutajad saavad ise Intel BG-d oma sĂŒsteemides (mis on vĂ€lja toodud kirjelduse jĂ€rgi) vĂ€lja lĂŒlitada, kĂ€ivitades utiliidi Flash Programming Tool parameetriga -closemnf. Eelnevalt tuleks veenduda (MEinfo abil), et Intel BG konfigureerimine ME piirkonnas eeldab selle tehnoloogia vĂ€ljalĂŒlitamist pĂ€rast FPF-ide programmeerimist.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster