Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Pakume taas madalale tasemele laskuda ja rÀÀkida x86-ĂŒhilsete arvutiplatvormide tarkvara turvalisusest. Seekord on uuringu peamine koostisosa Intel Boot Guard (Ă€rge segage Intel BIOS Guard'iga!) – riistvara toetav usaldusvÀÀrse BIOS-i kĂ€ivitamise tehnoloogia, mille tootja vĂ”ib tootmisprotsessis pĂŒsivalt sisse vĂ”i vĂ€lja lĂŒlitada. Uuringu retsept on meile juba tuttav: uurime selle tehnoloogia rakendust tagasivaatava inseneritööga, kirjeldame selle arhitektuuri, tĂ€iendame seda dokumenteerimata detailidega, maitse jĂ€rgi lisame rĂŒnnakusuundi ja segame kokku. Lisame heat lugu sellest, kuidas mitu aastat kloonitud tootmisdefekt vĂ”imaldab potentsiaalsel rĂŒndajal kasutada seda tehnoloogiat sĂŒsteemi eemaldamatuks (isegi programmidega) varjatud rootkit'ide loomiseks.

Muide, artikli pÔhialuseks on ettekanded "Rootkitide kaitsjad: Intel BootGuard" konverentsilt ZeroNights 2016 ja 29. kohtumine DefCon Russia (mÔlemad ettekanded siin).

Intel 64 arhitektuuriga arvutiplatvormide tarkvara

Alustuseks vastame kĂŒsimusele: mis on kaasaegse Intel 64 arhitektuuriga arvutiplatvormi tarkvara? Muidugi, UEFI BIOS. Kuid selline vastus ei ole tĂ€pne. Vaatame joonist, kus on kujutatud selle arhitektuuri lauaarvuti (notebook) versioon.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Aluseks on ĂŒhendus:

  • Protsessor (CPU, Central Processing Unit), kuhu lisaks pĂ”hiydedele on sisse ehitatud graafikatuum (kĂ”ikides mudelites mitte) ja mĂ€lukontroller (IMC, Integrated Memory Controller);
  • Kiibistiku (PCH, Platform Controller Hub), mis sisaldab erinevaid kontrollerid perifeersete seadmete ĂŒhendamiseks ja alamsĂŒsteemide juhtimiseks. Nende seas on kuulus Intel Management Engine (ME), millel on samuti tarkvara (Intel ME firmware).

Lauaarvutid eeldavad lisaks eeltoodule ka sisseehitatud kontrollerit (ACPI EC, Advanced Control and Power Interface Embedded Controller), mis vastutab toite-alamsĂŒsteemi, puuteplaadi, klaviatuuri, Fn-klahvide (ekraani heledus, helitugevus, klaviatuuri valgustus jne) ja muu töökindluse eest. Ka sellel on oma tarkvara.

Nii et, loetletud pĂŒsivara kogum moodustab arvutiplatvormi pĂŒsivara (system firmware), mis on talletatud ĂŒhises SPI vĂ€lkmĂ€lus. Selle mĂ€lu kasutajate segaduse vĂ€ltimiseks on selle sisu jagatud jĂ€rgmistesse piirkondadesse (nagu joonisel nĂ€idatud):

  • UEFI BIOS;
  • ACPI EC pĂŒsivara (eraldiseisev piirkond ilmus Skylake mikroarhitektuuriga (2015. aasta), kuid looduses pole me veel nĂ€inud selle kasutamise nĂ€iteid, seega sisseehitatud kontrolleri pĂŒsivara kuulub endiselt UEFI BIOSi);
  • Intel ME pĂŒsivara;
  • kokkuvĂ”te (MAC-aadress jne) sisseehitatud GbE (Gigabit Ethernet) vĂ”rkaadapteri kohta;
  • vĂ€lkmĂ€lu kirjeldajad (Flash Descriptors) – peamine vĂ€lkmĂ€lu piirkond, mis sisaldab viiteid teistele piirkondadele ning ka juurdepÀÀsuloa Ă”igusi neile.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Piirkondadele juurdepÀÀsu piiramine (vastavalt mÀÀratud Ă”igustele) toimub SPI bussi meistri kaudu – SPI-kontroller, integreeritud kiibistesse, mille kaudu sellele mĂ€lule pÀÀsetakse. Kui Ă”igused on seadistatud soovitatud (turvalisuse kaalutlustel) Intel'i vÀÀrtusteks, on igal SPI vĂ€lkmĂ€lu kasutajal tĂ€ielik (lugemine/kirjutamine) juurdepÀÀs ainult oma piirkonnale. ÜlejÀÀnud on kas ainult lugemiseks saadaval vĂ”i ei ole ĂŒldse kĂ€tte saadavad. Tuntud fakt: paljudes sĂŒsteemides on CPU-l tĂ€ielik juurdepÀÀs UEFI BIOSile ja GbE-le, lugemisĂ”igus ainult vĂ€lkmĂ€ludele, kuid Intel ME piirkonnale juurdepÀÀsu ei ole ĂŒldse. Miks paljudes, aga mitte kĂ”igis? Mis on soovitatav, ei ole tingimata kohustuslik. RÀÀgime sellest lĂ€hemalt artiklis.

Arvutiplatvormi pĂŒsivara kaitse mehhanismid modifikatsioonide eest

Ilmselgelt tuleb arvutiplatvormi pĂŒsivara kaitsta vĂ”imaliku kompromiteerimise eest, mis vĂ”imaldaks potentsiaalsetel kurjategijatel selles kinnituda (kasutades sĂŒsteemiuuendusi / OS-i uuesti installimisi), kĂ€ivitades oma koodi kĂ”ige privileegeeritud reĆŸiimides jne. Ja SPI vĂ€lkmĂ€lu piirkondadele juurdepÀÀsu piiramine ei ole piisav. SeetĂ”ttu kasutatakse pĂŒsivara modifikatsioonide kaitsmiseks erinevaid mehhanisme, mis on spetsiifilised iga tĂ€itmisĂ”hkkonna jaoks.

Nii on Intel ME pĂŒsivara allkirjastatud, et kontrollida sisukuse ja autentsuse ĂŒle, ning seda kontrollib ME-kontroller igal korral, kui see laaditakse ME UMA mĂ€llu. Seda kinnitamise protsessi oleme juba kĂ€sitlenud ĂŒhes meie artikleid, mille Intel ME subsystemile.

ACPI EC pĂŒsivara kontrollitakse tavaliselt ainult terviklikkuse osas. Kuid kuna see binaar on osa UEFI BIOS-ist, kehtivad sellele peaaegu alati samad kaitsemehhanismid, mida kasutab UEFI BIOS. RÀÀgime neist.

Need mehhanismid vÔib jagada kaheks kategooriaks.

Kaitse kirjutamise eest UEFI BIOS piirkonda

  1. SPI vĂ€lkmĂ€lu fĂŒĂŒsiline kaitse write-protect jumperiga;
  2. UEFI BIOS piirkonna projektsiooni kaitse CPU aadressiruumi PRx veebiregistrite kaudu;
  3. UEFI BIOS piirkonda kirjutamise katsete blokeerimine vastava SMI katkestuse genereerimise ja töötlemise kaudu, seades BIOS_WE/BLE ja SMM_BWP bitid chipseti registrites;
  4. TĂ€psem variant sellisest kaitset on Intel BIOS Guard (PFAT).

Lisaks nendele mehhanismidele saavad mĂŒĂŒjad vĂ€lja töötada ja rakendada oma turvameetmeid (nĂ€iteks UEFI BIOS uuenduste kapslite digitaalallkirjastamine).

Oluline on mĂ€rkida, et konkreetsetes sĂŒsteemides (sĂ”ltuvalt mĂŒĂŒjast) ei pruugi kĂ”ik eespool mainitud kaitsemehhanismid olla rakendatud, need vĂ”ivad olla ĂŒldse mitte rakendatud vĂ”i vĂ”ivad olla haavatavalt rakendatud. Rohkem nendest mehhanismidest ja nende rakendamise olukorrast saab lugeda selles artiklis. Huvi korral soovitame tutvuda kogu UEFI BIOS turvalisuse artiklite tsĂŒkliga, mille on koostanud CodeRush.

UEFI BIOS autentsuse kontrollimine

Kui rÀÀgime usaldusvÀÀrse laadimise tehnoloogiatest, tuleb esimese asjana meelde Secure Boot. Kuid arhitektuuriliselt on see mĂ”eldud UEFI BIOS-ist vĂ€ljaspool asuvate komponentide (draiverite, laadijate jne) autentsuse kontrollimiseks, mitte ise pĂŒsivara jaoks.

SeetĂ”ttu realiseeris Intel Bay Traili mikroarhitektuuriga SoC-ides (2012. aastal) riistvaralise, vĂ€ljalĂŒlitamatu Secure Boot (Verified Boot), mis ei ole seotud eespool mainitud Secure Boot tehnoloogiaga. Hiljem (2013. aastal) tĂ€iustati seda mehhanismi ja selle nime all Intel Boot Guard vabastati lauaarvutite jaoks, mille mikroarhitektuur on Haswell.

Enne Intel Boot Guard'i kirjeldamist vaatame ĂŒle Intel 64 arhitektuuri tĂ€itmisruumid, mis on samas usaldusvÀÀrsuse juured selle usaldusvÀÀrse laadimise tehnoloogia jaoks.

Intel CPU

KĂ€p ĂŒtleb, et protsessor on Intel 64 arhitektuuri peamine tĂ€itmisruum. Miks see ka usaldusvÀÀrsuse juur on? Selgub, et selleks teeb ta selle jĂ€rgmiste elementide olemasolu:

  • Microcode ROM — energia sĂ”ltumatu, mittetöötav mĂ€lu mikrokoodi salvestamiseks. Arvatakse, et mikrokood on protsessori kĂ€su sĂŒsteemi teostamine lihtsates kĂ€skudes. Mikrokoodis esineb samuti vigu. Seega leidub BIOS-is binare, mis sisaldavad mikrokoodi vĂ€rskendusi (need laaditakse kĂ€ivitamise ajal, kuna ROM-i ei saa ĂŒmber kirjutada). Nende binaride sisu on krĂŒpteeritud, mis oluliselt raskendab analĂŒĂŒsi (seetĂ”ttu teadlikud mikrokoodi tĂ€psest sisust on ainult need, kes seda arendavad), ja allkirjastatud, et tagada terviklikkust ja autentsust;
  • AES vĂ”ti mikrokoodi vĂ€rskenduste sisu dekrĂŒpteerimiseks;
  • RSA avaliku vĂ”tme hash, millega kontrollitakse mikrokoodi vĂ€rskenduste allkirja;
  • RSA avaliku vĂ”tme hash, millega kontrollitakse Intel'i vĂ€lja töötatud koodimoodulite ACM (Authenticated Code Module) allkirja, mida CPU vĂ”ib kĂ€ivitada enne BIOSi tĂ€itmist (tervitame mikrokoodi) vĂ”i selle töö ajal, teatavate sĂŒndmuste toimumisel.

Intel ME

Sellele alamsĂŒsteemile on meie blogis pĂŒhendatud kuni kaks artikleid. Tuletame meelde, et see kĂ€ivitatav keskkond pĂ”hineb kiibistikus oleva mikroprotsessoril ja on sĂŒsteemi kĂ”ige varjatum ja privileegitud.

Hoolimata varjatusest on Intel ME samuti usaldusjuur, kuna sellel on:

  • ME ROM — energia sĂ”ltumatu, mittetöötav mĂ€lu (uuendamiseks meetod ei ole ette nĂ€htud), mis sisaldab alguskoodi ning SHA256 RSA avaliku vĂ”tme hash, millega kontrollitakse Intel ME pĂŒsivara allkirja;
  • AES vĂ”ti salajase teabe hoidmiseks;
  • juurdepÀÀs kiibistikusse integreeritud fusible'ide (FPFs, Field Programmable Fuses) komplektile, et pĂŒsivalt hoida teatud teavet, sealhulgas ka tootja mÀÀratud teavet arvutisĂŒsteemis.

Intel Boot Guard 1.x

VÀike kÀsk. Artiklis kÀsitletavad Intel Boot Guard tehnoloogia versioonide numbrid on tinglikud ning vÔivad mitte vastata sellele numbrid, mida rakendatakse Intel'i sise-dokumentatsioonis. Lisaks on siin esitatud teave selle tehnoloogia rakendamise kohta saadud pöördemeteorite kaudu ja vÔib sisaldada ebatÀpsusi vÔrreldes Intel Boot Guard'i spetsifikatsiooniga, mida tÔenÀoliselt kunagi ei avalikustata.

Nii et, Intel Boot Guard (BG) on riistvara toetav UEFI BIOSi autentimise tehnoloogia. LĂ€htuvalt selle lĂŒhikesest kirjeldusest raamatus [Platform Embedded Security Technology Revealed, peatĂŒkk Boot with Integrity, or Not Boot], töötab see usaldusvÀÀrse kĂ€ivitamise ahelana. Ja esimene lĂŒli selles on kĂ€ivituskoodeks (mikrokood) CPU sees, mis aktiveeritakse RESET sĂŒndmuse korral ( Ă€ra sega seda BIOSi RESET-vektoriga!). CPU leiab SPI vĂ€lkmĂ€lust Intel'i poolt loodud ja allkirjastatud koodimooduli (Intel BG startup ACM), laadib selle oma vahemĂ€lu, kinnitab (ĂŒleval on juba mĂ€rgitud, et CPU-l on avaliku vĂ”tme sĂ”rmjĂ€lg, millega kontrollitakse ACM-i allkirja) ja kĂ€ivitab.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard

See koodimoodul vastutab UEFI BIOSi vĂ€ikese algosade — Algse KĂ€ivitusploki (IBB) — autentimise eest, mis omakorda sisaldab funktsionaalsust UEFI BIOSi peamise osa autentimiseks. Seega vĂ”imaldab Intel BG veenduda BIOSi autentsuses enne operatsioonisĂŒsteemi laadimist (mis vĂ”ib toimuda Secure Boot tehnoloogia jĂ€relevalve all).

Intel BG tehnoloogia hĂ”lmab kahte tööreĆŸiimi (milles ĂŒks ei sega teist, s.t. mĂ”lemat reĆŸiimi saab sĂŒsteemis sisse lĂŒlitada vĂ”i mĂ”lemad vĂ€lja lĂŒlitada).

Measured Boot

Measured Boot (MB) reĆŸiimis "mÔÔdab" iga kĂ€ivituskomponent (alates CPU boot ROM'ist) jĂ€rgmist, kasutades TPM (Trusted Platform Module) funktsioone. Neile, kes ei tea, selgitame.

TPM-il on PCR-id (Platform Configuration Registers), kuhu salvestatakse hĂŒvitisoperatsiooni tulemus valemiga:

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard

Seega sĂ”ltub praegune PCR-i vÀÀrtus eelnevast, samas kui need registrid nullitakse ainult sĂŒsteemi RESETimise korral.

Seega, MB reĆŸiimis peegeldavad PCR-id teatud hetkel ainulaadset (hĂŒvitamisoperatsiooni vĂ”imaluste piires) koodi vĂ”i andmete identifikaatorit, mida "mÔÔdeti". PCR-i vÀÀrtusi saab kasutada mĂ”nedel andmete krĂŒpteerimisoperatsioonidel (TPM_Seal). PĂ€rast seda on nende dekrĂŒpteerimine (TPM_Unseal) vĂ”imalik ainult siis, kui PCR-i vÀÀrtused kĂ€ivitamise tulemusel ei ole muutunud (s.t. ĂŒhtegi "mÔÔdetud" komponenti ei ole muudetud).

Verified Boot

KĂ”ige hirmutavam UEFI BIOSi modifitseerijatele on Verified Boot (VB) reĆŸiim, kus iga kĂ€ivituskomponent kontrollib krĂŒptograafiliselt jĂ€rgmise terviklikkust ja autentsust. Ja juhul, kui kinnitamine ebaĂ”nnestub, toimub ĂŒks jĂ€rgmistest:

  • aja alajamisku aeg 1 minutist 30 minutini (et kasutaja saaks aru, miks tema arvuti ei kĂ€ivitu ja, kui vĂ”imalik, prooviks BIOS-i taastada);
  • kohene vĂ€ljalĂŒlitus (et kasutaja ei saaks midagi aru ja veel vĂ€hem midagi teha);
  • töötamine rahuliku nĂ€oga (see on olukord, kus turvalisus ei ole prioriteet, sest on olulisemaid asju).

Tegevuse valik sĂ”ltub mÀÀratud Intel BG konfiguratsioonist (nimelt nn enforcement policy), mis on platvormi tootja poolt pĂŒsivalt salvestatud spetsiaalsesse salvestuspaika – kiibistikufuusidesse (FPF). RÀÀgime sellest punktist hiljem rohkem.

Lisaks konfiguratsioonile genereerib tootja kaks RSA 2048 vÔtme ja loob kaks andmestruktuuri (nagu on kujutatud joonisel):

  1. Tootja juurvÔtme manifest (KEYM, OEM Root Key Manifest), kuhu paigutatakse selle manifesti SVN (Security Version Number), jÀrgmise manifesti SHA256 rÀsivÀÀrtus, RSA avalik vÔti (st tootja juurvÔtme avalik osa) selle manifesti allkirja kontrollimiseks ja allkiri ise;
  2. IBB manifest (IBBM, Initial Boot Block Manifest), kuhu paigutatakse selle manifesti SVN, IBB SHA256 rÀsivÀÀrtus, avalik vÔti selle manifesti allkirja kontrollimiseks ja allkiri ise.

OEM Root Key avaliku vĂ”tme SHA256 rĂ€sivÀÀrtus salvestatakse pĂŒsivalt kiibistikufuusidesse (FPF), nagu ka Intel BG konfiguratsioon. Kui Intel BG konfiguratsioon hĂ”lmab selle tehnoloogia sisselĂŒlitamist, siis alates sellest hetkest saab BIOS-i uuendada (st neid manifeste uuesti arvutada) ainult OEM Root Key privaatosa omanik, st tootja.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard

Pildi vaatamisel tekivad kohe kahtlused, kas selline pikk valideerimise ahel on vajalik – oleks vĂ”inud kasutada ĂŒhte manifesti. Miks keeruliseks muuta?

Tegelikult annab Intel tootjale vĂ”imaluse kasutada erinevaid IBB vĂ”tmeid oma toodete erinevate seeriate jaoks ja ĂŒhte – juurena. Kui IBB vĂ”tme privaatosa (millega allkirjastatakse teine manifest) lekib, mĂ”jutab see ainult ĂŒhte tootesarja ja ainult seni, kuni tootja genereerib uue paari ja lisab ĂŒmber arvutatud manifestid jĂ€rgmise BIOS-i uuenduse juurde.

Kuid kui juurvĂ”ti (millega esimene manifest allkirjastatakse) on kompromiteeritud, ei saa seda asendada, kuna revokatsiooni protseduure ei ole ette nĂ€htud, kuna selle vĂ”tme avaliku osa rĂ€si programmeeritakse FPF-ides ĂŒhe korra ja igaveseks.

Intel Boot Guardi konfiguratsioon

NĂŒĂŒd peatume detailselt Intel BG konfiguratsioonil ja selle loomise protsessil. Kui vaadata vastavat vahekaarti Intel System Tool Kit (STK) komplekti Flash Image Tooli kasutajaliideses, vĂ”ib mĂ€rgata, et Intel BG konfiguratsioon sisaldab mĂŒĂŒja juurvĂ”tme avaliku osa rĂ€si, paar arusaamatut vÀÀrtust ja nn Intel BG profiili.

Schrödingeri usaldusvÀÀrne kÀivitamine. 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 tee midagi
                                              // 01b – vĂ€ljalĂŒlitus ajastusega
                                              // 11b – kohe vĂ€ljalĂŒlitus
	unsigned long : 26;
};

Üldiselt on Intel BG konfiguratsioon vĂ€ga paindlik. VĂ”tame nĂ€iteks lipu Force_Boot_Guard_ACM. Kui see on vĂ€lja lĂŒlitatud, siis juhul, kui BG startup ACM-i moodulit SPI sealĂŒlitusmĂ€lu ei leita, ei toimu usaldusvÀÀrset kĂ€ivitamist. Toimub usaldusvÀÀrne.

Oleme juba varem kirjutanud, et VB-reĆŸiimi jĂ”ustamispoliitikat saab seadistada nii, et verifitseerimisvea korral toimub taas usaldusvÀÀrne kĂ€ivitamine.

Seda tuleb jĂ€tta mĂŒĂŒjate otsustada...

Kasutajaliidese utiliit sisaldab jÀrgmisi 'valmis' profiile:

Number
ReĆŸiim
Kirjeldus

0
No_FVME
Intel BG tehnoloogia on vĂ€lja lĂŒlitatud

1
VE
VB reĆŸiim on sisse lĂŒlitatud, vĂ€ljalĂŒlitus ajastusega

2
VME
MĂ”lemad reĆŸiimid on sisse lĂŒlitatud (VB ja MB), vĂ€ljalĂŒlitus ajastusega

3
VM
MĂ”lemad reĆŸiimid on sisse lĂŒlitatud, ilma sĂŒsteemi vĂ€ljalĂŒlitamiseta

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

5
FVME
MĂ”lemad reĆŸiimid on sisse lĂŒlitatud, kohene vĂ€ljalĂŒlitus

Nagu juba mainitud, peab Intel BG konfiguratsioon olema ĂŒks kord ja igaveseks sĂŒsteemi mĂŒĂŒja poolt salvestatud kiibisti fĂŒĂŒsi (FPF-ide) sisse – vĂ€ike (uskumatute andmete kohaselt vaid 256 baiti) riistvaraline teabehoidla kiibisti sees, mida saab programmeerida vĂ€ljaspool ettevĂ”tte Intel tootmisvĂ”imsust (seega on see Field Programmable Fuses).

See sobib suurepÀraselt konfiguratsiooni hoidmiseks, sest:

  • omab ĂŒhekordselt programmeeritavat ala andmete hoidmiseks (just sinna salvestatakse Intel BG konfiguratsioon);
  • ainult Intel ME vĂ”ib seda lugeda ja programmeerida.

Nii, et seadistada Intel BG tehnoloogia konfiguratsioon konkreetsele sĂŒsteemile, teeb tootja tootmisprotsessi ajal jĂ€rgmist:

  1. Intel STK-st pÀrit Flash Image Tool utiliidi abil luuakse firmware'i pilt, kus on mÀÀratletud Intel BG konfiguratsioon Intel ME piirkonna muutujates (nn ajutine peegeldus FPF-ide jaoks);
  2. Intel STK-st pĂ€rit Flash Programming Tool utiliidi abil kirjutatakse see pilt sĂŒsteemi SPI mĂ€lule ja suletakse nn tootmisreĆŸiim (samal ajal saadetakse vastav kĂ€sk Intel ME-le).

Nende toimingute tulemusena kinnitab Intel ME FPF-ides nĂ€idatud vÀÀrtused peegeldusest ME piirkonnas, mÀÀrab SPI mĂ€lupöörduslube soovitatud Intel'i vÀÀrtusteks (kuidas see artikli alguses kirjeldatud) ja teostab sĂŒsteemi RESET-i.

Intel Boot Guard'i rakenduse analĂŒĂŒs

Kuna selle tehnoloogia rakenduse analĂŒĂŒsimiseks kontrollisime jĂ€rgmisi sĂŒsteeme Intel BG jĂ€lgede olemasolu osas:

SĂŒsteem
MĂ€rkus

Gigabyte GA-H170-D3H
Skylake, tugi olemas

Gigabyte GA-Q170-D3H
Skylake, tugi olemas

Gigabyte GA-B150-HD3
Skylake, tugi olemas

MSI H170A Gaming Pro
Skylake, tugi puudub

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

Lenovo Yoga 2 Pro
Haswell, tugi puudub

Lenovo U330p
Haswell, tugi puudub

Allpool mĂ”istetakse ‘toetust’ Intel BG kĂ€ivitamise ACM mooduli, ĂŒlalmainitud manifestide ja BIOS-is oleva vastava koodi olemasolu, st rakendust analĂŒĂŒsimiseks.

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

Intel CPU boot ROM

Esiteks rÀÀgime protsessori tegevustest, kui Intel BG tehnoloogia on aktiveeritud.

DeĆĄifreeritud mikrokoodi nĂ€idiseid ei leidunud, seega on see, kuidas allpool kirjeldatud tegevused on rakendatud (mikrokoodis vĂ”i riistvara tasandil) avatud kĂŒsimus. Siiski, see, et tĂ€napĂ€evased Intel protsessorid suudavad neid toiminguid teostada – on fakt.

PÀrast RESET-olekust vÀljumist leiab protsessor (kelle aadressiruumis on juba mappitud mÀlusisaldus) FIT tabeli (Firmware Interface Table). Selle leidmine on lihtne, viidatakse sellele aadressil FFFF FFC0h.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Antud nÀite puhul asub sellel aadressil vÀÀrtus FFD6 9500h. Selle aadressi poole pöördudes nÀeb protsessor FIT tabelit, mille sisu on jagatud sissekanneteks. Esimene sissekanne on jÀrgmise struktuuri pealkiri:

typedef struct FIT_HEADER
{
	char           Tag[8];     // ‘_FIT_’
	unsigned long  NumEntries; // sh FIT pÀise sissekanne
	unsigned short Version;    // 1.0
	unsigned char  EntryType;  // 0
	unsigned char  Checksum;
};

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Tundmatu pÔhjusel ei ole kontrolsummat nendes tabelites alati arvutatud (vÀli on jÀetud nulliks).

ÜlejÀÀnud kirjed viitavad erinevatele binaarfailidele, mis tuleb analĂŒĂŒsida/teostada enne BIOSi kĂ€ivitamist, st enne ĂŒleminekut pĂ€randi 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;
};

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
VĂ€li EntryType nĂ€itab ploki tĂŒĂŒpi, millele see eelmine 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
};

NĂŒĂŒd on selge, et ĂŒks kirje viitab Intel BG kĂ€ivitamise ACM binaari asukohale. Selle binaari pealkirja struktuur on tĂŒĂŒpiline Inteli vĂ€lja töötatud koodimoodulite (ACM-id, mikrokoodi uuendused, Intel ME koodimoodulid jne) jaoks.

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

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Protsessor laadib selle binaari oma vahemÀllu, valideerib selle ja kÀivitab.

Intel BG kÀivitus ACM

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

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

Nende manifestide leidmiseks kasutab ACM samuti FIT tabelit, milles on mÀÀratud kaks tĂŒĂŒpi kirjeid, mis viitavad andmestruktuurile (vt FIT_ENTRY_TYPES kiirelt ĂŒle).

Peatuge mÔneks ajaks manifestide juures. Esimese manifesti struktuuris nÀeme mitmeid ebaselgeid konstante, teise manifesti avaliku vÔtme rÀsi ja OEM Root Key avalikku vÔtit koos allkirjaga 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];
};

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
OEM Root Key avalike avaliku vÔtme verifitseerimiseks kasutatakse SHA256 koodi, mis on antud hetkel juba saadud Intel ME-lt.

Liigume edasi teise mansiifi juurde. See koosneb kolmest struktuurist:

typedef struct IBB_MANIFEST
{
	ACBP Acbp;         // KĂ€ivituspoliiid
	IBBS Ibbs;         // IBB kirjeldus
	IBB_DESCRIPTORS[];
	PMSG Pmsg;         // IBBM allkiri
};

Esimeses – mĂ”ned konstantid:

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 ja number deskriptoritest, mis kirjeldavad IBB sisu (st. mida arvestatakse hash'ina):

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, ĂŒks teise jĂ€rel. Nende sisu on jĂ€rgmise vormiga:

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

KĂ”ik on lihtne: iga deskriptor sisaldab IBB tĂŒki aadressi/suureust. Seega on nende deskriptorite (oma asukoha jĂ€rjekorras) nĂ€idatud plokkide konkateneerimine IBB. Ja reeglina on IBB kĂ”igi SEC ja PEI faasi moodulite kogum.

Teine mansiif lÔpetab struktuur, mis sisaldab IBB avalikku vÔtit (verifitseerib SHA256 hash'iga esimesest mansiifiz) ja selle mansiifi allkirja:

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

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Seega, enne UEFI BIOS tÀitmise algust kÀivitab protsessor ACM-i, mis kontrollib SEC- ja PEI-faasi koodiosade sisu autentsust. Edasi liigub protsessor ACM-ist, lÀheb RESET-vektorisse ja hakkab BIOS-i tÀitma.

Verifitseeritud PEI jaotises peab olema moodul, mis kontrollib BIOS-i ĂŒlejÀÀnud osa (DXE kood). Selle mooduli arendab IBV (Independent BIOS Vendor) vĂ”i sĂŒsteemi tootja ise. Kuna vĂ€lja tulnud sĂŒsteemid, mis toetavad Intel BG-d, olid ainult Lenovo ja Gigabyte, vaatleme koodi, mis on saadud just neist sĂŒsteemidest.

UEFI BIOS moodul LenovoVerifiedBootPei

Lenovo puhul osutus see mooduliks LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, mille on vÀlja töötanud Lenovo.

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

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Àrgmise formaadiga:

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 puhul osutus see mooduliks BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, mille on vÀlja töötanud AMI, seega on see igas AMI BIOS-is, mis toetab Intel BG-d.

Selle algoritm on pisut erinev, kuid kokkuvÔttes on selle tööpÔhimÔte sama:

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-tabel {389CC6F2-1EA8-467B-AB8A-78E769AE2A15}, mida ta otsib, on jÀrgmise formaadiga:

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ÀÀgime lĂŒhidalt veel ĂŒhest Intel Boot Guard rakendusest, mis leiti uuemas sĂŒsteemis, mis pĂ”hineb Intel SoC-l mikroarhitektuuriga Apollo Lake — ASRock J4205-IT.

Kuigi seda versiooni rakendatakse ainult SoC-del (uued sĂŒsteemid protsessorite mikroarhitektuuriga Kaby Lake kasutavad endiselt Intel Boot Guard 1.x), on see huvitav uuringu allikaks uue arhitektuuri variandi kohta Intel SoC platvormides, kus on toimunud mĂ€rgatavad muudatused, nĂ€iteks:

  • BIOS ja Intel ME (tĂ€psemalt Intel TXE, vastavalt terminoloogiale Intel SoC-i jaoks) on nĂŒĂŒd ĂŒks IFWI piirkond;
  • kuigi platvormil oli lubatud Intel BG, selliseid struktuure nagu FIT, KEYM, IBBM ei leitud vĂ€lkmĂ€lust;
  • kui TXE ja ISH kiipe (x86) on lisatud kolmas kiip (jĂ€llegi ARC, muide) – PMC (Power Management Controller), mis on seotud toitesĂŒsteemi töökindluse ja jĂ”udluse jĂ€lgimisega.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Uue IFWI piirkonna sisu koosneb jÀrgmistest moodulitest:

Positiivne
Name
Kirjeldus

0000 2000h
SMIP
mingi platvormi konfiguratsioon, allkirjastatud tarnija poolt

0000 6000h
RBEP
Intel TXE, x86 sĂŒsteemifaili koodilĂ”ik, allkirjastatud Intel

0001 0000h
PMCP
Intel PMC, ARC sĂŒsteemifaili koodilĂ”ik, allkirjastatud Intel

0002 0000h
FTPR
Intel TXE, x86 sĂŒsteemifaili koodilĂ”ik, allkirjastatud Intel

0007 B000h
UCOD
CPU mikrokoodiuuendused, allkirjastatud Intel

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

0021 8000h
ISHC
Intel ISH sĂŒsteemifaili koodilĂ”ik, x86, allkirjastatud tarnija poolt

0025 8000h
NFTP
Intel TXE, x86 sĂŒsteemifaili koodilĂ”ik, allkirjastatud Intel

0036 1000h
IUNP
teadmata

0038 1000h
OBBP
UEFI BIOS, DXE faas, x86, allkirjastamata

TXE firmavara analĂŒĂŒsi kĂ€igus selgus, et pĂ€rast RESET-i hoiab TXE protsessorit selles olekus kuni see valmistab ette CPU aadressiruumi pĂ”hilise sisu (FIT, ACM, RESET-vektor ...). Lisaks paigutab TXE need andmed enda SRAM-i, andes pĂ€rast seda protsessorile ajutise juurdepÀÀsu sinna ja "vabastab" selle RESET-ist.

Rootkitide kaitsel

Kuid nĂŒĂŒd liigume "kuumale" teemale. Ühel pĂ€eval avastasime, et paljude sĂŒsteemide SPI vĂ€lkmĂ€lu kirjeldustes on salvestatud juurdepÀÀsuĂ”igused SPI vĂ€lkmĂ€lu piirkondadele nii, et kĂ”ik selle mĂ€lu kasutajad saavad kirjutada ja lugeda igasuguseid piirkondi. See tĂ€hendab, et mingit juurdepÀÀsu ei olnud.

Kontrollides Intel STK tööriista MEinfo abil, nĂ€gime, et nende sĂŒsteemide tootmisreĆŸiim ei olnud suletud, seega jĂ€eti kiibistiku fĂŒĂŒsi (FPF) mÀÀratlemata olekusse. Jah, Intel BG ei olnud niisugustes olukordades ei sisse lĂŒlitatud ega vĂ€lja lĂŒlitatud.

RÀÀkides jĂ€rgmistes sĂŒsteemidest (Intel BG kohta ja sellest, mis kĂ€esolevas artiklis edasi tuleb, rÀÀgime Haswell ja uuemate protsessori mikroarhitektuuridega sĂŒsteemidest):

  • kĂ”ik Gigabyte tooted;
  • kĂ”ik MSI tooted;
  • 21 Lenovo sĂŒlearvuti mudelit ja 4 Lenovo serveri mudelit.

Muidugi, teavitasime neist avastustest neid tarnijaid ja ka Intelit.

Adekvaatne reaktsioon jÀrgnes ainult Lenovolt, kes tunnustasid probleemi ja vÀljastasid plaane.

Gigabyte nÀiliselt vÔtsid nad teavet haavatavuse kohta vastu, kuid ei kommenteerinud seda.

Suhtlus MSI-ga meie palve saata oma avalik PGP-vĂ”ti (et saata neile turvateade krĂŒpteeritud kujul) on tĂ€iesti peatunud. Nad vĂ€idavad, et "on seadmete tootja ja PGP-vĂ”tmeid ei tooteta".

Aga lÀheme asja juurde. Kuna fusid on jÀÀnud mÀÀramata, saab kasutaja (vÔi kurjategija) need ise programmeerida (kÔige keerulisem on leida Intel STK). Selleks tuleb teha jÀrgmised toimingud.

1. KĂ€ivita Windowsi operatsioonisĂŒsteem (ĂŒldiselt saab jĂ€rgnevate sammude teha ka Linuxi alt, kui arendada Intel STK-le sarnane lahendus vajalikule OS-ile). Kasutades MEinfo utiliiti, veendu, et sellel sĂŒsteemil ei ole fusid programmeeritud.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
2. Loe vÀlkmÀlu sisu Flash Programming Tool abil.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
3. Ava loetud pilt mistahes UEFI BIOS-i redigeerimise vahendiga, tee vajalikud muudatused (nÀiteks implementeeri rootkit), loo/muuda olemasolevaid struktuure KEYM ja IBBM ME piirkonnas.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Pildil on esiletĂ”stetud RSA vĂ”tme avalik osa, mille hash programmeeritakse chipseti fusidesse koos ĂŒlejÀÀnud Intel BG konfiguratsiooniga.

4. Kogu Flash Image Tool abil uus pildifail kokku (mÀÀrates Intel BG konfiguratsiooni).

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
5. Kirjuta uus pildifail vĂ€lkmĂ€llu Flash Programming Tool abil, veendu MEinfo abil, et ME piirkond sisaldab nĂŒĂŒd Intel BG konfiguratsiooni.

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
6. Sulge tootmisreĆŸiim Flash Programming Tool abil.

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

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Need toimingud lĂŒlitavad Intel BG igaveseks sellele sĂŒsteemile. Tegu ei saa olema tagasi vĂ”etud, mis tĂ€hendab:

  • et sellel sĂŒsteemil saab UEFI BIOS-i vĂ€rskendada ainult see, kellel on juurvĂ”tme privaatne osa (st kes lĂŒlitas Intel BG sisse);
  • kui selle sĂŒsteemi originaal firmware tagastatakse nĂ€iteks programmeerija kaudu, ei lĂŒlitu see isegi sisse (tulemus poliitika jĂ”ustamisest verifitseerimise vea korral);
  • sellest UEFI BIOS-ist vabanemiseks tuleb asendada chipset programmeeritud FPF-idega "puhta" (st kui sul on juurdepÀÀs autot vÀÀrt infrapuna jootmisjaamale, vĂ”i lihtsalt asendada emaplaat).

Ettekujutamiseks, mida selline rootkit vĂ”ib korda saata, tuleb hinnata, mis annab vĂ”imaluse kĂ€ivitada oma kood UEFI BIOS-is. Öelgem, et kĂ”ige privileegeeritud protsessorireĆŸiimis – SMM. Sellisel rootkitil vĂ”ivad olla jĂ€rgmised omadused:

  • kĂ€ivituda paralleelselt OS-iga (saab seadistada töötama SMI katkestuse genereerimise jĂ€rgi, mis aktiveeritakse ajastuse jĂ€rgi);
  • omada kĂ”iki SMM-reĆŸiimi eeliseid (tĂ€ielik juurdepÀÀs RAM-i sisule ja riistvarale, OS-ist varjamine);
  • rootkiti programmikood vĂ”ib olla salajases vormis ja dekrĂŒpteeritakse kĂ€ivitamisel SMM-reĆŸiimis. KrĂŒpteerimise vĂ”tmena vĂ”ib kasutada mis tahes andmeid, mis on saadaval ainult SMM-reĆŸiimis. NĂ€iteks, SMRAM-i aadresside komplekti hash. Selle vĂ”tme saamiseks tuleb siseneda SMM-i. Seda saab teha kahel viisil. Leida RCE SMM koodis ja seda Ă€ra kasutada vĂ”i lisada BIOS-i oma SMM-modul, mis ei ole vĂ”imalik, kuna oleme lĂŒlitanud sisse Boot Guard.

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

  • luua sĂŒsteemis peidetud, kustutamatut rootkitit tundmatu eesmĂ€rgiga;
  • kĂ€ivitada oma kood Intel SoC-i sees ĂŒhe kiibi tuumades, nimelt Intel ISH-s (vaatame pilti tĂ€helepanelikult).

Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Schrödingeri usaldusvÀÀrne kÀivitamine. Intel Boot Guard
Kuigi Intel ISH alamsĂŒsteemi vĂ”imalusi ei ole veel uuritud, tundub see olevat huvitav rĂŒnnaku suund Intel ME-le.

JĂ€reldused

  1. Uuring vÔimaldas saada tehnilise kirjelduse Intel Boot Guard tehnoloogia tööst. Intel'i mudeli obscurity kaudu turvalisus pole kuigi ahvatlev.
  2. Esitletud on rĂŒnnaku stsenaarium, mis vĂ”imaldab luua sĂŒsteemis kustutamatut rootkit'i.
  3. Oleme nÀinud, et tÀnapÀevased Intel'i protsessorid suudavad kÀivitada palju patenteeritud koodi enne BIOS-i alustamist.
  4. Intel 64 arhitektuuriga platvormid muutuvad ĂŒha vĂ€hem sobivaks vabatahtliku tarkvara kĂ€ivitamiseks: riistvaraline kinnitamine, ĂŒha kasvav hulk patenteeritud tehnoloogiaid ja alamsĂŒsteeme (kolm tuuma SoC kiibistikus: x86 ME, x86 ISH ja ARC PMC).

Leevendused

Tootjatele, kes jĂ€tavad tahtlikult tootmisreĆŸiimi avatuks, tuleks see kindlasti kinni panna. Praegu suletakse ainult silmad ja uued Kaby Lake sĂŒsteemid nĂ€itavad seda.

Kasutajad saavad oma sĂŒsteemides (mis on vastuvĂ”tlikud eespool mainitud haavatavusele) Intel BG ise vĂ€lja lĂŒlitada, kĂ€ivitades Flash Programming Tooli parameetriga -closemnf. Enne seda tuleks veenduda (MEinfo abil), et Intel BG konfigureerimine ME piirkonnas vĂ”imaldab tĂ”epoolest selle tehnoloogia vĂ€ljalĂŒlitamist pĂ€rast FPF-ides programmeerimist.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster