
TĂ« ofrojmĂ« pĂ«rsĂ«ri tĂ« zbritim nĂ« nivelin e thellĂ« dhe tĂ« diskutojmĂ« pĂ«r sigurinĂ« e firmware-ve tĂ« platformave kompjuterike qĂ« janĂ« tĂ« pĂ«rputhshme me x86. KĂ«tĂ« herĂ«, pĂ«rbĂ«rĂ«si kryesor i hulumtimit Ă«shtĂ« Intel Boot Guard (mos e ngatĂ«rroni me Intel BIOS Guard!) â njĂ« teknologji e mbĂ«shtetur nga hardueri pĂ«r ngarkesĂ«n e besueshme tĂ« BIOS-it, e cila mund tĂ« aktivizohet ose çaktivizohet pĂ«rherĂ« nga prodhuesi i sistemit kompjuterik nĂ« fazĂ«n e prodhimit. E, siç e dimĂ«, receta pĂ«r hulumtimin Ă«shtĂ« e njohur: tĂ« mijmĂ« ndryshe implementimin e kĂ«saj teknologjie me anĂ« tĂ« inxhinierisĂ« sĂ« reverse, tĂ« pĂ«rshkruajmĂ« arkitekturĂ«n e saj, ta mbushim me detaje tĂ« padokumentuara, ta shoqĂ«rojmĂ« me vektorĂ« sulmesh dhe ta pĂ«rziejmĂ«. Do tĂ« shtojmĂ« zjarr me njĂ« tregim pĂ«r mĂ«nyrĂ«n se si njĂ« gabim i prodhimit tĂ« disa prodhuesve, i klonuar pĂ«r vite me radhĂ«, i lejon njĂ« sulmuesi tĂ« potencialshĂ«m tĂ« pĂ«rdorĂ« kĂ«tĂ« teknologji pĂ«r tĂ« krijuar njĂ« rootkit tĂ« fshehtĂ« (edhe nga programuesi) nĂ« sistem.
Për më tepër, baza e artikullit është raportet "Nën mbrojtjen e rootkit-eve: Intel BootGuard" nga konferenca dhe takimi i 29-të (të dyja prezantimet ).
Firmware i platformës kompjuterike me arkitekturën Intel 64
Për të filluar, le të përgjigjemi në pyetjen: çfarë është firmware i një platforme moderne kompjuterike me arkitekturën Intel 64? Sigurisht, UEFI BIOS. Por një përgjigje e tillë do të ishte e pasaktë. Le të shohim në diagramin ku është paraqitur varianti desktop (ose laptop) i kësaj arkitekture.

Baza është një lidhje:
- Procesor (CPU, Njësia Qendrore e Përpunimit), e cila, përveç çerdheve kryesore, ka brenda një njësi grafike (jo në të gjitha modelet) dhe një kontrollues memorie të integruar (IMC, Integrated Memory Controller);
- Ăipseti (PCH, Platform Controller Hub), qĂ« pĂ«rmban kontrollues tĂ« ndryshĂ«m pĂ«r ndĂ«rveprimin me pajisjet periferike dhe menaxhimin e nĂ«n-sistemeve. NdĂ«r ta ndodhet edhe Intel Management Engine (ME), e cila ka gjithashtu firmware (firmware Intel ME).
Laptopët, përveç gjitha elementeve të sipërpërmendura, parashikojnë një kontrollues të integruar (ACPI EC, Advanced Control and Power Interface Embedded Controller), i cili është përgjegjës për funksionimin e nën-sistemit të energjisë, touchpad-it, tastierës, tasteve Fn (ndriçimi i ekranit, volumi i zërit, ndriçimi i tastierës etj.) dhe të tjera. Edhe ai ka firmware të vet.
Pra, përmbledhja e firmware-ve të përmendura është firmware e platformës kompjuterike (system firmware), e cila ruhet në memorie të përbashkët SPI flash. Për t'i ndihmuar përdoruesit e kësaj memorie të mos ngatërrohen se çfarë është çfarë, përmbajtja e kësaj memorie është e ndarë në rajone të ndryshme (siç është treguar në diagram):
- UEFI BIOS;
- firmware e ACPI EC (një rajon i veçantë u shfaq për herë të parë me mikroarkitekturën e procesorëve Skylake (viti 2015), por në praktikë nuk kemi parë shembuj të përdorimit të tij, kështu që firmware i kontrolluesit të integruar vazhdon të jetë pjesë e UEFI BIOS);
- firmware e Intel ME;
- konfigurimi (MAC-adresa etj.) i adaptorit të rrjetit të integruar GbE (Gigabit Ethernet);
- pĂ«rshkrimet flash (Flash Descriptors) â rajoni kryesor i memorjes flash qĂ« pĂ«rmban tregues pĂ«r rajone tĂ« tjera, si dhe lejet pĂ«r akses nĂ« to.

Kufizimi i aksesit nĂ« rajone (nĂ« pĂ«rputhje me lejet e vendosura) realizohet nga mjeshtri i busit SPI â kontrolluesi SPI i integruar nĂ« çipset, pĂ«rmes tĂ« cilit kryhet qasja nĂ« kĂ«tĂ« memorie. NĂ«se lejet janĂ« vendosur nĂ« vlerat e rekomanduara nga Intel (pĂ«r arsye sigurie), atĂ«herĂ« çdo pĂ«rdorues i memorjes SPI flash ka qasje tĂ« plotĂ« (lexim/shkrim) vetĂ«m nĂ« rajonin e tij. Rajonet e tjera â janĂ« ose tĂ« aksesueshme vetĂ«m pĂ«r lexim, ose janĂ« tĂ« paaksesueshme. NjĂ« fakt i njohur: nĂ« shumĂ« sisteme, CPU ka qasje tĂ« plotĂ« nĂ« UEFI BIOS dhe GbE, qasje e leximit vetĂ«m nĂ« pĂ«rshkrimet flash, ndĂ«rsa pĂ«r rajonin Intel ME nuk ka qasje fare. Pse nĂ« shumĂ«, e jo nĂ« tĂ« gjitha? Ajo qĂ« rekomandohet, nuk Ă«shtĂ« e detyrueshme. MĂ« shumĂ« do tĂ« tregojmĂ« nĂ« artikullin nĂ« vijim.
Mekanizmat e mbrojtjes së firmware-it të platformës kompjuterike nga modifikimi
ĂshtĂ« e qartĂ« se firmware i platformĂ«s kompjuterike duhet tĂ« mbrohet nga komprometimi i mundshĂ«m, i cili do tĂ« lejonte njĂ« sulmues tĂ« mundshĂ«m tĂ« vendoset nĂ« tĂ« (pĂ«r tĂ« pĂ«rjetuar pĂ«rditĂ«simet/rinstalimet e OS-sĂ«), tĂ« ekzekutojĂ« kodin e tij nĂ« mĂ«nyrat mĂ« privilegjuese etj. Dhe ndarjet e aksesit nĂ« rajone tĂ« memorjes SPI, sigurisht, nuk janĂ« tĂ« mjaftueshme. Prandaj, pĂ«r tĂ« mbrojtur firmware nga modifikimet, pĂ«rdoren mekanizma tĂ« ndryshĂ«m, tĂ« cilat janĂ« specifike pĂ«r çdo ambient ekzekutimi.
Kështu, firmware e Intel ME është nënshkruar për të kontrolluar integritetin dhe autenticitetin, dhe kontrollohet nga kontrolluesi ME gjatë çdo ngarkese të saj në memorjen ME UMA. Ky proces verifikimi është shqyrtuar më parë në një nga , të kushtuar nën-sistemit Intel ME.
Firmware ACPI EC, në rregull, verifikohet kryesisht për integritet. Megjithatë, për shkak se ky binar është i inkorporuar në UEFI BIOS, ai zakonisht nënkupton të njëjtat mekanizma mbrojtës që përdor UEFI BIOS. Le të flasim për ta.
Këta mekanizma mund të ndahen në dy kategori.
Mbrojtja e shkruar në rajonin UEFI BIOS
- Mbrojtja fizike e përmbajtjes së memorjes SPI flash me një jumper të mbrojtjes nga shkrimi;
- Mbrojtja e projektionit të rajonit UEFI BIOS në hapësirën adresuese të CPU-së me ndihmën e regjistrave PRx të çipit;
- Bllokimi i përpjekjeve për të shkruar në rajonin UEFI BIOS përmes gjenerimit dhe përpunimit të një ndërprerje SMI duke vendosur bitët BIOS_WE/BLE dhe SMM_BWP në regjistrat e çipit;
- Një variant më i avancuar i tillë mbrojtjeje është Intel BIOS Guard (PFAT).
Përveç këtyre mekanizmave, furnizuesit mund të zhvillojnë dhe aplikojnë masa të tjera të sigurisë (për shembull, nënshkrimi i kapsulave me përditësime UEFI BIOS).
ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se nĂ« njĂ« sistem tĂ« caktuar (varet nga furnizuesi) mund tĂ« mos zbatohen tĂ« gjitha mekanizmat e pĂ«rmendur mĂ« sipĂ«r, mund tĂ« mos pĂ«rdoren fare, ose mund tĂ« kenĂ« implementimin qĂ« ndaj Ă«shtĂ« i dobĂ«t. MĂ« shumĂ« rreth kĂ«tyre mekanizmave dhe situatĂ«s me implementimin e tyre mund tĂ« lexoni nĂ« . PĂ«r ata qĂ« janĂ« tĂ« interesuar, rekomandojmĂ« tĂ« shikoni tĂ« gjithĂ« ciklin e artikujve mbi sigurinĂ« UEFI BIOS nga .
Verifikimi i autentikitetit UEFI BIOS
Kur flasim për teknologjitë e ngarkesës të besueshme, e para që vjen në mend është Secure Boot. Megjithatë, në mënyrë arkitektonike, ai është menduar për të verifikuar autentikitetin e komponentëve jashtë UEFI BIOS (drejtues, ngarkues etj.), dhe jo për firmware-në e vet.
Prandaj, kompania Intel në SoC-të me arkitekturën mikro të Bay Trail (viti 2012) implementoi një Secure Boot të papërshtatshëm që nuk mund të fiket (Verified Boot), i cili nuk ka lidhje me teknologjinë Secure Boot të përmendur më parë. Më vonë (në vitin 2013) ky mekanizëm u përmirësua dhe nën emrin Intel Boot Guard u lëshua për desktop-et me mikroarkitekturën Haswell.
Para se të përshkruajmë Intel Boot Guard, le të kuptojmë mjediset e ekzekutimit në arkitekturën Intel 64, të cilat bashkërisht janë rrënjët e besueshmërisë për këtë teknologji të ngarkesës të besueshme.
Intel CPU
Kapiteni tregon se procesori është mjedisi kryesor i ekzekutimit në arkitekturën Intel 64. Pse është ai rrënja e besueshmërisë? Duket se kjo e bën atë posedimi i elementeve të mëposhtme:
- Microcode ROM â njĂ« memorie jo e ndjeshme ndaj energjisĂ«, e pakopjuar pĂ«r ruajtjen e mikrocode. Mendohet se mikrocode Ă«shtĂ« implementimi i sistemit tĂ« komandave tĂ« procesorit nĂ« instruksione mĂ« tĂ« thjeshta. NĂ« mikrocode gjithashtu ndodhin . KĂ«shtu, nĂ« BIOS mund tĂ« gjeni binarĂ« me pĂ«rditĂ«sime tĂ« mikrocode (tĂ« ngulitura gjatĂ« ngarkesĂ«s, pasi ROM nuk mund tĂ« pĂ«rditĂ«sohet). PĂ«rmbajtja e kĂ«tyre binarĂ«ve Ă«shtĂ« e enkriptuar, gjĂ« qĂ« e komplikon ndjeshĂ«m analizĂ«n (prandaj, pĂ«rmbajtja specifike e mikrocode Ă«shtĂ« e njohur vetĂ«m atyre qĂ« e zhvillojnĂ« atĂ«), dhe Ă«shtĂ« nĂ«nshkruar pĂ«r tĂ« kontrolluar integritetin dhe autentikitetin;
- ĂelĂ«si AES pĂ«r dekriptimin e pĂ«rmbajtjes sĂ« pĂ«rditĂ«simeve tĂ« mikrocode;
- hash publik për çelësin RSA, me të cilin verifikohet nënshkrimi i përditësimeve të mikrocode;
- hash publik për çelësin RSA, me të cilin verifikohet nënshkrimi i moduleve të kodeve të kufizuara të prodhuara nga Intel (Authenticated Code Module), të cilat CPU mund t'i ekzekutojë para se të fillojë ekzekutimin e BIOS (përshëndetje mikrocode) ose gjatë funksionimit të tij, në rast të disa ngjarjeve.
Intel ME
Kjo nën-sistem e ka marrë vëmendjen tonë në blogun tonë që ka qenë e dedikuar deri në . Le të kujtojmë se ky mjedis ekzekutimi është i bazuar në një mikro-kontroller të integruar në çipset dhe është më i fshehti dhe më i privilegjuar në sistem.
Pavarësisht fshehtësisë, Intel ME gjithashtu është rrënja e besueshmërisë, pasi ka:
- ME ROM â njĂ« memorie jo e ndjeshme ndaj energjisĂ«, e pakopjuar (nuk ka mĂ«nyrĂ« pĂ«r pĂ«rditĂ«sim), qĂ« pĂ«rmban kodin fillestar, si dhe hash-in SHA256 tĂ« çelĂ«sit publik RSA, me tĂ« cilin verifikohet nĂ«nshkrimi i firmware-it Intel ME;
- ĂelĂ«si AES pĂ«r ruajtjen e informacionit sekret;
- qasje në setin e integruar të fuse-ve (FPFs, Field Programmable Fuses) për ruajtjen përhershme të disa informacionit, përfshirë informacionin e dhëna nga furnizuesi i sistemit kompjuterik.
Intel Boot Guard 1.x
Një përjashtim i vogël. Numrat e versioneve të teknologjisë Intel Boot Guard, të cilëve ne i referohemi në këtë artikull, janë të kushtëzuar dhe mund të mos kenë lidhje me numërimin që përdoret në dokumentacionin e brendshëm të kompanisë Intel. Për më tepër, informacionet e përmendura këtu për implementimin e kësaj teknologjie janë marrë gjatë rivotimit dhe mund të përmbajnë pasaktësi në krahasim me specifikimet për Intel Boot Guard, të cilat ndoshta nuk do të publikohen ndonjëherë.
Pra ndaj, Intel Boot Guard (BG) është një teknologji e mbështetur në harduer për verifikimin e autenticitetit të UEFI BIOS. Sipas përshkrimit të saj të shkurtër në librin [Platform Embedded Security Technology Revealed, kapitulli Boot with Integrity, or Not Boot], funksionon si një zinxhir besimi gjatë ngarkimit. Dëni i parë në këtë zinxhir është kodi ngarkues (mikrokodi) brenda CPU, i cili aktivizohet në ngjarjen RESET (mos e ngatërroni me vektorët RESET në BIOS!). CPU gjen një modul kodi të zhvilluar dhe të nënshkruar nga Intel në flash memorien SPI, e ngarkon në cache, e verifikon (siç u përmend më sipër, CPU ka një hash të çelësit publik, me të cilin verifikohet nënshkrimi i ACM) dhe e aktivizon.

Ky modul kodi është përgjegjës për verifikimin e një pjese të vogël fillestare të UEFI BIOS - Initial Boot Block (IBB), e cila, nga ana e saj, përmban funksionalitet për verifikimin e pjesës kryesore të UEFI BIOS. Kështu, Intel BG siguron autenticitetin e BIOS para ngarkimit të OS (e cila mund të funksionojë nën mbikëqyrjen e teknologjisë Secure Boot).
Teknologjia Intel BG parashikon dy mënyra funksionimi (meqë njëra nuk pengon tjetrën, domethënë, të dyja mund të jenë aktive në sistem, ose të dyja mund të jenë të fikura).
Measured Boot
Në modin Measured Boot (MB) çdo komponent ngarkimi (duke filluar nga CPU boot ROM) "mas" tjetrin, duke përdorur mundësitë e TPM (Trusted Platform Module). Për ata që nuk e dinë, le të shpjegohet.
TPM ka PCR (Platform Configuration Registers), në të cilat shkruhet rezultati i operacionit të hashingut sipas formulës:

Pra, vlera aktuale e PCR varet nga e kaluar, duke u resetuar vetëm në rast të një RESET-i të sistemit.
Kështu, në modin MB në një moment të caktuar, PCR-të reflektojnë një identifikues unik (brenda mundësive të operacionit të hashingut) të kodit ose të dhënave që janë "matuar". Vlerat e PCR mund të përdoren në operacionin e enkriptimit të disa të dhënave (TPM_Seal). Pas kësaj, dekodimi i tyre (TPM_Unseal) do të jetë i mundur vetëm nëse vlerat e PCR gjatë ngarkimit nuk kanë ndryshuar (domethënë, asnjë "komponent i matshëm" nuk është modifikuar).
Verified Boot
Më e frikshmja për ata që duan të modifikojnë UEFI BIOS është moda Verified Boot (VB), në të cilin çdo komponent ngarkimi verifikon në mënyrë kriptografike integritetin dhe autenticitetin e tjetrit. Në rast të një gabimi verifikimi, ndodhin (një nga):
- shkëputja me një kohëzgjatje nga 1 deri në 30 minuta (në mënyrë që përdoruesi të ketë kohë për të kuptuar arsyen pse kompjuteri i tij nuk ngarkohet dhe, nëse ka mundësi, të përpiqet të rikuperojë BIOS-in);
- shkëputje e menjëhershme (në mënyrë që përdoruesi të mos kuptojë asgjë dhe, sidomos, të mos mund të bëjë asgjë);
- vazhduar operimi me një pamje të qetë (rasti kur nuk ka kohë për siguri, sepse ka punë më të rëndësishme).
Zgjedhja e veprimit varet nga konfigurimi i dhënë të Intel BG (pra, nga politika e zbatimit e njohur si enforcement policy), e cila shkruhet përhershëm në një depo të veçantë - fuse të çipset (FPF). Do të ndalemi më shumë mbi këtë pikë më vonë.
Përveç konfigurimit, ofruesi gjeneron dy çelësa RSA 2048 dhe krijon dy struktura të dhënash (të ilustruara në figurë):
- Manifesti i çelësit kryesor të ofruesit (KEYM, OEM Root Key Manifest), në të cilin vendos SVN (Security Version Number) të këtij manifesti, SHA256 hashin e çelësit publik të manifestit tjetër, çelësi publik RSA (pra, pjesa publike e çelësit kryesor të ofruesit) për verifikimin e nënshkrimit të këtij manifesti dhe nënshkrimin e tij të vetë;
- Manifesti IBB (IBBM, Initial Boot Block Manifest), në të cilin vendos SVN të këtij manifesti, SHA256 hashin e IBB, çelësin publik për verifikimin e nënshkrimit të këtij manifesti dhe nënshkrimin e tij të vetë.
SHA256 hash i çelësit publik OEM Root Key shkruhet përhershëm në fuse të çipset (FPF), ashtu si dhe konfigurimi i Intel BG. Nëse konfigurimi i Intel BG parashikon aktivizimin e kësaj teknologjie, atëherë që nga ajo çast në këtë sistem, për të përditësuar BIOS (domethënë, për të pasur mundësinë për të riaftësuar këto manifeste) mund të jetë vetëm poseduesi i pjesës private të OEM Root Key, domethënë ofruesi.

Duke shikuar figurën, menjëherë lindin dyshime mbi nevojën për një zinxhir verifikimi kaq të gjatë - mund të përdorej vetëm një manifest. Pse të komplikohet?
Në të vërtetë, kompania Intel në këtë mënyrë i jep ofruesit mundësinë të përdorë çelësa të ndryshëm IBB për linja të ndryshme të produkteve të saj dhe një - si çelësi kryesor. Nëse del në pah pjesa private e çelësit IBB (me të cilin nënshkruhet manifesti i dytë), incidenti do të përfshijë vetëm një linjë produktesh dhe vetëm deri në momentin kur ofruesi të krijojë një çift të ri dhe të përfshijë manifeste të rinj në përditësimin e ardhshëm të BIOS.
Porosja nëse çelësi rrënjë (me të cilin nënshkruhet manifesti i parë) do të kompromentohet, nuk do të jetë e mundur ta zëvendësosh atë; procedurat e revokimit nuk janë parashikuar, sepse hashes e pjesës publike të këtij çelësi programohet në FPF-a një herë dhe përgjithmonë.
Konfigurimi i Intel Boot Guard
Tani le të flasim më hollësisht për konfigurimin e Intel BG dhe procesin e krijimit të tij. Nëse shikoni në skedën përkatëse në GUI të veglës Flash Image Tool nga paketa Intel System Tool Kit (STK), mund të vëreni se konfigurimi i Intel BG përmban hashes e pjesës publike të çelësit rrënjë të prodhuesit, një çift vlerash të panjohura dhe profilin e quajtur Intel BG.

Struktura e këtij profili:
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 â mos bĂ«j asgjĂ«
// 01b â fikje me kohĂ« tĂ« kufizuar
// 11b â fikje e menjĂ«hershme
unsigned long : 26;
};Në fakt, konfigurimi i Intel BG është një entitet shumë fleksibël. Le të shqyrtojmë, për shembull, flamurin Force_Boot_Guard_ACM. Kur ai është i hequr, në rast se moduli BG startup ACM në memorien SPI flash nuk gjendet, nuk do të ketë ngarkesë të besueshme. Do të ketë ngarkesë të pabesueshme.
Siç përmendëm më lart, politika e zbatimit për modin VB mund të konfigurohet në një mënyrë që, në rast të një gabimi në verifikim, do të ndodhte përsëri një ngarkesë e pabesueshme.
Të lihen të tilla gjëra në discretion të prodhuesve...
GUI i veglës parashikon profilin e mëposhtëm të "gatshëm":
Numri
ReĆŸimi
Përshkrimi
0
No_FVME
teknologjia Intel BG është e çaktivizuar
1
VE
modaliteti VB është i aktivizuar, fikje me kohë të kufizuar
2
VME
të dy modalitetet (VB dhe MB) janë të aktivizuara, fikje me kohë të kufizuar
3
VM
të dy modalitetet janë të aktivizuara, pa fikje të sistemit
4
FVE
modaliteti VB është i aktivizuar, fikje e menjëhershme
5
FVME
të dy modalitetet janë të aktivizuara, fikje e menjëhershme
Siç u tha mĂ« parĂ«, konfigurimi i Intel BG duhet tĂ« regjistrohet njĂ« herĂ« e pĂ«rgjithmonĂ« nga prodhuesi i sistemit nĂ« fuse-t e çipit (FPF-a) â njĂ« magazinĂ« informacioni ndihmĂ«se (sipas tĂ« dhĂ«nave tĂ« pa verifikuara, vetĂ«m 256 byte) brenda çipit, e cila mund tĂ« programohet jashtĂ« kapaciteteve prodhuese tĂ« kompanisĂ« Intel (pĂ«r kĂ«tĂ« arsye, saktĂ«sisht Field Programmable Fuses).
Ajo është e përshtatshme për ruajtjen e konfigurimit, për shkak se:
- ka një zonë one-time-programmable për ruajtjen e të dhënave (pikërisht atje, ku regjistrohet konfigurimi i Intel BG);
- kompletim dhe programim mund të bëhet vetëm nga Intel ME.
Pra, për të vendosur konfigurimin për teknologjinë Intel BG në një sistem të caktuar, prodhuesi gjatë prodhimit bën sa vijon:
- Me ndihmën e veglës Flash Image Tool (nga Intel STK) krijon një pamje të firmware me konfigurimin e caktuar të Intel BG në formën e variablave brenda rajonit të Intel ME (një "pasqyrë temporale për FPF-a");
- Me ndihmën e veglës Flash Programming Tool (nga Intel STK) regjistron këtë pamje në memorien SPI flash të sistemit dhe mbyll "modalitetin e prodhimit" (në këtë moment, dërgohet komanda përkatëse në Intel ME).
Si rezultat i këtyre operacioneve, Intel ME do të angazhojë vlerat e caktuara nga pasqyrat për FPF-a në rajonin ME, do të vendosë lejet në deshifrat SPI flash në vlerat e rekomanduara nga kompania Intel (të përshkruara në fillim të artikullit) dhe do të ushtrojë RESET të sistemit.
Analiza e implementimit të Intel Boot Guard
Me qëllim të analizës së implementimit të kësaj teknologjie në një shembull të caktuar, ne kontrolluam sistemet e mëposhtme përgjatë ndonjë shenje të teknologjisë Intel BG:
Sistemi
Shënim
Gigabyte GA-H170-D3H
Skylake, ka mbështetje
Gigabyte GA-Q170-D3H
Skylake, ka mbështetje
Gigabyte GA-B150-HD3
Skylake, ka mbështetje
MSI H170A Gaming Pro
Skylake, nuk ka mbështetje
Lenovo ThinkPad 460
Skylake, ka mbështetje, teknologjia është e aktivizuar
Lenovo Yoga 2 Pro
Haswell, nuk ka mbështetje
Lenovo U330p
Haswell, nuk ka mbështetje
Me "mbështetje" kuptohet pranimi i modulit Intel BG startup ACM, manifesteve të përmendura më lart dhe kodin përkatës në BIOS, dmth. implementimi për analizë.
Si një shembull, le të përdorim një imazh të shkarkuar nga faqja zyrtare e prodhuesit për Gigabyte GA-H170-D3H (versioni F4).
Intel CPU boot ROM
Së pari, le të flasim për veprimet e procesorit në rast se teknologjia Intel BG është e aktivizuar.
Nuk u gjetën mostra të dekriptuara të mikrokodit, prandaj mënyra se si veprimet e përshkruara më poshtë realizohen (në mikrokod ose në mënyrë harduerike) është një pyetje e hapur. Megjithatë, fakti që procesorët modernë Intel "janë në gjendje" të kryejnë këto veprime është një fakt.
Pas daljes nga gjendja RESET, procesori (në hapësirën e adresave të cilit tashmë është mapuar përmbajtja e memorjes flash) gjen tabelën FIT (Firmware Interface Table). Të gjejë atë është e lehtë, pika e saj e referencës është regjistruar në adresën FFFF FFC0h.

Në shembullin në fjalë, në këtë adresë ndodhet vlera FFD6 9500h. Duke hyrë në këtë adresë, procesori sheh tabelën FIT, përmbajtja e së cilës është e ndarë në regjistra. Regjistri i parë është një titull i strukturës së mëposhtme:
typedef struct FIT_HEADER
{
char Tag[8]; // â_FIT_ â
unsigned long NumEntries; // duke përfshirë regjistrin e titullit të FIT
unsigned short Version; // 1.0
unsigned char EntryType; // 0
unsigned char Checksum;
}; 
Për një arsye të panjohur, checksum nuk është gjithmonë e kalkuluar në këto tabela (fushat janë lënë me zero).
Të dhënat e tjera tregojnë mbi binarë të ndryshëm, të cilët duhet të parse/ekzekutohen para ekzekutimit të BIOS, domethënë, përpara kalimit në vektorin RESET të trashëguar (FFFF FFF0h). Struktura e çdo regjistri të tillë është si më poshtë:
typedef struct FIT_ENTRY
{
unsigned long BaseAddress;
unsigned long : 32;
unsigned long Size;
unsigned short Version; // 1.0
unsigned char EntryType;
unsigned char Checksum;
}; 
Fusha EntryType tregon tipin e bllokut që tregojnë këto të dhëna. Ne njohim disa lloje:
enum FIT_ENTRY_TYPES
{
FIT_HEADER = 0,
MICROCODE_UPDATE,
BG_ACM,
BIOS_INIT = 7,
TPM_POLICY,
BIOS_POLICY,
TXT_POLICY,
BG_KEYM,
BG_IBBM
};Tani Ă«shtĂ« evidente se njĂ« nga regjistrat i referohet vendndodhjes sĂ« binarit Intel BG startup ACM. Struktura e titullit tĂ« kĂ«tij binari Ă«shtĂ« tipike pĂ«r modulat e kodit tĂ« zhvilluara nga Intel (ACM, pĂ«rditĂ«sime mikro kod dhe seksione tĂ« kodit Intel ME, âŠ).
typedef struct BG_ACM_HEADER
{
unsigned short ModuleType; // 2
unsigned short ModuleSubType; // 3
unsigned long HeaderLength; // në dwords
unsigned long : 32;
unsigned long : 32;
unsigned long ModuleVendor; // 8086h
unsigned long Date; // në formatin BCD
unsigned long TotalSize; // në dwords
unsigned long unknown1[6];
unsigned long EntryPoint;
unsigned long unknown2[16];
unsigned long RsaKeySize; // në dwords
unsigned long ScratchSize; // në dwords
unsigned char RsaPubMod[256];
unsigned long RsaPubExp;
unsigned char RsaSig[256];
}; 
Procesori e ngarkon këtë binar në cache, e verifikon dhe e ekzekuton.
Intel BG startup ACM
Si rezultat i analizës së funksionimit të këtij ACM, është bërë e qartë se ai bën të siguiente:
- merr konfigurimin Intel BG nga Intel ME, e regjistruar në fusible të chipset-it (FPF);
- gjen manifestet KEYM dhe IBBM, i verifikon ato.
Për të gjetur këto manifeƥtmeter, ACM gjithashtu përdor tabelën FIT, ku janë dedikuar dy lloje regjistrash për të treguar të dhënat e strukturës (shih FIT_ENTRY_TYPES më sipër).
Të kthehemi pak më në detaje tek manifestet. Në strukturën e manifestit të parë shohim disa konstantë të panjohura, një hash të çelësit publik nga manifesti i dytë dhe çelësi publik OEM Root Key me një nënshkrim në formën e një strukture të brendshme:
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 == madhësia e hash-it?
unsigned char IbbmKeyHash[32]; // SHA256 i një çelësi publik IBBM
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];
}; 
Për të vërtetuar çelësin publik OEM Root Key, le të kujtojmë se përdoret hash SHA256 nga fusible, që në këtë moment tashmë është marrë nga Intel ME.
Le të kalojmë te manifesti i dytë. Ai përbëhet nga tre struktura:
typedef struct IBB_MANIFEST
{
ACBP Acbp; // Politikat e ngarkesës
IBBS Ibbs; // Përshkrimi IBB
IBB_DESCRIPTORS[];
PMSG Pmsg; // Nënshkrimi IBBM
};NĂ« tĂ« parĂ«n â disa konstantĂ«:
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
};Në të dytën, ndodhet SHA256 hash i IBB dhe numri i deskriptoreve që përshkruajnë përmbajtjen e IBB (dmth. ajo nga e cila llogaritet hash-i):
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 == madhësia e hash-it ?
unsigned char IbbHash[32]; // SHA256 i IBB
unsigned char NumIbbDescriptors;
};Deskriptorët IBB ndjekin këtë strukturë, njëri pas tjetrit. Përmbajtja e tyre ka formatin e mëposhtëm:
typedef struct IBB_DESCRIPTOR
{
unsigned long : 32;
unsigned long BaseAddress;
unsigned long Size;
};E gjithë kjo është e thjeshtë: çdo deskriptor përmban adresën/madhe të një pjese të IBB. Kështu, bashkimi i blloqeve që tregojnë këta deskriptorë (në rendin e vendndodhjes së deskriptorëve vetë) është IBB. Dhe, në përgjithësi, IBB është një grumbullim i të gjitha moduleve të fazave SEC dhe PEI.
Manifesti i dytë përfundon me një strukturë që përmban çelësin publik IBB (i verifikuar nga hash SHA256 nga manifesti i parë) dhe nënshkrimin e këtij manifesti:
typedef struct PMSG
{
char Tag[8]; // â__PMSG__â
unsigned char : 8; // 10h
BG_RSA_ENTRY IbbKey;
}; 
Pra, para se të fillojë ekzekutimi i UEFI BIOS, procesori do të aktivizojë ACM, i cili do të kontrollojë autenticitetin e përmbajtjes së seksioneve me kod të fazave SEC dhe PEI. Më pas, procesori del nga ACM, kalon në vektorin RESET dhe fillon të ekzekutojë BIOS.
Seksi PEI i verifikuar duhet të përmbajë një modul që do të verifikojë pjesën tjetër të BIOS (kodin DXE). Ky modul zhvillohet nga IBV (Independent BIOS Vendor) ose vetë prodhuesi i sistemit. Duke qenë se të gjitha sistemet që kishim në dispozicion dhe që mbështesnin Intel BG ishin vetëm Lenovo dhe Gigabyte, le të shqyrtojmë kodin e nxjerrë pikërisht nga këto sisteme.
Moduli UEFI BIOS LenovoVerifiedBootPei
NĂ« rastin e Lenovo, kjo ishte moduli LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, i zhvilluar nga kompania Lenovo.
Puna e tij është të gjejë (për GUID) tabelën e hash për DXE dhe të verifikojë DXE.
if (EFI_PEI_SERVICES->GetBootMode() != BOOT_ON_S3_RESUME)
{
if (!FindHashTable())
return EFI_NOT_FOUND;
if (!VerifyDxe())
return EFI_SECURITY_VIOLATION;
}Tabela e hash {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} ka formatin e mëposhtëm:
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;
};Moduli UEFI BIOS BootGuardPei
Në rastin e Gigabyte, ky ishte moduli BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, i zhvilluar nga AMI, ndaj është i pranishëm në çdo BIOS AMI që mbështet Intel BG.
Algoritmi i tij është disi ndryshe, megjithatë, ai përfshin të njëjtin proces:
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;
}Tabela e hash {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} që ai kërkon ka formatin e mëposhtëm:
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
PĂ«r tĂ« folur shkurtimisht pĂ«r njĂ« implementim tjetĂ«r tĂ« Intel Boot Guard, qĂ« u gjet nĂ« njĂ« sistem mĂ« tĂ« ri tĂ« bazuar nĂ« Intel SoC me mikromarrĂ«dhĂ«nien Apollo Lake â ASRock J4205-IT.
Megjithëse kjo version do të aplikohet vetëm në SoC, sistemet e reja me mikromarrëdhënien Kaby Lake vazhdojnë të përdorin Intel Boot Guard 1.x, ajo paraqet interes të madh në studimin e një varianti të ri të arkitekturës për platforma të Intel SoC, ku ndodhi një ndryshim i ndjeshëm, për shembull:
- regjionet BIOS dhe Intel ME (në fakt Intel TXE, sipas terminologjisë për Intel SoC) tani janë një regjion i vetëm IFWI;
- pavarësisht që në platformë ishte aktivizuar Intel BG, strukturne si FIT, KEYM, IBBM nuk u gjetën në memorjen flash;
- përveç TXE dhe bërthamave ISH (x86), në çipset u shtua një bërthamë e tretë (sërish ARC, për më tepër) - PMC (Kontrolluesi i Menaxhimit të Energjisë), i lidhur me sigurimin e funksionimit të nënstrukturës së furnizimit me energji dhe monitorimin e performancës.

Përmbajtja e re e regjionit IFWI përbëhet nga një grup modula të mëposhtëm:
Offset
Emri
Përshkrimi
0000 2000h
SMIP
një konfigurim platforme, e nënshkruar nga furnizuesi
0000 6000h
RBEP
seksioni i kodit të firmware Intel TXE, x86, e nënshkruar nga Intel
0001 0000h
PMCP
seksioni i kodit të firmware Intel PMC, ARC, e nënshkruar nga Intel
0002 0000h
FTPR
seksioni i kodit të firmware Intel TXE, x86, e nënshkruar nga Intel
0007 B000h
UCOD
përditësimet e mikrocode për CPU, e nënshkruar nga Intel
0008 0000h
IBBP
UEFI BIOS, fazat SEC/PEI, x86, e nënshkruar nga furnizuesi
0021 8000h
ISHC
seksioni i kodit të firmware Intel ISH, x86, e nënshkruar nga furnizuesi
0025 8000h
NFTP
seksioni i kodit të firmware Intel TXE, x86, e nënshkruar nga Intel
0036 1000h
IUNP
e panjohur
0038 1000h
OBBP
UEFI BIOS, faza DXE, x86, nuk është e nënshkruar
GjatĂ« analizĂ«s sĂ« firmware TXE, u bĂ« e qartĂ« se pas RESET-it TXE e mban procesorin nĂ« kĂ«tĂ« gjendje derisa tĂ« pĂ«rgatisĂ« pĂ«rmbajtjen bazĂ« tĂ« hapĂ«sirĂ«s adresuese pĂ«r CPU (FIT, ACM, RESET-vektori âŠ). MĂ« tej, TXE vendos kĂ«to tĂ« dhĂ«na nĂ« SRAM-in e tij, mĂ« pas i jep pĂ«rkohĂ«sisht procesorit akses atje dhe âe liçonâ atĂ« nga RESET-i.
Në mbrojtje të rootkit-ave
Tani kalojmĂ« nĂ« âproblemâ. NjĂ«herĂ«, zbuluam se nĂ« shumĂ« sisteme, nĂ« deshkrimet e flash SPI ishin tĂ« regjistruara lejet pĂ«r akses nĂ« regjionet e memorjes flash SPI, nĂ« atĂ« mĂ«nyrĂ« qĂ« tĂ« gjithĂ« pĂ«rdoruesit e kĂ«saj memorjeje mund tĂ« shkruajnĂ« dhe tĂ« lexojnĂ« çdo regjion. DomethĂ«nĂ«, ashtu si asnjĂ«.
Pas kontrollit me ndihmën e veglës MEinfo (nga Intel STK), ne pamë se moda e prodhimit në këto sisteme nuk ishte mbyllur, ndaj fuzet e çipset (FPF-të) ishin lënë në një gjendje të papërcaktuar. Po, Intel BG në këto raste as nuk është aktivizuar e as nuk është çaktivizuar.
Këtu flasim për sistemet e mëposhtme (për sa i përket Intel BG dhe për atë që do të pasohet në artikull, do të flasim për sistemet me mikromarrëdhënie Haswell dhe më sipër):
- të gjitha produktet Gigabyte;
- të gjitha produktet MSI;
- 21 modele laptopësh Lenovo dhe 4 modele serverësh Lenovo.
Sigurisht, ne i raportuam këtë gjetje këtyre furnizuesve, si dhe kompanisë Intel.
Një reagim i arsyeshëm erdhi vetëm nga Lenovo, të cilët e pranuan problemin dhe .
Gigabyte si duket e pranuan informacionin mbi këtë dobësi, por nuk e komentuan atë.
Komunikimi me MSI u ndal plotĂ«sisht mbi kĂ«rkesĂ«n tonĂ« pĂ«r tĂ« dĂ«rguar çelĂ«sin e tyre tĂ« hapur PGP (pĂ«r tĂ« dĂ«rguar ujdhen e sigurisĂ« nĂ« formĂ« tĂ« koduar). Ata deklaruan se âjanĂ« prodhues tĂ« pajisjeve dhe nuk prodhojnĂ« çelĂ«si PGPâ.
Por tani pĂ«r realitetin. Duke qenĂ« se fuzet janĂ« lĂ«nĂ« nĂ« njĂ« gjendje tĂ« papĂ«rcaktuar, pĂ«rdoruesi (ose njĂ« sulmues) mund tâi programojĂ« ato vetĂ« (mĂ« e vĂ«shtira Ă«shtĂ« ). PĂ«r kĂ«tĂ« kĂ«rkohen hapat e mĂ«poshtĂ«m.
1. Të ngarkohet në sistemin operativ Windows (në përgjithësi, veprimet që do të përshkruhen më poshtë mund të bëhen dhe nga Linux, nëse zhvillohet një analog i Intel STK për sistemin e nevojshëm). Duke përdorur veglën MEinfo, të sigurohesh se fuzet në këtë sistem nuk janë programuar.

2. Të lexosh përmbajtjen e memorjes flash me anë të Veglës së Programimit të Flash.

3. Hapni imazhin e lexuar me ndihmën e çdo mjeti për redaktimin e UEFI BIOS, bëni ndryshimet e nevojshme (si për shembull, implementoni një rootkit), krijoni/rregulloni strukturat ekzistuese KEYM dhe IBBM në rajonin ME.


Në imazh është theksuar pjesa publike e çelësit RSA, hash-i i të cilit do të programohet në fusht e chipset-it së bashku me konfigurimin tjetër të Intel BG.
4. Me ndihmën e Flash Image Tool krijoni një imazh të ri të firmware (duke vendosur konfigurimin e Intel BG).

5. Shkruani imazhin e ri në memorie me ndihmën e Flash Programming Tool, sigurohuni me MEinfo se rajoni ME tani përmban konfigurimin e Intel BG.

6. Me ndihmën e Flash Programming Tool mbyllni modin e prodhimit.

7. Sistemi do të ri-ngrihet, pas së cilës me ndihmën e MEinfo mund të kontrolloni se FPF-të tani janë programuar.

Këto veprime përherë do të aktivizojnë Intel BG në këtë sistem. Anulimi i veprimit nuk do të jetë i mundur, që do të thotë:
- për të përditësuar UEFI BIOS në këtë sistem do të mundet vetëm mbajtësi i pjesës private të çelësit rrënjë (dmth, ai që aktivizoi Intel BG);
- nëse kthehet firmware origjinale në këtë sistem, për shembull, me ndihmën e një programatori, ai madje nuk do të ndizet (pasojë e politikës së forcimit në rast të gabimit të verifikimit);
- për të hequr një të tillë UEFI BIOS, duhet të zëvendësohet chipset me FPF-të e programuar me një "të pastër" (dmth, të ripajisni chipset-in, nëse keni qasje në një stacion të saldimit infra të kuqe me çmim si një makinë, ose thjesht zëvendësoni pllakën e emulimit).
PĂ«r tĂ« kuptuar se çfarĂ« mund tĂ« bĂ«jĂ« njĂ« rootkit i tillĂ«, Ă«shtĂ« e nevojshme tĂ« vlerĂ«sohet se çfarĂ« mundĂ«son ekzekutimin e kodit tĂ« tij nĂ« mjedisin e UEFI BIOS. PĂ«r shembull, nĂ« modin mĂ« tĂ« privilegjuar tĂ« procesorit â SMM. NjĂ« rootkit i tillĂ« mund tĂ« ketĂ« kĂ«to pronĂ«si:
- të ekzekutohet paralelisht me OS-në (mund të konfigurohet për të shkaktuar një ndërprerje SMI, e cila do të aktivizohet nga një kronometër);
- të ketë të gjitha përfitimet e qëndrimit në modin SMM (qasje të plotë në përmbajtjen e memories dhe burimeve fizike, fshehtësia nga OS);
- kode programore të rootkit-it mund të jetë në formë të enkriptuar dhe të dekriptohet gjatë ekzekutimit në modin SMM. Si çelës për enkriptimin mund të përdoren çdo të dhëna që janë të disponueshme vetëm në modin SMM. Për shembull, hash-i i një grupi adresash në SMRAM. Për të marrë këtë çelës, do të jetë e nevojshme të hyni në SMM. Dhe kjo mund të bëhet në dy mënyra. Gjeni RCE në kodin SMM dhe shfrytëzoni, ose shtoni modulin tuaj SMM në BIOS, gjë e cila është e pamundur, pasi ne aktivizuam Boot Guard.
Pra, kjo dobësi i mundëson sulmuesit:
- të krijojë në sistem një rootkit të fshehur, të papërdorshëm me qëllim të panjohur;
- të ekzekutojë kodin e tij në një nga bërthamat e chipset-it brenda Intel SoC, përkatësisht, në Intel ISH (shikoni imazhin me kujdes).


Megjithëse mundësitë e nënndërfaqes Intel ISH ende nuk janë studiuar, ajo paraqet një vektor të interesant për sulm ndaj Intel ME.
Përfundimet
- Hulumtimi mundi të marrë një përshkrim teknik të mënyrës së punës së teknologjisë Intel Boot Guard. Një disavantazh i disa mistereve në modelin e sigurisë së Intel-it përmes obscurity.
- Mund të paraqitet një skenar sulmi, i cili mund të krijojë një rootkit të papërdorshëm në sistem.
- Përfundimisht, ne pamë se procesorët modernë Intel janë në gjendje të ekzekutojnë shumë kod proprietar përpara fillimit të punës së BIOS.
- Platformat me arkitekturë Intel 64 po bëhen gjithnjë e më pak të përshtatshme për të ekzekutuar softuer të lirë: verifikimi i harduerit, numri në rritje i teknologjive dhe nënndërfaqeve proprietare (tri bërthama në chipset-in SoC: x86 ME, x86 ISH dhe ARC PMC).
Mitigations
Dhe nëqoftë se ofruesit që në mënyrë të qëllimshme e mbajnë të hapur modin e prodhimit, duhet ta mbyllin atë patjetër. Deri tani, ata vetëm i mbyllin sytë dhe sistemet e reja Kaby Lake e tregojnë këtë.
Përdoruesit mund të çaktivizojnë vetë Intel BG në sistemet e tyre (të cilat janë të ndjeshme ndaj dobësisë përshkruar), duke nisur utilitarin Flash Programming Tool me parametrin -closemnf. Përpara, duhet të sigurohen (me ndihmën e MEinfo), se konfigurimi i Intel BG në rajonin ME parashikon pikërisht çaktivizimin e kësaj teknologjie pas programimit në FPF-të.
Burimi: habr.com
