Muat Turun Dipercayai Schrödinger. Intel Boot Guard

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Kami mencadangkan untuk turun ke tahap yang rendah sekali lagi dan bercakap tentang keselamatan perisian tegar untuk platform komputer yang serasi dengan x86. Kali ini, bahan utama kajian ialah Intel Boot Guard (jangan dikelirukan dengan Intel BIOS Guard!) - teknologi but BIOS dipercayai yang disokong perkakasan yang vendor sistem komputer boleh mendayakan atau melumpuhkan secara kekal pada peringkat pengeluaran. Nah, resipi penyelidikan sudah biasa kepada kami: potong nipis pelaksanaan teknologi ini menggunakan kejuruteraan terbalik, huraikan seni binanya, isikannya dengan butiran tidak berdokumen, perasakannya dengan vektor serangan untuk dirasai dan dicampur. Mari kita tambah bahan api kepada cerita bagaimana pepijat yang telah diklon selama bertahun-tahun dalam pengeluaran beberapa vendor membolehkan penyerang berpotensi menggunakan teknologi ini untuk mencipta rootkit tersembunyi dalam sistem yang tidak boleh dialih keluar (walaupun dengan pengaturcara).

Ngomong-ngomong, artikel itu berdasarkan laporan "On Guard of Rootkits: Intel BootGuard" dari persidangan itu ZeroNights 2016 dan mesyuarat ke-29 DefCon Rusia (kedua-dua pembentangan di sini).

Perisian tegar untuk platform komputer dengan seni bina Intel 64

Pertama, mari kita jawab soalan: apakah perisian tegar platform komputer moden dengan seni bina Intel 64? Sudah tentu, UEFI BIOS. Tetapi jawapan sedemikian tidak akan tepat. Mari kita lihat gambar, yang menunjukkan versi desktop (komputer riba) seni bina ini.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Asasnya ialah pautan:

  • Pemproses (CPU, Unit Pemprosesan Pusat), yang, sebagai tambahan kepada teras utama, mempunyai teras grafik terbina dalam (bukan dalam semua model) dan pengawal memori (IMC, Pengawal Memori Bersepadu);
  • Chipset (PCH, Platform Controller Hub), mengandungi pelbagai pengawal untuk berinteraksi dengan peranti persisian dan mengurus subsistem. Antaranya ialah Intel Management Engine (ME) yang terkenal, yang turut mempunyai perisian tegar (firmware Intel ME).

Komputer riba, sebagai tambahan kepada perkara di atas, memerlukan pengawal terbina dalam (ACPI EC, Kawalan Lanjutan dan Pengawal Terbenam Antara Muka Kuasa), yang bertanggungjawab untuk operasi subsistem kuasa, pad sentuh, papan kekunci, kekunci Fn (kecerahan skrin, kelantangan bunyi , lampu latar papan kekunci, dsb. ) dan perkara lain. Dan ia juga mempunyai firmware sendiri.

Jadi, keseluruhan perisian tegar di atas ialah perisian tegar platform komputer (peringkat tegar sistem), yang disimpan pada memori kilat SPI biasa. Supaya pengguna memori ini tidak keliru tentang di mana ia berada, kandungan memori ini dibahagikan kepada kawasan berikut (seperti yang ditunjukkan dalam rajah):

  • UEFI BIOS;
  • Perisian tegar ACPI EC (rantau yang berasingan muncul dengan microarchitecture pemproses Skylake (2015), tetapi di alam liar kami belum melihat contoh penggunaannya, jadi perisian tegar pengawal terbina dalam masih disertakan dalam UEFI BIOS) ;
  • Perisian tegar Intel ME;
  • konfigurasi (alamat MAC, dsb.) penyesuai rangkaian GbE (Gigabit Ethernet) terbina dalam;
  • Deskriptor Denyar ialah kawasan utama memori denyar yang mengandungi penunjuk ke kawasan lain, serta kebenaran untuk mengaksesnya.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Induk bas SPI, pengawal SPI yang dibina ke dalam set cip, yang melaluinya memori ini diakses, bertanggungjawab untuk mengehadkan akses kepada wilayah (mengikut kebenaran yang ditentukan). Jika kebenaran ditetapkan kepada nilai yang disyorkan Intel (atas sebab keselamatan), maka setiap pengguna kilat SPI mempunyai akses penuh (baca/tulis) ke rantau mereka sahaja. Dan selebihnya sama ada baca sahaja atau tidak boleh diakses. Fakta yang terkenal: pada banyak sistem, CPU mempunyai akses penuh kepada UEFI BIOS dan GbE, akses baca hanya kepada deskriptor kilat, dan tiada akses kepada rantau Intel ME sama sekali. Mengapa pada banyak, dan bukan pada semua? Apa yang disyorkan tidak diperlukan. Kami akan memberitahu anda lebih terperinci kemudian dalam artikel.

Mekanisme untuk melindungi perisian tegar platform komputer daripada pengubahsuaian

Jelas sekali, perisian tegar platform komputer harus dilindungi daripada kemungkinan kompromi, yang akan membolehkan penyerang berpotensi untuk bertapak di dalamnya (menghidupkan kemas kini/pemasangan semula OS), melaksanakan kod mereka dalam mod yang paling istimewa, dsb. Dan menyekat akses kepada kawasan memori kilat SPI, sudah tentu, tidak mencukupi. Oleh itu, untuk melindungi perisian tegar daripada pengubahsuaian, pelbagai mekanisme khusus untuk setiap persekitaran operasi digunakan.

Oleh itu, perisian tegar Intel ME ditandatangani untuk mengawal integriti dan ketulenan, dan diperiksa oleh pengawal ME setiap kali ia dimuatkan ke dalam memori ME UMA. Proses pengesahan ini telah pun dibincangkan oleh kami dalam salah satu daripada Perkara, khusus untuk subsistem Intel ME.

Dan perisian tegar ACPI EC, sebagai peraturan, disemak hanya untuk integriti. Walau bagaimanapun, disebabkan fakta bahawa binari ini termasuk dalam UEFI BIOS, ia hampir selalu tertakluk kepada mekanisme perlindungan yang sama yang digunakan oleh UEFI BIOS. Mari kita bercakap tentang mereka.

Mekanisme ini boleh dibahagikan kepada dua kategori.

Tulis perlindungan dalam rantau UEFI BIOS

  1. Perlindungan fizikal kandungan memori kilat SPI dengan pelompat pelindung tulis;
  2. Melindungi unjuran rantau UEFI BIOS dalam ruang alamat CPU menggunakan daftar chipset PRx;
  3. Menyekat percubaan untuk menulis ke rantau BIOS UEFI dengan menjana dan memproses gangguan SMI yang sepadan dengan menetapkan bit BIOS_WE/BLE dan SMM_BWP dalam daftar chipset;
  4. Versi perlindungan yang lebih maju ini ialah Intel BIOS Guard (PFAT).

Sebagai tambahan kepada mekanisme ini, vendor boleh membangunkan dan melaksanakan langkah keselamatan mereka sendiri (contohnya, menandatangani kapsul dengan kemas kini UEFI BIOS).

Adalah penting untuk ambil perhatian bahawa pada sistem tertentu (bergantung kepada vendor), tidak semua mekanisme perlindungan di atas boleh digunakan, ia mungkin tidak digunakan sama sekali, atau ia mungkin dilaksanakan dalam cara yang terdedah. Anda boleh membaca lebih lanjut mengenai mekanisme ini dan situasi dengan pelaksanaannya dalam artikel ini. Bagi mereka yang berminat, kami mengesyorkan agar anda membaca keseluruhan siri artikel mengenai keselamatan UEFI BIOS dari CodeRush.

Pengesahan UEFI BIOS

Apabila kita bercakap tentang teknologi but yang dipercayai, perkara pertama yang terlintas di fikiran ialah Secure Boot. Walau bagaimanapun, dari segi seni bina ia direka bentuk untuk mengesahkan ketulenan komponen luar UEFI BIOS (pemacu, pemuat but, dll.), dan bukan perisian tegar itu sendiri.

Oleh itu, Intel, dalam SoCs dengan Bay Trail microarchitecture (2012), melaksanakan perkakasan Secure Boot (Boot Disahkan) perkakasan yang tidak mempunyai persamaan dengan teknologi Secure Boot yang disebutkan di atas. Kemudian (2013), mekanisme ini telah ditambah baik dan dikeluarkan di bawah nama Intel Boot Guard untuk desktop dengan Haswell microarchitecture.

Sebelum menerangkan Intel Boot Guard, mari kita lihat persekitaran pelaksanaan dalam seni bina Intel 64, yang, secara gabungan, merupakan akar kepercayaan untuk teknologi but dipercayai ini.

Intel CPU

Cap mencadangkan bahawa pemproses ialah persekitaran pelaksanaan utama dalam seni bina Intel 64. Mengapakah ia menjadi punca kepercayaan? Ternyata yang membuatnya sedemikian adalah memiliki unsur-unsur berikut:

  • ROM Mikrokod ialah memori yang tidak meruap, tidak boleh ditulis semula untuk menyimpan kod mikro. Adalah dipercayai bahawa mikrokod adalah pelaksanaan sistem arahan pemproses menggunakan arahan yang paling mudah. Berlaku dalam mikrokod juga pepijat. Jadi dalam BIOS anda boleh mencari binari dengan kemas kini mikrokod (ditindih semasa but, kerana ROM tidak boleh ditimpa). Kandungan binari ini disulitkan, yang sangat merumitkan analisis (oleh itu, kandungan khusus mikrokod hanya diketahui oleh mereka yang membangunkannya), dan ditandatangani untuk mengawal integriti dan keaslian;
  • Kunci AES untuk menyahsulit kandungan kemas kini mikrokod;
  • cincang kunci awam RSA yang digunakan untuk mengesahkan tandatangan kemas kini mikrokod;
  • Cincangan kunci awam RSA, yang mengesahkan tandatangan modul kod ACM (Modul Kod Authenticated) yang dibangunkan Intel, yang boleh dilancarkan oleh CPU sebelum pelaksanaan BIOS (hello mikrokod) atau semasa operasinya, apabila peristiwa tertentu berlaku.

Intel ME

Blog kami didedikasikan untuk subsistem ini dua Perkara. Mari kita ingat bahawa persekitaran boleh laku ini adalah berdasarkan mikropengawal yang dibina ke dalam set cip dan merupakan yang paling tersembunyi dan istimewa dalam sistem.

Walaupun kerahsiaannya, Intel ME juga merupakan akar kepercayaan kerana ia mempunyai:

  • ME ROM - memori tidak meruap, tidak boleh ditulis semula (tiada kaedah kemas kini disediakan) yang mengandungi kod mula, serta cincang SHA256 kunci awam RSA, yang mengesahkan tandatangan perisian tegar Intel ME;
  • Kunci AES untuk menyimpan maklumat rahsia;
  • akses kepada satu set fius (FPF, Field Programmable Fuses) disepadukan ke dalam set cip untuk penyimpanan kekal beberapa maklumat, termasuk yang ditentukan oleh vendor sistem komputer.

Intel Boot Guard 1.x

Penafian kecil. Nombor versi teknologi Intel Boot Guard yang kami gunakan dalam artikel ini adalah sewenang-wenangnya dan mungkin tiada kaitan dengan penomboran yang digunakan dalam dokumentasi dalaman Intel. Di samping itu, maklumat yang diberikan di sini tentang pelaksanaan teknologi ini diperoleh semasa kejuruteraan terbalik, dan mungkin mengandungi ketidaktepatan berbanding dengan spesifikasi untuk Intel Boot Guard, yang tidak mungkin diterbitkan.

Jadi, Intel Boot Guard (BG) ialah teknologi pengesahan pengesahan UEFI BIOS yang disokong perkakasan. Berdasarkan penerangan ringkasnya dalam buku [Teknologi Keselamatan Terbenam Platform Didedahkan, bab Boot dengan Integriti, atau Bukan But], ia berfungsi sebagai rantai but yang dipercayai. Dan pautan pertama di dalamnya ialah kod but (kod mikro) di dalam CPU, yang dicetuskan oleh acara RESET (jangan dikelirukan dengan vektor RESET dalam BIOS!). CPU menemui modul kod yang dibangunkan dan ditandatangani oleh Intel (Intel BG startup ACM) pada memori kilat SPI, memuatkannya ke dalam cachenya, mengesahkan (ia telah dinyatakan di atas bahawa CPU mempunyai cincangan kunci awam yang mengesahkan ACM tandatangan) dan bermula.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard

Modul kod ini bertanggungjawab untuk mengesahkan bahagian permulaan kecil UEFI BIOS - Initial Boot Block (IBB), yang seterusnya, mengandungi fungsi untuk mengesahkan bahagian utama UEFI BIOS. Oleh itu, Intel BG membolehkan anda mengesahkan ketulenan BIOS sebelum memuatkan OS (yang boleh dilakukan di bawah pengawasan teknologi Secure Boot).

Teknologi Intel BG menyediakan dua mod pengendalian (dan satu tidak mengganggu yang lain, iaitu kedua-dua mod boleh didayakan pada sistem, atau kedua-duanya boleh dilumpuhkan).

But Terukur

Dalam mod Measured Boot (MB), setiap komponen but (bermula dengan ROM but CPU) "mengukur" yang seterusnya menggunakan keupayaan TPM (Modul Platform Dipercayai). Bagi yang belum tahu, izinkan saya terangkan.

TPM mempunyai PCR (Daftar Konfigurasi Platform), di mana hasil operasi pencincangan ditulis mengikut formula:

Muat Turun Dipercayai Schrödinger. Intel Boot Guard

Itu. nilai PCR semasa bergantung pada yang sebelumnya, dan daftar ini ditetapkan semula hanya apabila sistem DISET SEMULA.

Oleh itu, dalam mod MB, pada satu ketika, PCR mencerminkan pengecam unik (dalam keupayaan operasi pencincangan) bagi kod atau data yang "diukur." Nilai PCR boleh digunakan dalam beberapa operasi penyulitan data (TPM_Seal). Selepas ini, penyahsulitan mereka (TPM_Unseal) hanya boleh dilakukan jika nilai PCR tidak berubah akibat pemuatan (iaitu, tiada satu komponen "diukur" diubah suai).

But Disahkan

Perkara yang paling teruk bagi mereka yang suka mengubah suai UEFI BIOS ialah mod Verified Boot (VB), di mana setiap komponen but secara kriptografi mengesahkan integriti dan ketulenan yang seterusnya. Dan sekiranya berlaku ralat pengesahan, (salah satu) berlaku:

  • penutupan dengan tamat masa dari 1 minit hingga 30 minit (supaya pengguna mempunyai masa untuk memahami mengapa komputernya tidak boot, dan, jika boleh, cuba memulihkan BIOS);
  • penutupan serta-merta (supaya pengguna tidak mempunyai masa untuk memahami, lebih kurang melakukan, apa-apa);
  • terus bekerja dengan ekspresi yang tenang (kes itu apabila tidak ada masa untuk keselamatan, kerana ada perkara yang lebih penting untuk dilakukan).

Pilihan tindakan bergantung pada konfigurasi Intel BG yang ditentukan (iaitu, pada dasar penguatkuasaan yang dipanggil), yang direkodkan secara kekal oleh vendor platform komputer dalam storan yang direka khas - fius chipset (FPF). Kami akan membincangkan perkara ini dengan lebih terperinci kemudian.

Selain konfigurasi, vendor menjana dua kunci RSA 2048 dan mencipta dua struktur data (ditunjukkan dalam rajah):

  1. Manifes kunci akar vendor (KEYM, Manifes Kunci Root OEM), yang mengandungi SVN (Nombor Versi Keselamatan) manifesto ini, cincang SHA256 bagi kunci awam manifesto seterusnya, kunci awam RSA (iaitu bahagian awam bagi kunci akar vendor) untuk mengesahkan tandatangan manifesto ini dan tandatangan itu sendiri;
  2. IBB Manifest (IBBM, Initial Boot Block Manifest), yang mengandungi SVN manifesto ini, cincang SHA256 IBB, kunci awam untuk mengesahkan tandatangan manifesto ini dan tandatangan itu sendiri.

Cincang SHA256 bagi kunci awam OEM Root Key direkodkan secara kekal dalam fius chipset (FPF), sama seperti konfigurasi Intel BG. Jika konfigurasi Intel BG memperuntukkan kemasukan teknologi ini, maka mulai sekarang hanya pemilik bahagian sulit OEM Root Key boleh mengemas kini BIOS pada sistem ini (iaitu, dapat mengira semula manifes ini), i.e. vendor.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard

Apabila melihat gambar itu, keraguan serta-merta timbul tentang keperluan untuk rantaian pengesahan yang begitu panjang - mereka boleh menggunakan satu manifes. Mengapa merumitkan perkara?

Malah, Intel memberikan peluang kepada vendor untuk menggunakan kunci IBB yang berbeza untuk barisan produknya yang berbeza dan satu sebagai kunci akar. Jika bahagian peribadi kunci IBB (yang mana manifes kedua ditandatangani) bocor, insiden itu hanya akan menjejaskan satu barisan produk dan hanya sehingga vendor menjana pasangan baharu dan memasukkan manifes yang dikira semula dalam kemas kini BIOS seterusnya.

Tetapi jika kunci akar (yang mana manifes pertama ditandatangani) dikompromi, ia tidak akan dapat menggantikannya; tiada prosedur pembatalan yang diperuntukkan. cincang bahagian awam kunci ini diprogramkan ke dalam FPF sekali dan untuk semua.

Konfigurasi Pengawal But Intel

Sekarang mari kita lihat lebih dekat pada konfigurasi Intel BG dan proses menciptanya. Jika anda melihat pada tab yang sepadan dalam GUI utiliti Flash Image Tool daripada Intel System Tool Kit (STK), anda akan melihat bahawa konfigurasi Intel BG termasuk cincang bahagian awam kunci akar vendor, beberapa nilai yang tidak jelas, dsb. Profil Intel BG.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard

Struktur profil ini:

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 – do nothing
                                              // 01b – shutdown with timeout
                                              // 11b – immediate shutdown
	unsigned long : 26;
};

Secara umum, konfigurasi Intel BG ialah entiti yang sangat fleksibel. Pertimbangkan, sebagai contoh, bendera Force_Boot_Guard_ACM. Apabila ia dialih keluar, jika modul ACM permulaan BG pada denyar SPI tidak ditemui, tiada but dipercayai akan berlaku. Dia akan tidak dipercayai.

Kami telah menulis di atas bahawa dasar penguatkuasaan untuk mod VB boleh dikonfigurasikan supaya jika terdapat ralat pengesahan, muat turun yang tidak dipercayai akan berlaku.

Biarkan perkara sedemikian mengikut budi bicara vendor...

Utiliti GUI menyediakan profil "siap sedia" berikut:

No
Mod
Описание

0
No_FVME
Teknologi Intel BG dilumpuhkan

1
VE
Mod VB didayakan, tutup mengikut tamat masa

2
VME
kedua-dua mod didayakan (VB dan MB), tutup mengikut tamat masa

3
VM
kedua-dua mod didayakan, tanpa mematikan sistem

4
FVE
Mod VB didayakan, penutupan serta-merta

5
FVME
kedua-dua mod didayakan, penutupan serta-merta

Seperti yang telah disebutkan, konfigurasi Intel BG mesti ditulis sekali dan untuk semua oleh vendor sistem ke dalam fius chipset (FPF) - penyimpanan perkakasan kecil (mengikut maklumat yang tidak disahkan, hanya 256 bait) maklumat di dalam chipset, yang boleh diprogramkan di luar kemudahan pengeluaran Intel (itulah sebabnya Medan Boleh Diprogram Fius).

Ia bagus untuk menyimpan konfigurasi kerana:

  • mempunyai kawasan boleh diprogramkan sekali untuk menyimpan data (tepat di mana konfigurasi Intel BG ditulis);
  • Hanya Intel ME boleh membaca dan memprogramnya.

Jadi, untuk menetapkan konfigurasi untuk teknologi Intel BG pada sistem tertentu, vendor melakukan perkara berikut semasa pengeluaran:

  1. Menggunakan utiliti Flash Image Tool (dari Intel STK), ia mencipta imej perisian tegar dengan konfigurasi Intel BG yang diberikan dalam bentuk pembolehubah dalam rantau Intel ME (apa yang dipanggil cermin sementara untuk FPF);
  2. Menggunakan utiliti Alat Pengaturcaraan Flash (dari Intel STK), ia menulis imej ini ke memori kilat SPI sistem dan menutup apa yang dipanggil. mod pembuatan (dalam kes ini, arahan yang sepadan dihantar ke Intel ME).

Hasil daripada operasi ini, Intel ME akan menetapkan nilai yang ditentukan daripada cermin untuk FPF di rantau ME kepada FPF, menetapkan resolusi dalam deskriptor denyar SPI kepada nilai yang disyorkan oleh Intel (diterangkan pada permulaan artikel) dan lakukan RESET sistem.

Analisis pelaksanaan Intel Boot Guard

Untuk menganalisis pelaksanaan teknologi ini menggunakan contoh khusus, kami menyemak sistem berikut untuk mengesan teknologi Intel BG:

Sistem
Nota

Gigabyte GA-H170-D3H
Skylake, ada sokongan

Gigabait GA-Q170-D3H
Skylake, ada sokongan

Gigabait GA-B150-HD3
Skylake, ada sokongan

MSI H170A Gaming Pro
Skylake, tiada sokongan

Lenovo ThinkPad 460
Skylake, disokong, teknologi didayakan

Lenovo Yoga 2 Pro
Haswell, tiada sokongan

Lenovo U330p
Haswell, tiada sokongan

Dengan "sokongan" yang kami maksudkan ialah kehadiran modul ACM permulaan Intel BG, manifes yang disebutkan di atas dan kod yang sepadan dalam BIOS, i.e. pelaksanaan untuk analisis.

Sebagai contoh, mari kita ambil yang dimuat turun dari pejabat. imej tapak web vendor memori kilat SPI untuk Gigabyte GA-H170-D3H (versi F4).

ROM but CPU Intel

Pertama sekali, mari kita bercakap tentang tindakan pemproses jika teknologi Intel BG didayakan.

Tidak dapat mencari sampel mikrokod yang dinyahsulit, jadi cara tindakan yang diterangkan di bawah dilaksanakan (dalam mikrokod atau perkakasan) ialah soalan terbuka. Walau bagaimanapun, adalah fakta bahawa pemproses Intel moden "boleh" melakukan tindakan ini.

Selepas keluar dari keadaan RESET, pemproses (kandungan memori denyar telah dipetakan ke dalam ruang alamat) mencari jadual FIT (Jadual Antara Muka Perisian Tegar). Ia mudah dicari; penunjuk kepadanya ditulis di alamat FFFF FFC0h.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Dalam contoh yang sedang dipertimbangkan, nilai FFD6 9500h terletak di alamat ini. Dengan mengakses alamat ini, pemproses melihat jadual FIT, yang kandungannya dibahagikan kepada rekod. Entri pertama ialah pengepala struktur berikut:

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

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Atas sebab yang tidak diketahui, jumlah semak tidak selalu dikira dalam jadual ini (medan dibiarkan sifar).

Entri selebihnya menunjuk kepada pelbagai binari yang perlu dihuraikan/dilaksanakan sebelum BIOS dilaksanakan, i.e. sebelum beralih kepada vektor RESET warisan (FFFF FFF0h). Struktur setiap entri tersebut adalah seperti berikut:

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

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Medan EntryType memberitahu anda jenis blok entri ini dituju. Kami tahu beberapa jenis:

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

Kini jelas bahawa salah satu entri menunjukkan lokasi binari ACM permulaan Intel BG. Struktur pengepala binari ini adalah tipikal untuk modul kod yang dibangunkan oleh Intel (ACM, kemas kini mikrokod, bahagian kod Intel ME, ...).

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

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Pemproses memuatkan binari ini ke dalam cachenya, mengesahkannya dan menjalankannya.

ACM permulaan Intel BG

Hasil daripada menganalisis kerja ACM ini, menjadi jelas bahawa ia melakukan perkara berikut:

  • menerima konfigurasi Intel BG daripada Intel ME, ditulis ke dalam fius chipset (FPF);
  • mendapati KEYM dan IBBM memanifestasikan dan mengesahkannya.

Untuk mencari manifes ini, ACM juga menggunakan jadual FIT, yang mempunyai dua jenis masukan untuk menunjukkan data struktur (lihat FIT_ENTRY_TYPES di atas).

Mari kita lihat lebih dekat manifesto. Dalam struktur manifes pertama, kita melihat beberapa pemalar yang tidak jelas, cincangan kunci awam daripada manifes kedua, dan Kunci Akar OEM awam ditandatangani sebagai struktur bersarang:

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

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Untuk mengesahkan kunci awam Kunci Root OEM, kami ingat bahawa kami menggunakan cincang fius SHA256, yang pada ketika ini telah diterima daripada Intel ME.

Mari kita beralih kepada manifesto kedua. Ia terdiri daripada tiga struktur:

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

Yang pertama mengandungi beberapa pemalar:

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

Yang kedua mengandungi cincangan SHA256 IBB dan bilangan deskriptor yang menerangkan kandungan IBB (iaitu, dari mana cincangan itu dikira):

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

Deskriptor IBB mengikut struktur ini, satu demi satu. Kandungan mereka mempunyai format berikut:

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

Mudah sahaja: setiap deskriptor mengandungi alamat/saiz bahagian IBB. Oleh itu, penyatuan blok yang ditunjuk oleh deskriptor ini (dalam susunan deskriptor itu sendiri) ialah IBB. Dan, sebagai peraturan, IBB ialah koleksi semua modul fasa SEC dan PEI.

Manifes kedua dilengkapkan dengan struktur yang mengandungi kunci awam IBB (disahkan oleh cincang SHA256 daripada manifes pertama) dan tandatangan manifes ini:

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

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Jadi, walaupun sebelum UEFI BIOS mula melaksanakan, pemproses akan melancarkan ACM, yang akan mengesahkan ketulenan kandungan bahagian dengan kod fasa SEC dan PEI. Seterusnya, pemproses keluar dari ACM, mengikut vektor RESET dan mula melaksanakan BIOS.

Partition PEI yang disahkan mesti mengandungi modul yang akan menyemak baki BIOS (kod DXE). Modul ini sedang dibangunkan oleh IBV (Independent BIOS Vendor) atau vendor sistem itu sendiri. Kerana Hanya sistem Lenovo dan Gigabyte yang kami gunakan dan mempunyai sokongan Intel BG; mari lihat kod yang diekstrak daripada sistem ini.

Modul UEFI BIOS LenovoVerifiedBootPei

Dalam kes Lenovo, ternyata modul LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, dibangunkan oleh Lenovo.

Tugasnya adalah untuk mencari (oleh GUID) jadual cincang untuk DXE dan mengesahkan DXE.

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

Хеш таблица {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} имеет следующий формат:

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

Modul UEFI BIOS BootGuardPei

Dalam kes Gigabyte, ia ternyata modul BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, dibangunkan oleh AMI, oleh itu, hadir dalam mana-mana BIOS AMI dengan sokongan Intel BG.

Algoritma pengendaliannya agak berbeza, namun, ia bermuara kepada perkara yang 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;
}

Jadual cincang {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} yang dicari mempunyai format berikut:

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

Mari kita bercakap secara ringkas tentang satu lagi pelaksanaan Intel Boot Guard, yang ditemui dalam sistem yang lebih baharu berdasarkan Intel SoC dengan microarchitecture Apollo Lake - ASRock J4205-IT.

Walaupun versi ini hanya akan digunakan dalam SoC (sistem baharu dengan microarchitecture pemproses Kaby Lake terus menggunakan Intel Boot Guard 1.x), ia sangat menarik untuk mengkaji pilihan seni bina baharu untuk platform Intel SoC, yang telah menyaksikan perubahan ketara, contohnya:

  • wilayah BIOS dan Intel ME (atau lebih tepatnya Intel TXE, mengikut istilah untuk Intel SoC) kini merupakan satu wilayah IFWI;
  • walaupun Intel BG telah didayakan pada platform, struktur seperti FIT, KEYM, IBBM tidak ditemui dalam memori kilat;
  • sebagai tambahan kepada teras TXE dan ISH (x86), teras ketiga telah ditambahkan pada chipset (ARC sekali lagi, dengan cara itu) - PMC (Pengawal Pengurusan Kuasa), yang dikaitkan dengan memastikan kebolehkendalian subsistem kuasa dan pemantauan prestasi.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Kandungan wilayah IFWI baharu ialah satu set modul berikut:

Berat sebelah
nama
Описание

0000 2000jam
SMIP
konfigurasi platform tertentu, ditandatangani oleh vendor

0000 6000jam
RBEP
Bahagian kod perisian tegar Intel TXE, x86, menandatangani Intel

0001 0000jam
PMCP
Bahagian kod perisian tegar PMC Intel, ARC, menandatangani Intel

0002 0000jam
FTPR
Bahagian kod perisian tegar Intel TXE, x86, menandatangani Intel

0007 B000h
UCOD
kemas kini mikrokod untuk CPU, ditandatangani oleh Intel

0008 0000jam
IBBP
UEFI BIOS, fasa SEC/PEI, x86, ditandatangani oleh vendor

0021 8000jam
ISHC
Bahagian kod perisian tegar Intel ISH, x86, ditandatangani oleh vendor

0025 8000jam
FTP
Bahagian kod perisian tegar Intel TXE, x86, menandatangani Intel

0036 1000jam
IUNP
tidak diketahui

0038 1000jam
OBBP
UEFI BIOS, fasa DXE, x86, tidak ditandatangani

Semasa analisis firmware TXE, menjadi jelas bahawa selepas RESET, TXE menyimpan pemproses dalam keadaan ini sehingga ia menyediakan kandungan asas ruang alamat untuk CPU (FIT, ACM, RESET vektor ...). Selain itu, TXE meletakkan data ini dalam SRAMnya, selepas itu ia memberikan akses pemproses sementara di sana dan "melepaskannya" daripada RESET.

Berjaga-jaga terhadap rootkit

Nah, sekarang mari kita beralih kepada perkara "panas". Kami pernah mendapati bahawa pada banyak sistem, deskriptor denyar SPI mengandungi kebenaran untuk mengakses kawasan memori kilat SPI supaya semua pengguna memori ini boleh menulis dan membaca mana-mana rantau. Itu. tiada cara.

Selepas menyemak dengan utiliti MEinfo (dari Intel STK), kami melihat bahawa mod pembuatan pada sistem ini tidak ditutup, oleh itu, fius chipset (FPF) dibiarkan dalam keadaan tidak ditentukan. Ya, Intel BG tidak dihidupkan atau dimatikan dalam kes sedemikian.

Kami bercakap tentang sistem berikut (berkaitan dengan Intel BG dan apa yang akan diterangkan kemudian dalam artikel, kami akan bercakap tentang sistem dengan mikroarkitektur pemproses Haswell dan lebih tinggi):

  • semua produk Gigabait;
  • semua produk MSI;
  • 21 model komputer riba Lenovo dan 4 model pelayan Lenovo.

Sudah tentu, kami melaporkan penemuan itu kepada vendor ini, serta kepada Intel.

Reaksi yang mencukupi hanya datang dari Lenovoyang mengenali masalah dan mengeluarkan tampalan.

Gigabyte Mereka seolah-olah menerima maklumat tentang kelemahan itu, tetapi tidak mengulas dalam apa cara sekalipun.

Komunikasi dengan MSI terhenti sepenuhnya atas permintaan kami untuk menghantar kunci PGP awam anda (untuk menghantar mereka nasihat keselamatan dalam bentuk yang disulitkan). Mereka menyatakan bahawa mereka "adalah pengeluar perkakasan dan tidak menghasilkan kunci PGP."

Tetapi mari kita pergi ke intipati. Memandangkan fius dibiarkan dalam keadaan tidak ditentukan, pengguna (atau penyerang) boleh memprogramkannya secara bebas (perkara yang paling sukar ialah cari Intel STK). Untuk melakukan ini, anda perlu melengkapkan langkah berikut.

1. Boot ke OS Windows (secara umum, tindakan yang diterangkan di bawah juga boleh dilakukan di bawah Linux, jika anda membangunkan analog Intel STK untuk OS yang dikehendaki). Menggunakan utiliti MEinfo, pastikan fius tidak diprogramkan pada sistem ini.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
2. Baca kandungan memori kilat menggunakan Alat Pengaturcaraan Flash.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
3. Buka imej baca menggunakan mana-mana alat pengeditan BIOS UEFI, buat perubahan yang diperlukan (perkenalkan rootkit, sebagai contoh), buat/edit struktur KEYM dan IBBM sedia ada di rantau ME.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Gambar itu menyerlahkan bahagian awam kunci RSA, cincang yang akan diprogramkan ke dalam fius chipset bersama-sama dengan konfigurasi Intel BG yang lain.

4. Menggunakan Alat Imej Flash, bina imej perisian tegar baharu (dengan menetapkan konfigurasi Intel BG).

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
5. Tulis imej baharu ke memori kilat menggunakan Alat Pengaturcaraan Flash dan sahkan menggunakan MEinfo bahawa rantau ME kini mengandungi konfigurasi Intel BG.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
6. Gunakan Alat Pengaturcaraan Flash untuk menutup mod pembuatan.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
7. Sistem akan but semula, selepas itu anda boleh menggunakan MEinfo untuk mengesahkan bahawa FPF kini diprogramkan.

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Tindakan ini selamanya dayakan Intel BG pada sistem ini. Tindakan itu tidak boleh dibuat asal, yang bermaksud:

  • Hanya pemilik bahagian peribadi kunci akar (iaitu, orang yang mendayakan Intel BG) akan dapat mengemas kini UEFI BIOS pada sistem ini;
  • jika anda mengembalikan perisian tegar asal kepada sistem ini, contohnya, menggunakan pengaturcara, ia tidak akan dihidupkan (akibat daripada dasar penguatkuasaan sekiranya berlaku ralat pengesahan);
  • untuk menyingkirkan BIOS UEFI sedemikian, anda perlu menggantikan chipset dengan FPF yang diprogramkan dengan yang "bersih" (iaitu, mematerikan semula chipset jika anda mempunyai akses ke stesen pematerian inframerah dengan harga kereta, atau hanya menggantikan papan induk ).

Untuk memahami perkara yang boleh dilakukan oleh rootkit sedemikian, anda perlu menilai perkara yang memungkinkan untuk melaksanakan kod anda dalam persekitaran UEFI BIOS. Katakan, dalam mod pemproses yang paling istimewa - SMM. Rootkit sedemikian mungkin mempunyai sifat berikut:

  • dilaksanakan selari dengan OS (anda boleh mengkonfigurasi pemprosesan untuk menghasilkan gangguan SMI, yang akan dicetuskan oleh pemasa);
  • mempunyai semua kelebihan berada dalam mod SMM (akses penuh kepada kandungan RAM dan sumber perkakasan, kerahsiaan daripada OS);
  • Kod program rootkit boleh disulitkan dan dinyahsulit apabila dilancarkan dalam mod SMM. Sebarang data yang tersedia hanya dalam mod SMM boleh digunakan sebagai kunci penyulitan. Contohnya, cincangan daripada set alamat dalam SMRAM. Untuk mendapatkan kunci ini, anda perlu masuk ke SMM. Dan ini boleh dilakukan dalam dua cara. Cari RCE dalam kod SMM dan eksploitasikannya, atau tambahkan modul SMM anda sendiri pada BIOS, yang mustahil kerana kami mendayakan Boot Guard.

Oleh itu, kelemahan ini membolehkan penyerang untuk:

  • buat rootkit yang tersembunyi dan tidak boleh dipadam dengan tujuan yang tidak diketahui dalam sistem;
  • laksanakan kod anda pada salah satu teras chipset di dalam Intel SoC, iaitu, pada Intel ISH (lihat gambar dengan teliti).

Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Muat Turun Dipercayai Schrödinger. Intel Boot Guard
Walaupun keupayaan subsistem Intel ISH belum lagi diterokai, ia nampaknya merupakan vektor serangan yang menarik untuk Intel ME.

Penemuan

  1. Kajian itu memungkinkan untuk mendapatkan penerangan teknikal operasi teknologi Intel Boot Guard. Tolak beberapa rahsia dalam keselamatan Intel melalui model ketidakjelasan.
  2. Senario serangan dibentangkan yang membolehkan anda membuat rootkit tidak dipasang dalam sistem.
  3. Kami melihat bahawa pemproses Intel moden mampu melaksanakan banyak kod proprietari walaupun sebelum BIOS mula berjalan.
  4. Platform dengan seni bina Intel 64 semakin kurang sesuai untuk menjalankan perisian percuma: pengesahan perkakasan, peningkatan bilangan teknologi proprietari dan subsistem (tiga teras dalam set cip SoC: x86 ME, x86 ISH dan ARC PMC).

Tebatan

Vendor yang sengaja membiarkan mod pembuatan terbuka harus pastikan menutupnya. Setakat ini, hanya mata mereka yang tertutup, dan sistem Tasik Kaby baharu menunjukkan perkara ini.

Pengguna boleh melumpuhkan Intel BG pada sistem mereka (yang terdedah kepada kerentanan yang diterangkan) dengan menjalankan Alat Pengaturcaraan Flash dengan parameter -closemnf. Mula-mula, anda harus memastikan (menggunakan MEinfo) bahawa konfigurasi Intel BG di rantau ME menyediakan untuk mematikan teknologi ini selepas pengaturcaraan dalam FPF.

Sumber: www.habr.com

Tambah komen