Boot tepercaya Schrödinger. Pelindung Boot Intel

Boot tepercaya Schrödinger. Pelindung Boot Intel
Kami mengusulkan untuk turun ke level rendah lagi dan berbicara tentang keamanan platform komputer yang kompatibel dengan firmware x86. Kali ini, bahan utama dari penelitian ini adalah Intel Boot Guard (jangan bingung dengan Intel BIOS Guard!) - teknologi boot tepercaya BIOS yang didukung perangkat keras yang dapat diaktifkan atau dinonaktifkan secara permanen oleh vendor sistem komputer pada tahap produksi. Nah, kita sudah tahu resep penelitiannya: memotong implementasi teknologi ini dengan rekayasa balik, mendeskripsikan arsitekturnya, mengisinya dengan detail yang tidak terdokumentasi, membumbui dengan vektor serangan sesuai selera dan mencampurnya. Mari tambahkan api dengan cerita tentang bagaimana bug yang dikloning dalam produksi beberapa vendor selama bertahun-tahun memungkinkan penyerang potensial menggunakan teknologi ini untuk membuat rootkit tersembunyi yang tidak dapat dihapus (bahkan oleh pemrogram) dalam sistem.

Ngomong-ngomong, artikel ini didasarkan pada laporan "On Guard for Rootkits: Intel BootGuard" dari konferensi Nol Malam 2016 dan pertemuan ke-29 DefCon Rusia (keduanya presentasi di sini).

Firmware untuk platform komputer dengan arsitektur Intel 64

Untuk memulainya, mari kita jawab pertanyaannya: apa firmware platform komputer modern dengan arsitektur Intel 64? Tentu saja, UEFI BIOS. Tetapi jawaban ini tidak akan akurat. Mari kita lihat gambar yang menunjukkan versi desktop (laptop) dari arsitektur ini.

Boot tepercaya Schrödinger. Pelindung Boot Intel
Dasarnya adalah tautan:

  • Prosesor (CPU, Unit Pemrosesan Pusat), yang, selain inti utama, memiliki inti grafis bawaan (tidak di semua model) dan pengontrol memori (IMC, Pengontrol Memori Terpadu);
  • Chipset (PCH, Platform Controller Hub), berisi berbagai pengontrol untuk berinteraksi dengan perangkat periferal dan mengelola subsistem. Diantaranya adalah Intel Management Engine (ME) yang terkenal kejam, yang juga memiliki firmware (firmware Intel ME).

Laptop, selain yang di atas, memerlukan pengontrol terintegrasi (ACPI EC, Advanced Control, dan Power Interface Embedded Controller), yang bertanggung jawab atas pengoperasian subsistem daya, panel sentuh, keyboard, tombol Fn (kecerahan layar, volume suara, keyboard lampu latar, dll.) ) dan lainnya. Dan dia juga memiliki firmware sendiri.

Jadi, kombinasi firmware di atas adalah firmware platform komputer (firmware sistem), yang disimpan di memori flash SPI biasa. Agar pengguna memori ini tidak bingung di mana letak seseorang, isi memori ini dibagi menjadi beberapa wilayah berikut (seperti yang ditunjukkan pada gambar):

  • BIOS UEFI;
  • Firmware ACPI EC (wilayah terpisah muncul dengan mikroarsitektur prosesor Skylake (2015), tetapi di alam bebas kami belum melihat contoh penggunaannya, sehingga firmware pengontrol tertanam masih merupakan bagian dari UEFI BIOS);
  • Firmware Intel ME;
  • konfigurasi (alamat MAC, dll.) dari adaptor jaringan GbE (Gigabit Ethernet) bawaan;
  • deskriptor flash - wilayah utama memori flash, yang berisi penunjuk ke wilayah lain, serta izin untuk mengaksesnya.

Boot tepercaya Schrödinger. Pelindung Boot Intel
Diferensiasi akses ke wilayah (sesuai dengan izin yang ditentukan) ditangani oleh master bus SPI - pengontrol SPI yang terpasang di chipset, di mana memori ini diakses. Jika izin diatur ke nilai yang direkomendasikan (untuk alasan keamanan) oleh Intel, maka setiap pengguna flash SPI memiliki akses penuh (baca/tulis) hanya ke wilayah mereka. Sisanya hanya bisa dibaca atau tidak dapat diakses. Fakta yang diketahui: pada banyak sistem, CPU memiliki akses penuh ke UEFI BIOS dan GbE, akses baca hanya ke deskriptor flash, dan tidak ada akses sama sekali ke wilayah Intel ME. Mengapa banyak dan tidak semua? Apa yang direkomendasikan adalah opsional. Kami akan memberi tahu Anda lebih banyak nanti di artikel.

Mekanisme untuk melindungi firmware platform komputer dari modifikasi

Jelas, firmware platform komputer harus dilindungi dari kemungkinan kompromi, yang memungkinkan penyerang potensial mendapatkan pijakan di dalamnya (bertahan dari pembaruan / penginstalan ulang OS), menjalankan kode mereka dalam mode yang paling istimewa, dll. Dan membatasi akses ke wilayah memori flash SPI, tentu saja, tidak cukup. Oleh karena itu, berbagai mekanisme khusus untuk setiap lingkungan eksekusi digunakan untuk melindungi firmware dari modifikasi.

Jadi, firmware Intel ME ditandatangani untuk kontrol integritas dan keaslian, dan diperiksa oleh pengontrol ME setiap kali dimuat ke dalam memori ME UMA. Proses verifikasi ini sudah kami bahas di salah satu artikeldidedikasikan untuk subsistem Intel ME.

Dan firmware ACPI EC, sebagai aturan, diperiksa hanya untuk integritas. Namun, karena fakta bahwa biner ini termasuk dalam UEFI BIOS, hampir selalu tunduk pada mekanisme perlindungan yang sama dengan yang digunakan UEFI BIOS. Mari kita bicara tentang mereka.

Mekanisme ini dapat dibagi menjadi dua kategori.

Perlindungan tulis ke wilayah UEFI BIOS

  1. Perlindungan fisik isi memori flash SPI dengan jumper proteksi tulis;
  2. Perlindungan proyeksi wilayah UEFI BIOS di ruang alamat CPU menggunakan register PRx chipset;
  3. Memblokir upaya untuk menulis ke wilayah UEFI BIOS dengan membuat dan memproses interupsi SMI yang sesuai dengan menyetel bit BIOS_WE / BLE dan SMM_BWP di register chipset;
  4. Versi lebih lanjut dari perlindungan ini adalah Intel BIOS Guard (PFAT).

Selain mekanisme ini, vendor dapat mengembangkan dan menerapkan tindakan keamanan mereka sendiri (misalnya, menandatangani kapsul dengan pembaruan UEFI BIOS).

Penting untuk dicatat bahwa pada sistem tertentu (bergantung pada vendor), tidak semua mekanisme perlindungan di atas dapat diterapkan, mungkin tidak diterapkan sama sekali, atau mungkin diterapkan dengan cara yang rentan. Anda dapat membaca lebih lanjut tentang mekanisme ini dan situasi penerapannya di Artikel ini. Bagi yang berminat, kami menyarankan Anda membaca seluruh rangkaian artikel tentang keamanan UEFI BIOS dari CodeRush.

Verifikasi Otentikasi UEFI BIOS

Saat kita berbicara tentang teknologi boot tepercaya, hal pertama yang terlintas dalam pikiran adalah Boot Aman. Namun, secara arsitektural, ini dirancang untuk mengautentikasi komponen di luar UEFI BIOS (driver, loader, dll.), dan bukan firmware itu sendiri.

Oleh karena itu, Intel dalam SoC dengan mikroarsitektur Bay Trail (2012) menerapkan Boot Aman (Boot Terverifikasi) perangkat keras yang tidak dapat dialihkan, yang tidak ada hubungannya dengan teknologi Boot Aman yang disebutkan di atas. Belakangan (2013), mekanisme ini diperbaiki dan, dengan nama Intel Boot Guard, dirilis untuk desktop dengan mikroarsitektur Haswell.

Sebelum menjelaskan Intel Boot Guard, mari kita lihat lingkungan eksekusi dalam arsitektur Intel 64, yang merupakan gabungan dari akar kepercayaan untuk teknologi boot tepercaya ini.

Intel CPU

Cap menunjukkan bahwa prosesor adalah lingkungan eksekusi utama dalam arsitektur Intel 64. Mengapa ini juga menjadi akar kepercayaan? Ternyata kepemilikan unsur-unsur berikut yang membuatnya demikian:

  • Microcode ROM adalah memori non-volatile, non-rewritable untuk menyimpan microcode. Dipercayai bahwa mikrokode adalah penerapan sistem instruksi prosesor pada instruksi yang paling sederhana. Terjadi di mikrokode juga bug. Jadi di BIOS Anda dapat menemukan binari dengan pembaruan mikrokode (dilapiskan pada saat boot, karena ROM tidak dapat ditimpa). Konten dari biner ini dienkripsi, yang sangat memperumit analisis (oleh karena itu, konten spesifik dari kode mikro hanya diketahui oleh mereka yang mengembangkannya), dan ditandatangani untuk mengontrol integritas dan keaslian;
  • Kunci AES untuk mendekripsi konten pembaruan mikrokode;
  • hash dari kunci publik RSA yang memverifikasi tanda tangan pembaruan kode mikro;
  • Hash kunci publik RSA, yang memeriksa tanda tangan modul kode ACM (Authenticated Code Module) yang dikembangkan Intel, yang dapat dijalankan CPU sebelum BIOS dimulai (hello microcode) atau selama operasinya, ketika beberapa peristiwa terjadi.

Intel SAYA

Subsistem ini di blog kami dikhususkan untuk две Artikel. Ingatlah bahwa lingkungan yang dapat dieksekusi ini didasarkan pada mikrokontroler yang terpasang di dalam chipset dan merupakan lingkungan yang paling tersembunyi dan diistimewakan dalam sistem.

Meski tersembunyi, Intel ME juga menjadi akar kepercayaan, karena memiliki:

  • ME ROM - memori non-volatile, non-rewritable (tidak ada metode pembaruan yang disediakan), berisi kode awal, serta hash SHA256 dari kunci publik RSA, yang memeriksa tanda tangan firmware Intel ME;
  • Kunci AES untuk menyimpan informasi rahasia;
  • akses ke sekumpulan sekering (FPFs, Field Programmable Fuses) yang diintegrasikan ke dalam chipset untuk penyimpanan permanen beberapa informasi, termasuk informasi yang ditentukan oleh vendor sistem komputer.

Penjaga Boot Intel 1.x

Penafian kecil. Nomor versi teknologi Intel Boot Guard yang kami gunakan dalam artikel ini arbitrer dan mungkin tidak ada hubungannya dengan penomoran yang digunakan dalam dokumentasi internal Intel. Selain itu, informasi tentang penerapan teknologi ini yang diberikan di sini diperoleh selama rekayasa balik, dan mungkin mengandung ketidakakuratan dibandingkan dengan spesifikasi Intel Boot Guard, yang kemungkinan besar tidak akan pernah dipublikasikan.

Jadi, Intel Boot Guard (BG) adalah teknologi otentikasi UEFI BIOS yang didukung perangkat keras. Dilihat dari deskripsi kecilnya di buku [Platform Embedded Security Technology Revealed, Chapter Boot with Integrity, or Not Boot], ini berfungsi sebagai rantai boot tepercaya. Dan tautan pertama di dalamnya adalah kode boot (mikrokode) di dalam CPU, yang dipicu oleh peristiwa RESET (jangan bingung dengan vektor RESET di BIOS!). CPU menemukan modul kode (Intel BG startup ACM) yang dikembangkan dan ditandatangani oleh Intel pada memori flash SPI, memuatnya ke dalam cache, memverifikasinya (telah disebutkan di atas bahwa CPU memiliki hash kunci publik yang memverifikasi tanda tangan ACM ) dan dimulai.

Boot tepercaya Schrödinger. Pelindung Boot Intel

Modul kode ini bertanggung jawab untuk memverifikasi bagian awal kecil dari UEFI BIOS - Initial Boot Block (IBB), yang, pada gilirannya, berisi fungsi untuk memverifikasi bagian utama dari UEFI BIOS. Dengan demikian, Intel BG memungkinkan Anda memverifikasi keaslian BIOS sebelum mem-boot OS (yang dapat dilakukan di bawah pengawasan teknologi Secure Boot).

Teknologi Intel BG menyediakan dua mode operasi (dan yang satu tidak mengganggu yang lain, mis. kedua mode dapat diaktifkan pada sistem, dan keduanya dapat dinonaktifkan).

Boot Terukur

Dalam mode Boot Terukur (MB), setiap komponen boot (dimulai dengan ROM boot CPU) "mengukur" komponen boot berikutnya menggunakan kemampuan Trusted Platform Module (TPM). Bagi yang belum tahu, biar saya jelaskan.

TPM memiliki PCR (Platform Configuration Registers), yang mencatat hasil operasi hashing sesuai dengan rumus:

Boot tepercaya Schrödinger. Pelindung Boot Intel

Itu. nilai PCR saat ini tergantung pada yang sebelumnya, dan register ini direset hanya ketika sistem RESET.

Jadi, dalam mode MB, pada titik waktu tertentu, PCR mencerminkan pengidentifikasi unik (dalam kemampuan operasi hash) dari kode atau data yang "diukur". Nilai PCR dapat digunakan dalam operasi enkripsi beberapa data (TPM_Seal). Setelah itu, dekripsi mereka (TPM_Unseal) hanya akan dimungkinkan jika nilai PCR tidak berubah sebagai akibat pemuatan (yaitu, tidak ada satu pun komponen "terukur" yang dimodifikasi).

Boot Terverifikasi

Hal paling menakutkan bagi mereka yang suka memodifikasi UEFI BIOS adalah mode Verified Boot (VB), di mana setiap komponen boot secara kriptografis memverifikasi integritas dan keaslian komponen berikutnya. Dan jika terjadi kesalahan verifikasi, (salah satu dari yang berikut) terjadi:

  • matikan dengan batas waktu dari 1 menit hingga 30 menit (sehingga pengguna memiliki waktu untuk memahami mengapa komputernya tidak bisa boot, dan, jika mungkin, akan mencoba memulihkan BIOS);
  • shutdown segera (sehingga pengguna tidak punya waktu untuk memahami dan, terlebih lagi, melakukan);
  • kelanjutan pekerjaan dengan wajah lurus (kasus ketika tidak ada waktu untuk keselamatan, karena ada hal yang lebih penting untuk dilakukan).

Pilihan tindakan bergantung pada konfigurasi Intel BG yang ditentukan (yaitu, pada apa yang disebut kebijakan penegakan hukum), yang secara permanen direkam oleh vendor platform komputer dalam penyimpanan yang dirancang khusus - sekering chipset (FPF). Kami akan membahas poin ini lebih detail nanti.

Selain konfigurasi, vendor membuat dua kunci RSA 2048 dan membuat dua struktur data (ditunjukkan pada gambar):

  1. Manifes kunci root vendor (KEYM, OEM Root Key Manifest), yang menempatkan SVN (Nomor Versi Keamanan) dari manifes ini, hash SHA256 dari kunci publik manifes berikutnya, kunci publik RSA (yaitu bagian publik dari kunci root vendor) untuk memverifikasi tanda tangan manifes ini dan tanda tangan itu sendiri;
  2. Manifes IBB (IBBM, Manifest Blok Boot Awal), yang menempatkan SVN manifes ini, hash SHA256 dari IBB, kunci publik untuk memverifikasi tanda tangan manifes ini, dan tanda tangan itu sendiri.

Hash SHA256 dari OEM Root Key ditulis secara permanen ke chipset fuses (FPFs), sama seperti konfigurasi Intel BG. Jika konfigurasi Intel BG menyediakan penyertaan teknologi ini, maka mulai sekarang sistem ini hanya pemilik bagian pribadi OEM Root Key yang dapat memperbarui BIOS (yaitu dapat menghitung ulang manifes ini), mis. penjual.

Boot tepercaya Schrödinger. Pelindung Boot Intel

Saat Anda melihat gambarnya, keraguan segera muncul tentang perlunya rantai verifikasi yang begitu panjang - Anda bisa saja menggunakan satu manifes. Mengapa rumit?

Nyatanya, Intel memberikan kesempatan kepada vendor untuk menggunakan kunci IBB yang berbeda untuk lini produk yang berbeda dan satu sebagai root. Jika bagian pribadi kunci IBB (yang menandai manifes kedua) bocor, insiden tersebut hanya akan memengaruhi satu lini produk dan hanya hingga vendor membuat pasangan baru dan mengaktifkan manifes yang dihitung ulang dalam pembaruan BIOS berikutnya.

Tetapi jika kunci root dikompromikan (yang dengannya manifes pertama ditandatangani), tidak mungkin untuk menggantinya, prosedur pencabutan tidak disediakan. hash dari bagian publik dari kunci ini diprogram ke dalam FPF untuk selamanya.

Konfigurasi Pelindung Boot Intel

Sekarang mari kita lihat lebih dekat konfigurasi Intel BG dan proses pembuatannya. Jika Anda melihat tab yang sesuai di GUI Flash Image Tool dari Intel System Tool Kit (STK), Anda akan melihat bahwa konfigurasi Intel BG menyertakan hash dari bagian publik dari kunci root vendor, beberapa yang tidak jelas nilai-nilai, dan sebagainya. Profil Intel BG.

Boot tepercaya Schrödinger. Pelindung Boot Intel

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 adalah entitas yang sangat fleksibel. Pertimbangkan, misalnya, bendera Force_Boot_Guard_ACM. Ketika dibersihkan, jika modul ACM startup BG pada flash SPI tidak ditemukan, boot tepercaya tidak akan terjadi. Itu tidak akan bisa dipercaya.

Kami telah menulis di atas bahwa kebijakan penegakan untuk mode VB dapat dikonfigurasi sehingga jika verifikasi gagal, sekali lagi, unduhan yang tidak tepercaya akan terjadi.

Serahkan hal-hal seperti ini kepada vendor...

GUI utilitas menyediakan profil "siap pakai" berikut:

jumlah
Mode
Описание

0
Tidak_FVME
Teknologi Intel BG dinonaktifkan

1
VE
Mode VB diaktifkan, dimatikan dengan batas waktu

2
VME
kedua mode diaktifkan (VB dan MB), dimatikan dengan batas waktu

3
VM
kedua mode diaktifkan, tanpa mematikan sistem

4
FVE
Mode VB diaktifkan, matikan segera

5
FVME
kedua mode diaktifkan, matikan segera

Seperti yang telah disebutkan, konfigurasi Intel BG harus ditulis sekali dan untuk selamanya oleh vendor sistem ke dalam chipset fuses (FPFs) - penyimpanan informasi perangkat keras kecil (menurut informasi yang belum diverifikasi, hanya 256 byte) di dalam chipset, yang dapat diprogram di luar fasilitas produksi Intel (jadi itu sebabnya Bidang Dapat Diprogram sekering).

Sangat bagus untuk menyimpan konfigurasi karena:

  • memiliki area penyimpanan data yang dapat diprogram satu kali (tepat di mana konfigurasi Intel BG ditulis);
  • hanya Intel ME yang dapat membaca dan memprogramnya.

Jadi, untuk mengatur konfigurasi teknologi Intel BG pada sistem tertentu, vendor melakukan hal berikut selama produksi:

  1. Menggunakan Alat Gambar Flash (dari Intel STK), membuat gambar firmware dengan konfigurasi Intel BG tertentu sebagai variabel di dalam wilayah Intel ME (yang disebut cermin sementara untuk FPF);
  2. Menggunakan Alat Pemrograman Flash (dari Intel STK), tulis gambar ini ke memori flash SPI sistem dan tutup apa yang disebut. mode manufaktur (dalam hal ini, perintah yang sesuai dikirim ke Intel ME).

Sebagai hasil dari operasi ini, Intel ME akan berkomitmen pada FPF nilai yang diberikan dari mirror untuk FPF di wilayah ME, mengatur izin dalam deskriptor flash SPI ke nilai yang direkomendasikan oleh Intel (dijelaskan di awal artikel) dan melakukan RESET sistem.

Analisis Implementasi Intel Boot Guard

Untuk menganalisis implementasi teknologi ini pada contoh spesifik, kami memeriksa sistem berikut untuk melacak teknologi Intel BG:

Sistem
Catatan

Gigabita GA-H170-D3H
Skylake, ada dukungan

Gigabita GA-Q170-D3H
Skylake, ada dukungan

Gigabita GA-B150-HD3
Skylake, ada dukungan

MSI H170A Gaming Pro
Skylake, tidak ada dukungan

Lenovo ThinkPad 460
Skylake, dukungan tersedia, teknologi diaktifkan

Lenovo Yoga 2 Pro
Haswell, tidak ada dukungan

Lenovo U330p
Haswell, tidak ada dukungan

"Dukungan" berarti keberadaan modul ACM startup Intel BG, manifes yang disebutkan di atas dan kode yang sesuai di BIOS, mis. implementasi untuk analisis.

Sebagai contoh, ambil yang diunduh dari kantor. gambar situs vendor memori flash SPI untuk Gigabyte GA-H170-D3H (versi F4).

ROM boot CPU Intel

Pertama-tama, mari kita bicara tentang tindakan prosesor jika teknologi Intel BG diaktifkan.

Tidak mungkin menemukan sampel kode mikro yang didekripsi, oleh karena itu, bagaimana tindakan yang dijelaskan di bawah ini diterapkan (dalam kode mikro atau perangkat keras) adalah pertanyaan terbuka. Namun demikian, fakta bahwa prosesor Intel modern "dapat" melakukan tindakan ini adalah fakta.

Setelah keluar dari status RESET, prosesor (yang ruang alamatnya telah memetakan isi memori flash) menemukan FIT (Firmware Interface Table). Menemukannya mudah, penunjuk ke sana tertulis di alamat FFFF FFC0h.

Boot tepercaya Schrödinger. Pelindung Boot Intel
Dalam contoh ini, alamat ini berisi nilai FFD6 9500h. Beralih ke alamat ini, prosesor melihat tabel FIT, yang isinya dibagi menjadi catatan. Entri pertama adalah judul dari 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;
};

Boot tepercaya Schrödinger. Pelindung Boot Intel
Untuk beberapa alasan yang tidak diketahui, checksum tidak selalu dihitung dalam tabel ini (kolom dibiarkan nol).

Entri yang tersisa menunjuk ke berbagai binari yang perlu diurai/dieksekusi sebelum BIOS dijalankan, mis. sebelum beralih ke vektor RESET lama (FFFF FFF0h). Struktur setiap entri tersebut adalah sebagai 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;
};

Boot tepercaya Schrödinger. Pelindung Boot Intel
Kolom EntryType menunjukkan jenis blok yang dituju oleh entri ini. 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
};

Sekarang jelas bahwa salah satu entri menunjuk ke lokasi biner ACM startup Intel BG. Struktur tajuk biner ini tipikal untuk modul kode yang dikembangkan oleh Intel (ACM, pembaruan mikrokode, bagian kode 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];
};

Boot tepercaya Schrödinger. Pelindung Boot Intel
Prosesor memuat biner ini ke dalam cache, memverifikasi, dan meluncurkan.

Intel BG memulai ACM

Sebagai hasil dari analisis pekerjaan ACM ini, menjadi jelas bahwa ia melakukan hal-hal berikut:

  • menerima dari Intel ME konfigurasi Intel BG yang ditulis ke sekering chipset (FPF);
  • menemukan KEYM dan manifes IBM, memverifikasinya.

Untuk menemukan manifes ini, ACM juga menggunakan tabel FIT, yang memiliki dua jenis entri untuk menunjuk ke struktur ini (lihat FIT_ENTRY_TYPES di atas).

Mari kita lihat lebih dekat manifestonya. Dalam struktur manifes pertama, kami melihat beberapa konstanta yang tidak jelas, hash kunci publik dari manifes kedua, dan Kunci Root OEM publik yang 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];
};

Boot tepercaya Schrödinger. Pelindung Boot Intel
Untuk memverifikasi kunci publik dari Kunci Root OEM, kami ingat bahwa hash SHA256 dari sekering digunakan, yang saat ini telah diterima dari Intel ME.

Mari beralih ke manifesto kedua. Ini terdiri dari tiga struktur:

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

Yang pertama berisi beberapa konstanta:

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 berisi hash SHA256 dari IBB dan jumlah deskriptor yang mendeskripsikan konten IBB (yaitu dari mana hash dihitung):

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 mengikuti struktur ini, satu demi satu. Konten mereka memiliki format berikut:

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

Sederhana saja: setiap deskriptor berisi alamat/ukuran potongan IBB. Dengan demikian, rangkaian blok yang ditunjuk oleh deskriptor ini (dalam urutan deskriptor itu sendiri) adalah IBB. Dan, sebagai aturan, IBB adalah kombinasi dari semua modul fase SEC dan PEI.

Manifes kedua diakhiri dengan struktur yang berisi kunci publik IBB (diverifikasi oleh hash SHA256 dari manifes pertama) dan tanda tangan manifes ini:

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

Boot tepercaya Schrödinger. Pelindung Boot Intel
Jadi, bahkan sebelum eksekusi UEFI BIOS dimulai, prosesor akan meluncurkan ACM, yang akan memverifikasi keaslian konten bagian dengan kode fase SEC dan PEI. Selanjutnya, prosesor keluar dari ACM, bergerak di sepanjang vektor RESET, dan mulai menjalankan BIOS.

Partisi terverifikasi PEI harus berisi modul yang akan memeriksa sisa BIOS (kode DXE). Modul ini sudah dikembangkan oleh IBV (Vendor BIOS Independen) atau vendor sistem itu sendiri. Karena Hanya sistem Lenovo dan Gigabyte yang tersedia untuk kami dan memiliki dukungan Intel BG, mari pertimbangkan kode yang diekstraksi dari sistem ini.

Modul UEFI BIOS LenovoVerifiedBootPei

Dalam kasus Lenovo, ternyata itu adalah modul LenovoVerifiedBootPei {B9F2AC77-54C7-4075-B42E-C36325A9468D}, yang dikembangkan oleh Lenovo.

Tugasnya adalah mencari (melalui GUID) tabel hash untuk DXE dan memverifikasi 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 kasus Gigabyte, ternyata itu adalah modul BootGuardPei {B41956E1-7CA2-42DB-9562-168389F0F066}, yang dikembangkan oleh AMI, dan karenanya hadir di BIOS AMI mana pun dengan dukungan Intel BG.

Algoritme operasinya agak berbeda, namun intinya 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;
}

Tabel hash {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} yang terlihat memiliki format berikut:

typedef HASH_TABLE DXE_DESCRIPTORS[];

typedef struct DXE_DESCRIPTOR
{
	unsigned char BlockHash[32];     // SHA256
	unsigned long BaseAddress;
	unsigned long Size;
};

Penjaga Boot Intel 2.x

Mari kita bahas secara singkat tentang implementasi lain dari Intel Boot Guard, yang ditemukan di sistem yang lebih baru berdasarkan Intel SoC dengan mikroarsitektur Apollo Lake - ASRock J4205-IT.

Meskipun versi ini hanya akan digunakan di SoC (sistem baru dengan mikroarsitektur prosesor Kaby Lake terus menggunakan Intel Boot Guard 1.x), sangat menarik untuk mengeksplorasi opsi arsitektur baru untuk platform berbasis Intel SoC, yang telah terlihat nyata perubahan, misalnya:

  • Wilayah BIOS dan Intel ME (atau lebih tepatnya Intel TXE, menurut terminologi Intel SoC) sekarang menjadi satu wilayah IFWI;
  • meskipun Intel BG diaktifkan di platform, struktur seperti FIT, KEYM, IBM tidak ditemukan di memori flash;
  • selain inti TXE dan ISH (x86), inti ketiga (lagi-lagi ARC) ditambahkan ke chipset - PMC (Pengontrol Manajemen Daya), terkait dengan memastikan pengoperasian subsistem daya dan pemantauan kinerja.

Boot tepercaya Schrödinger. Pelindung Boot Intel
Konten wilayah IFWI yang baru adalah sekumpulan modul berikut:

Bias
nama
Описание

0000 2000 jam
SMP
beberapa konfigurasi platform, ditandatangani oleh vendor

0000 6000 jam
RBEP
Bagian kode firmware Intel TXE, x86, ditandatangani oleh Intel

0001 0000 jam
PMCP
bagian kode firmware Intel PMC, ARC, ditandatangani oleh Intel

0002 0000 jam
FTPR
Bagian kode firmware Intel TXE, x86, ditandatangani oleh Intel

0007B000h
UCOD
Pembaruan mikrokode CPU ditandatangani oleh Intel

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

0021 8000 jam
ISHC
bagian kode firmware Intel ISH, x86, ditandatangani oleh vendor

0025 8000 jam
FTP
Bagian kode firmware Intel TXE, x86, ditandatangani oleh Intel

0036 1000 jam
IUNP
tidak diketahui

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

Selama analisis firmware TXE, menjadi jelas bahwa setelah RESET, TXE mempertahankan prosesor dalam keadaan ini hingga menyiapkan konten dasar ruang alamat untuk CPU (FIT, ACM, vektor RESET ...). Selain itu, TXE menempatkan data ini di SRAM-nya, setelah itu untuk sementara memberikan prosesor akses ke sana dan "melepaskannya" dari RESET.

Waspada terhadap rootkit

Nah, sekarang mari beralih ke yang "panas". Kami pernah menemukan bahwa pada banyak deskriptor flash SPI sistem memiliki izin untuk mengakses wilayah memori flash SPI sehingga semua pengguna memori ini dapat menulis dan membaca wilayah mana pun. Itu. mustahil.

Setelah memeriksa dengan utilitas MEinfo (dari Intel STK), kami melihat bahwa mode pembuatan pada sistem ini tidak ditutup, oleh karena itu, sekering chipset (FPF) dibiarkan dalam keadaan tidak pasti. Ya, Intel BG tidak diaktifkan atau dinonaktifkan dalam kasus tersebut.

Kami berbicara tentang sistem berikut (mengenai Intel BG dan apa yang akan dijelaskan nanti di artikel, kami akan berbicara tentang sistem dengan mikroarsitektur prosesor Haswell dan yang lebih tinggi):

  • semua produk Gigabyte;
  • semua produk MSI;
  • 21 model laptop Lenovo dan 4 model server Lenovo.

Tentu saja, kami melaporkan temuan tersebut ke vendor tersebut, serta ke Intel.

Tanggapan yang memadai hanya diikuti dari Lenovoyang mengakui masalah dan merilis tambalan.

Gigabyte Tampaknya mereka menerima informasi tentang kerentanan tersebut, tetapi tidak berkomentar sama sekali.

Komunikasi dengan MSI benar-benar terhenti atas permintaan kami untuk mengirimkan kunci PGP publik kami (untuk mengirimi mereka penasihat keamanan terenkripsi). Mereka menyatakan bahwa mereka "adalah pembuat perangkat keras dan tidak membuat kunci PGP."

Tapi lebih ke intinya. Karena sekering dibiarkan dalam keadaan tidak terdefinisi, pengguna (atau penyerang) dapat memprogramnya sendiri (yang paling sulit adalah temukan Intel STK). Ini membutuhkan langkah-langkah berikut.

1. Boot ke OS Windows (secara umum, langkah-langkah yang dijelaskan di bawah ini juga dapat dilakukan dari Linux jika Anda mengembangkan analog Intel STK untuk OS yang diinginkan). Menggunakan utilitas MEinfo, pastikan sekering pada sistem ini tidak diprogram.

Boot tepercaya Schrödinger. Pelindung Boot Intel
2. Baca isi memori flash menggunakan Alat Pemrograman Flash.

Boot tepercaya Schrödinger. Pelindung Boot Intel
3. Buka gambar baca menggunakan alat pengeditan UEFI BIOS apa pun, buat perubahan yang diperlukan (implementasikan rootkit, misalnya), buat / edit struktur KEYM dan IBM yang ada di wilayah ME.

Boot tepercaya Schrödinger. Pelindung Boot Intel
Boot tepercaya Schrödinger. Pelindung Boot Intel
Bagian publik dari kunci RSA disorot dalam gambar, yang hashnya akan diprogram ke dalam chipset bersama dengan konfigurasi Intel BG lainnya.

4. Menggunakan Alat Gambar Flash, buat gambar firmware baru (dengan menyetel konfigurasi Intel BG).

Boot tepercaya Schrödinger. Pelindung Boot Intel
5. Tulis gambar baru ke flash menggunakan Alat Pemrograman Flash, verifikasi menggunakan MEinfo bahwa wilayah ME sekarang berisi konfigurasi Intel BG.

Boot tepercaya Schrödinger. Pelindung Boot Intel
6. Gunakan Alat Pemrograman Flash untuk menutup mode manufaktur.

Boot tepercaya Schrödinger. Pelindung Boot Intel
7. Sistem akan reboot, setelah itu, menggunakan MEinfo, Anda dapat memverifikasi bahwa FPF sekarang telah diprogram.

Boot tepercaya Schrödinger. Pelindung Boot Intel
Tindakan ini selama-lamanya aktifkan Intel BG pada sistem ini. Tidak mungkin untuk membatalkan tindakan, yang berarti:

  • hanya pemilik bagian pribadi dari kunci root (yaitu, yang mengaktifkan Intel BG) yang dapat memperbarui UEFI BIOS pada sistem ini;
  • jika Anda mengembalikan firmware asli ke sistem ini, misalnya, menggunakan programmer, itu bahkan tidak akan menyala (konsekuensi dari kebijakan penegakan jika terjadi kesalahan verifikasi);
  • untuk menghilangkan UEFI BIOS seperti itu, Anda perlu mengganti chipset dengan FPF yang diprogram dengan yang "bersih" (yaitu menyolder ulang chipset jika Anda memiliki akses ke stasiun solder inframerah dengan harga mobil, atau cukup ganti motherboard ).

Untuk memahami apa yang dapat dilakukan oleh rootkit tersebut, Anda perlu mengevaluasi apa yang memungkinkan untuk mengeksekusi kode Anda di lingkungan UEFI BIOS. Katakanlah, dalam mode prosesor yang paling istimewa - SMM. Rootkit semacam itu mungkin memiliki properti berikut:

  • dieksekusi secara paralel dengan OS (Anda dapat mengonfigurasi pemrosesan dengan membuat interupsi SMI, yang akan dipicu oleh pengatur waktu);
  • memiliki semua keuntungan berada dalam mode SMM (akses penuh ke konten RAM dan sumber daya perangkat keras, kerahasiaan dari OS);
  • Kode rootkit dapat dienkripsi dan didekripsi saat diluncurkan dalam mode SMM. Data apa pun yang hanya tersedia dalam mode SMM dapat digunakan sebagai kunci enkripsi. Misalnya, hash dari sekumpulan alamat di SMRAM. Untuk mendapatkan kunci ini, Anda harus naik ke SMM. Dan ini bisa dilakukan dengan dua cara. Temukan RCE dalam kode SMM dan manfaatkan, atau tambahkan modul SMM Anda sendiri ke BIOS, yang tidak mungkin dilakukan, karena kami mengaktifkan Boot Guard.

Dengan demikian, kerentanan ini memungkinkan penyerang untuk:

  • membuat rootkit yang tersembunyi dan tidak dapat dilepas dengan tujuan yang tidak diketahui dalam sistem;
  • jalankan kode Anda di salah satu inti chipset di dalam Intel SoC, yaitu di Intel ISH (lihat gambar lebih dekat).

Boot tepercaya Schrödinger. Pelindung Boot Intel
Boot tepercaya Schrödinger. Pelindung Boot Intel
Meskipun kemampuan subsistem Intel ISH belum dieksplorasi, tampaknya ini menjadi vektor serangan yang menarik terhadap Intel ME.

Temuan

  1. Studi ini memberikan deskripsi teknis tentang cara kerja teknologi Intel Boot Guard. Minus beberapa rahasia dalam keamanan Intel melalui model ketidakjelasan.
  2. Skenario serangan disajikan yang memungkinkan pembuatan rootkit yang tidak dapat dilepas dalam sistem.
  3. Kami telah melihat bahwa prosesor Intel modern mampu mengeksekusi banyak kode hak milik bahkan sebelum BIOS dimulai.
  4. Platform dengan arsitektur Intel 64 menjadi semakin tidak cocok untuk menjalankan perangkat lunak bebas: verifikasi perangkat keras, semakin banyak teknologi dan subsistem hak milik (tiga inti dalam chipset SoC: x86 ME, x86 ISH, dan ARC PMC).

Mitigasi

Vendor yang sengaja membiarkan mode manufaktur terbuka pasti harus menutupnya. Sejauh ini, mereka hanya menutup mata dan sistem Danau Kaby yang baru menunjukkan hal ini.

Pengguna dapat menonaktifkan Intel BG pada sistem mereka (yang dipengaruhi oleh kerentanan yang dijelaskan) dengan menjalankan Alat Pemrograman Flash dengan opsi -closemnf. Pertama, Anda harus memastikan (menggunakan MEinfo) bahwa konfigurasi Intel BG di wilayah ME menyediakan untuk mematikan teknologi ini dengan tepat setelah memprogram dalam FPF.

Sumber: www.habr.com

Tambah komentar