Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Tekrar düşük bir seviyeye inmeyi ve x86 uyumlu bilgisayar platformları için ürün yazılımının güvenliği hakkında konuşmayı öneriyoruz. Bu sefer çalışmanın ana bileşeni, bilgisayar sistemi satıcısının üretim aşamasında kalıcı olarak etkinleştirebileceği veya devre dışı bırakabileceği, donanım destekli güvenilir bir BIOS önyükleme teknolojisi olan Intel Boot Guard'dır (Intel BIOS Guard ile karıştırılmamalıdır!). Araştırma tarifi zaten bize tanıdık geliyor: Tersine mühendislik kullanarak bu teknolojinin uygulanmasını ince ince dilimleyin, mimarisini tanımlayın, belgelenmemiş ayrıntılarla doldurun, tadına bakmak ve karıştırmak için saldırı vektörleriyle baharatlayın. Birkaç satıcının üretiminde yıllardır klonlanan bir hatanın, potansiyel bir saldırganın bu teknolojiyi kullanarak sistemde kaldırılamayacak (bir programcıyla bile) gizli bir rootkit oluşturmasına nasıl izin verdiğinin hikayesine yakıt ekleyelim.

Bu arada makale konferansın “On Guard of Rootkits: Intel BootGuard” raporlarına dayanıyor. SıfırGeceler 2016 ve 29. toplantı DefCon Rusya (her iki sunum burada).

Intel 64 mimarisine sahip bir bilgisayar platformu için ürün yazılımı

Öncelikle şu soruyu cevaplayalım: Intel 64 mimarisine sahip modern bir bilgisayar platformunun donanım yazılımı nedir? Tabii ki, UEFI BIOS. Ancak böyle bir cevap doğru olmayacaktır. Bu mimarinin masaüstü (dizüstü) versiyonunu gösteren resme bir göz atalım.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Temel bağlantıdır:

  • Ana çekirdeklere ek olarak yerleşik bir grafik çekirdeğine (tüm modellerde değil) ve bir bellek denetleyicisine (IMC, Tümleşik Bellek Denetleyicisi) sahip olan İşlemci (CPU, Merkezi İşlem Birimi);
  • Çevresel aygıtlarla etkileşim kurmak ve alt sistemleri yönetmek için çeşitli denetleyiciler içeren Yonga Seti (PCH, Platform Denetleyici Merkezi). Bunların arasında, aynı zamanda ürün yazılımına (Intel ME ürün yazılımı) sahip olan tanınmış Intel Yönetim Motoru (ME) bulunmaktadır.

Dizüstü bilgisayarlar, yukarıdakilere ek olarak, güç alt sisteminin, dokunmatik yüzeyin, klavyenin, Fn tuşlarının (ekran parlaklığı, ses düzeyi) çalışmasından sorumlu olan yerleşik bir denetleyiciye (ACPI EC, Gelişmiş Kontrol ve Güç Arayüzü Gömülü Denetleyici) ihtiyaç duyar. , klavye arka ışığı vb.) ve diğer şeyler. Ayrıca kendi firmware'i de var.

Dolayısıyla, yukarıdaki donanım yazılımının tamamı, ortak bir SPI flash belleğinde depolanan bilgisayar platformunun (sistem donanım yazılımı) donanım yazılımıdır. Bu hafızanın kullanıcılarının nerede olduğu konusunda kafalarının karışmaması için bu hafızanın içerikleri aşağıdaki bölgelere ayrılmıştır (şekilde gösterildiği gibi):

  • UEFI BIOS'u;
  • ACPI EC donanım yazılımı (Skylake işlemci mikro mimarisi (2015) ile ayrı bir bölge ortaya çıktı, ancak kullanım örneklerini henüz görmedik, bu nedenle yerleşik denetleyicinin donanım yazılımı hala UEFI BIOS'ta yer alıyor) ;
  • Intel ME ürün yazılımı;
  • yerleşik GbE (Gigabit Ethernet) ağ bağdaştırıcısının yapılandırması (MAC adresi vb.);
  • Flash Tanımlayıcıları, diğer bölgelere işaretçilerin yanı sıra bunlara erişim izinlerini içeren flash belleğin ana bölgesidir.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Yonga setinde yerleşik bir SPI denetleyicisi olan ve bu belleğe erişilen SPI veri yolu yöneticisi, bölgelere erişimin sınırlandırılmasından sorumludur (belirtilen izinlere uygun olarak). İzinler Intel'in önerdiği (güvenlik nedeniyle) değerlere ayarlanırsa her SPI flash kullanıcısı yalnızca kendi bölgesine tam erişime (okuma/yazma) sahip olur. Ve geri kalanı ya salt okunurdur ya da erişilemezdir. Bilinen bir gerçek: Birçok sistemde CPU'nun UEFI BIOS ve GbE'ye tam erişimi vardır, flash tanımlayıcılara yalnızca okuma erişimi vardır ve Intel ME bölgesine hiçbir erişimi yoktur. Neden çoğunda değil de çoğunda? Önerilen şey gerekli değildir. Makalenin ilerleyen kısımlarında size daha ayrıntılı olarak anlatacağız.

Bilgisayar platformu donanım yazılımını değişiklikten koruma mekanizmaları

Açıkçası, bir bilgisayar platformunun donanım yazılımının, potansiyel bir saldırganın bu platformda yer edinmesine (işletim sistemi güncellemelerinden/yeniden kurulumlarından sağ çıkmasına), kodlarını en ayrıcalıklı modlarda yürütmesine vb. olanak tanıyacak olası risklerden korunması gerekir. Ve SPI flash bellek bölgelerine erişimi kısıtlamak elbette yeterli değil. Bu nedenle, ürün yazılımını değişikliklerden korumak için her işletim ortamına özgü çeşitli mekanizmalar kullanılır.

Böylece Intel ME ürün yazılımı, bütünlüğü ve orijinalliği kontrol etmek için imzalanır ve ME UMA belleğine her yüklendiğinde ME denetleyicisi tarafından kontrol edilir. Bu doğrulama süreci tarafımızdan zaten bunlardan birinde tartışılmıştır. makaleler, Intel ME alt sistemine adanmıştır.

Ve ACPI EC ürün yazılımı, kural olarak yalnızca bütünlük açısından kontrol edilir. Ancak bu ikili dosyanın UEFI BIOS'a dahil olması nedeniyle neredeyse her zaman UEFI BIOS'un kullandığı koruma mekanizmalarının aynısına tabidir. Hadi onlar hakkında konuşalım.

Bu mekanizmalar iki kategoriye ayrılabilir.

UEFI BIOS bölgesinde yazma koruması

  1. SPI flash belleğin içeriğinin yazmaya karşı korumalı bir atlama kablosuyla fiziksel olarak korunması;
  2. PRx yonga seti kayıtlarını kullanarak UEFI BIOS bölgesinin CPU adres alanındaki projeksiyonunun korunması;
  3. Yonga seti kayıtlarında BIOS_WE/BLE ve SMM_BWP bitlerini ayarlayarak karşılık gelen SMI kesmesini oluşturup işleyerek UEFI BIOS bölgesine yazma girişimlerini engelleme;
  4. Bu korumanın daha gelişmiş bir versiyonu Intel BIOS Guard'dır (PFAT).

Bu mekanizmalara ek olarak satıcılar kendi güvenlik önlemlerini geliştirip uygulayabilirler (örneğin, UEFI BIOS güncellemeleriyle kapsülleri imzalamak).

Belirli bir sistemde (satıcıya bağlı olarak) yukarıdaki koruma mekanizmalarının tamamının uygulanamayabileceğini, hiç uygulanmayabileceğini veya savunmasız bir şekilde uygulanabileceğini unutmamak önemlidir. Bu mekanizmalar ve bunların uygulanmasındaki durum hakkında daha fazla bilgiyi şurada bulabilirsiniz: Bu makalede. İlgilenenlerin UEFI BIOS güvenliğiyle ilgili makale serisinin tamamını şuradan okumanızı öneririz: CodeRush.

UEFI BIOS kimlik doğrulaması

Güvenilir önyükleme teknolojilerinden bahsettiğimizde akla ilk gelen Güvenli Önyüklemedir. Ancak mimari olarak, bellenimin kendisinin değil, UEFI BIOS'un dışındaki bileşenlerin (sürücüler, önyükleyiciler vb.) orijinalliğini doğrulamak için tasarlanmıştır.

Bu nedenle Intel, Bay Trail mikro mimarisine sahip SoC'lerde (2012), yukarıda belirtilen Güvenli Önyükleme teknolojisiyle hiçbir ortak yanı olmayan, donanımsal olarak devre dışı bırakılmamış Güvenli Önyükleme (Doğrulanmış Önyükleme) uyguladı. Daha sonra (2013) bu mekanizma geliştirilerek Haswell mikro mimarisine sahip masaüstü bilgisayarlar için Intel Boot Guard adı altında piyasaya sürüldü.

Intel Boot Guard'ı tanımlamadan önce, bu güvenilir önyükleme teknolojisi için güvenin kökleri olan Intel 64 mimarisindeki yürütme ortamlarına bakalım.

Intel CPU

Cap, Intel 64 mimarisindeki ana yürütme ortamının işlemci olduğunu öne sürüyor. Neden güvenin köküdür? Onu böyle yapan şeyin şu unsurlara sahip olması olduğu ortaya çıktı:

  • Mikrokod ROM, mikro kodu depolamak için kalıcı, yeniden yazılamaz bir bellektir. Mikro kodun, en basit talimatları kullanarak işlemci komut sisteminin uygulanması olduğuna inanılmaktadır. Mikro kodda da oluyor böcek. Böylece BIOS'ta mikro kod güncellemelerine sahip ikili dosyalar bulabilirsiniz (ROM'un üzerine yazılamadığından önyükleme sırasında kaplanmıştır). Bu ikili dosyaların içeriği şifrelenir, bu da analizi büyük ölçüde karmaşıklaştırır (bu nedenle mikro kodun belirli içeriği yalnızca onu geliştirenler tarafından bilinir) ve bütünlüğü ve orijinalliği kontrol etmek için imzalanır;
  • Mikro kod güncellemelerinin içeriğinin şifresini çözmek için AES anahtarı;
  • mikro kod güncellemelerinin imzasını doğrulamak için kullanılan RSA genel anahtarının karması;
  • CPU'nun BIOS yürütmesinden önce (merhaba mikro kod) veya çalışması sırasında belirli olaylar meydana geldiğinde başlatabileceği, Intel tarafından geliştirilen ACM (Kimlik Doğrulamalı Kod Modülü) kod modüllerinin imzasını doğrulayan RSA genel anahtar karması.

Intel ME

Blogumuz bu alt sisteme adanmıştır iki makaleler. Bu çalıştırılabilir ortamın yonga setine yerleşik bir mikro denetleyiciye dayandığını ve sistemdeki en gizli ve ayrıcalıklı ortam olduğunu hatırlayalım.

Gizliliğine rağmen Intel ME aynı zamanda bir güven köküdür çünkü aşağıdaki özelliklere sahiptir:

  • ME ROM - başlangıç ​​kodunun yanı sıra Intel ME ürün yazılımının imzasını doğrulayan RSA genel anahtarının SHA256 karmasını içeren kalıcı, yeniden yazılamaz bellek (güncelleme yöntemi sağlanmaz);
  • Gizli bilgileri saklamak için AES anahtarı;
  • bilgisayar sistemi satıcısı tarafından belirtilenler de dahil olmak üzere bazı bilgilerin kalıcı olarak saklanması için yonga setine entegre edilmiş bir dizi sigortaya (FPF'ler, Sahada Programlanabilir Sigortalar) erişim.

Intel Önyükleme Koruması 1.x

Küçük bir sorumluluk reddi beyanı. Bu makalede kullandığımız Intel Boot Guard teknolojisi sürüm numaraları isteğe bağlıdır ve Intel'in dahili belgelerinde kullanılan numaralandırmayla hiçbir ilgisi olmayabilir. Ayrıca, bu teknolojinin uygulanmasına ilişkin burada verilen bilgiler tersine mühendislik sırasında elde edilmiştir ve muhtemelen hiçbir zaman yayınlanmayacak olan Intel Boot Guard spesifikasyonuyla karşılaştırıldığında yanlışlıklar içerebilir.

Dolayısıyla Intel Boot Guard (BG), donanım tarafından desteklenen bir UEFI BIOS kimlik doğrulama doğrulama teknolojisidir. Kitaptaki kısa açıklamasına bakılırsa [Platform Embedded Security Technology Revealed, bölüm Bütünlükle Önyükleme veya Önyükleme Değil], güvenilir bir önyükleme zinciri olarak çalışır. Ve içindeki ilk bağlantı, RESET olayı tarafından tetiklenen CPU içindeki önyükleme kodudur (mikro kod). (BIOS'taki RESET vektörüyle karıştırılmamalıdır!). CPU, SPI flash belleğinde Intel (Intel BG başlangıç ​​ACM) tarafından geliştirilen ve imzalanan bir kod modülünü bulur, onu önbelleğine yükler, doğrular (CPU'nun ACM'yi doğrulayan ortak anahtarın bir karmasına sahip olduğu yukarıda zaten belirtilmişti) İmza) ve başlar.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması

Bu kod modülü, UEFI BIOS'un küçük bir başlangıç ​​bölümünü doğrulamaktan sorumludur - İlk Önyükleme Bloğu (IBB), bu da UEFI BIOS'un ana bölümünü doğrulamaya yönelik işlevsellik içerir. Böylece Intel BG, işletim sistemini yüklemeden önce BIOS'un orijinalliğini doğrulamanıza olanak tanır (bu, Güvenli Önyükleme teknolojisinin denetimi altında gerçekleştirilebilir).

Intel BG teknolojisi iki çalışma modu sağlar (ve biri diğerini etkilemez; yani her iki mod da sistemde etkinleştirilebilir veya her ikisi de devre dışı bırakılabilir).

Ölçülen Önyükleme

Ölçülü Önyükleme (MB) modunda, her önyükleme bileşeni (CPU önyükleme ROM'undan başlayarak) TPM'nin (Güvenilir Platform Modülü) özelliklerini kullanarak bir sonrakini "ölçer". Bilmeyenler için açıklayayım.

TPM, karma işleminin sonucunun aşağıdaki formüle göre yazıldığı PCR'lere (Platform Yapılandırma Kayıtları) sahiptir:

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması

Onlar. mevcut PCR değeri bir öncekine bağlıdır ve bu kayıtlar yalnızca sistem RESETlendiğinde sıfırlanır.

Dolayısıyla, MB modunda, zamanın bir noktasında PCR'ler, "ölçülen" kod veya verinin benzersiz (karma işleminin yetenekleri dahilinde) tanımlayıcısını yansıtır. PCR değerleri bazı veri şifreleme (TPM_Seal) işlemlerinde kullanılabilir. Bundan sonra, bunların şifresinin çözülmesi (TPM_Unseal) ancak yükleme sonucunda PCR değerleri değişmediyse (yani tek bir "ölçülmüş" bileşen değiştirilmediyse) mümkün olacaktır.

Doğrulanmış Önyükleme

UEFI BIOS'u değiştirmek isteyenler için en kötü şey, her önyükleme bileşeninin bir sonrakinin bütünlüğünü ve orijinalliğini kriptografik olarak doğruladığı Doğrulanmış Önyükleme (VB) modudur. Ve bir doğrulama hatası durumunda (biri):

  • 1 dakikadan 30 dakikaya kadar zaman aşımı ile kapatma (böylece kullanıcının bilgisayarının neden önyükleme yapmadığını anlamak için zamanı olur ve mümkünse BIOS'u geri yüklemeye çalışır);
  • anında kapatma (böylece kullanıcının herhangi bir şeyi anlamak, hatta yapmak için bile zamanı kalmaz);
  • Sakin bir ifadeyle çalışmaya devam etmek (güvenlik için zamanın olmadığı, çünkü yapılacak daha önemli işlerin olduğu durum).

Eylem seçimi, bilgisayar platformu satıcısı tarafından özel olarak tasarlanmış bir depolama yonga seti sigortalarına (FPF'ler) kalıcı olarak kaydedilen, belirtilen Intel BG yapılandırmasına (yani uygulama politikası adı verilen) bağlıdır. Bu nokta üzerinde daha sonra daha ayrıntılı olarak duracağız.

Yapılandırmaya ek olarak satıcı iki RSA 2048 anahtarı oluşturur ve iki veri yapısı oluşturur (şekilde gösterilmiştir):

  1. Bu manifestonun SVN'sini (Güvenlik Sürüm Numarası) içeren satıcının kök anahtar bildirimi (KEYM, OEM Kök Anahtar Bildirimi), bir sonraki bildirimin genel anahtarının SHA256 karmasını, RSA genel anahtarını (yani, satıcının kök anahtarı) bu manifestonun imzasını ve imzanın kendisini doğrulamak için;
  2. Bu manifestonun SVN'sini, IBB'nin SHA256 karmasını, bu manifestonun imzasını ve imzanın kendisini doğrulamaya yönelik genel anahtarı içeren IBB Manifest (IBBM, İlk Önyükleme Blok Manifestosu).

OEM Kök Anahtarı genel anahtarının SHA256 karması, tıpkı Intel BG yapılandırmasında olduğu gibi, yonga seti sigortalarına (FPF'ler) kalıcı olarak kaydedilir. Intel BG yapılandırması bu teknolojinin dahil edilmesini sağlıyorsa, bundan sonra yalnızca OEM Kök Anahtarının özel bölümünün sahibi bu sistemdeki BIOS'u güncelleyebilir (yani bu bildirimleri yeniden hesaplayabilir), yani. SATICI.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması

Resme baktığınızda, bu kadar uzun bir doğrulama zincirine duyulan ihtiyaç konusunda hemen şüpheler ortaya çıkıyor - tek bir bildirim kullanabilirlerdi. İşleri neden karmaşıklaştıralım ki?

Aslında Intel, satıcıya, ürünlerinin farklı serileri için farklı IBB anahtarlarını ve kök anahtar olarak bir tane kullanma fırsatını sağlıyor. IBB anahtarının (ikinci bildirimin imzalandığı) özel kısmı sızdırılırsa olay yalnızca bir ürün serisini etkileyecek ve yalnızca satıcı yeni bir çift oluşturup yeniden hesaplanan bildirimleri bir sonraki BIOS güncellemesine dahil edene kadar etkileyecektir.

Ancak (ilk bildirimin imzalandığı) kök anahtarın güvenliği ihlal edilirse, onu değiştirmek mümkün olmayacaktır; herhangi bir iptal prosedürü sağlanmamıştır. Bu anahtarın halka açık kısmının karması, FPF'ye kalıcı olarak programlanır.

Intel Boot Guard Yapılandırması

Şimdi Intel BG yapılandırmasına ve onu oluşturma sürecine daha yakından bakalım. Intel System Tool Kit'teki (STK) Flash Image Tool yardımcı programının GUI'sindeki ilgili sekmeye bakarsanız, Intel BG yapılandırmasının satıcının kök anahtarının genel kısmının bir karmasını içerdiğini fark edeceksiniz; belirsiz değerler vb. Intel BG profili.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması

Bu profilin yapısı:

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

Genel olarak Intel BG yapılandırması çok esnek bir varlıktır. Örneğin Force_Boot_Guard_ACM bayrağını düşünün. Kaldırıldığında, SPI flaşındaki BG başlatma ACM modülü bulunamazsa güvenilir önyükleme gerçekleşmez. Ona güvenilmez olacak.

Yukarıda, VB modu için uygulama politikasının, bir doğrulama hatası olması durumunda güvenilmeyen bir indirme gerçekleşecek şekilde yapılandırılabileceğini zaten yazmıştık.

Bu tür şeyleri satıcıların takdirine bırakın...

GUI yardımcı programı aşağıdaki "hazır" profilleri sağlar:

Hayır.
rejim
Açıklama

0
Hayır_FVME
Intel BG teknolojisi devre dışı

1
VE
VB modu etkinleştirildi, zaman aşımı nedeniyle kapatma

2
VME
her iki mod da etkin (VB ve MB), zaman aşımı nedeniyle kapatılıyor

3
VM
sistemi kapatmadan her iki mod da etkinleştirilir

4
FVE
VB modu etkin, anında kapatma

5
FVME
her iki mod da etkin, anında kapatma

Daha önce de belirtildiği gibi, Intel BG yapılandırmasının sistem satıcısı tarafından bir kez ve tamamen yonga seti sigortalarına (FPF'ler) yazılması gerekir - yonga seti içindeki programlanabilen küçük (doğrulanmamış bilgilere göre, yalnızca 256 bayt) donanımsal bilgi deposu Intel'in üretim tesislerinin dışında (tam olarak bu yüzden Alan Programlanabilir Sigortalar).

Yapılandırmayı depolamak için mükemmeldir çünkü:

  • verileri depolamak için tek seferlik programlanabilir bir alana sahiptir (tam olarak Intel BG yapılandırmasının yazıldığı yer);
  • Yalnızca Intel ME onu okuyabilir ve programlayabilir.

Dolayısıyla, Intel BG teknolojisinin yapılandırmasını belirli bir sistemde ayarlamak için satıcı, üretim sırasında aşağıdakileri yapar:

  1. Flash Image Tool yardımcı programını (Intel STK'dan) kullanarak, Intel ME bölgesi içindeki değişkenler biçiminde (FPF'ler için geçici ayna olarak adlandırılan) belirli bir Intel BG yapılandırmasına sahip bir ürün yazılımı görüntüsü oluşturur;
  2. Flash Programlama Aracı yardımcı programını (Intel STK'dan) kullanarak bu görüntüyü sistemin SPI flash belleğine yazar ve sözde kapatır. üretim modu (bu durumda ilgili komut Intel ME'ye gönderilir).

Bu işlemlerin sonucunda Intel ME, ME bölgesindeki FPF'ler için aynadan belirtilen değerleri FPF'lere işleyecek, SPI flash tanımlayıcılarındaki çözünürlükleri Intel tarafından önerilen değerlere ayarlayacaktır (bu yazının başında açıklanmıştır). makalesi) ve bir sistem SIFIRLAMA işlemi gerçekleştirin.

Intel Boot Guard uygulamasının analizi

Belirli bir örnek kullanarak bu teknolojinin uygulanmasını analiz etmek amacıyla aşağıdaki sistemleri Intel BG teknolojisinin izleri açısından kontrol ettik:

Sistem
Dikkat

Gigabyte GA-H170-D3H
Skylake, destek var

Gigabyte GA-Q170-D3H
Skylake, destek var

Gigabyte GA-B150-HD3
Skylake, destek var

MSI H170A Oyun Pro
Skylake'e destek yok

Lenovo Think Pad 460
Skylake, destekleniyor, teknoloji etkin

Lenovo Yoga 2 Pro
Haswell'e destek yok

Lenovo U330p
Haswell'e destek yok

"Destek" ile Intel BG başlangıç ​​ACM modülünün, yukarıda belirtilen bildirimlerin ve BIOS'taki ilgili kodun varlığını kastediyoruz; analiz için uygulanması.

Örnek olarak ofisten indirileni ele alalım. Gigabyte GA-H170-D3H (sürüm F4) için SPI flash belleğinin satıcı web sitesi görüntüsü.

Intel CPU önyükleme ROM'u

Öncelikle Intel BG teknolojisinin etkin olması durumunda işlemcinin yapacağı işlemlerden bahsedelim.

Şifresi çözülmüş mikro kod örnekleri bulmak mümkün olmadığından aşağıda açıklanan eylemlerin (mikro kodda veya donanımda) nasıl uygulandığı açık bir sorudur. Ancak modern Intel işlemcilerin bu işlemleri “yapabildiği” de bir gerçek.

RESET durumundan çıktıktan sonra işlemci (flaş belleğin içeriği zaten adres alanına eşlenmiştir) FIT (Ürün Yazılımı Arayüz Tablosu) tablosunu bulur. Bulmak kolaydır; işaretçisi FFFF FFC0h adresinde yazılmıştır.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Söz konusu örnekte FFD6 9500h değeri bu adreste bulunmaktadır. Bu adrese erişildiğinde işlemci, içeriği kayıtlara bölünmüş olan FIT tablosunu görür. İlk giriş aşağıdaki yapının başlığıdır:

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

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Bilinmeyen bir nedenden ötürü, bu tablolarda sağlama toplamı her zaman hesaplanmaz (alan sıfır bırakılır).

Kalan girişler, BIOS yürütülmeden önce ayrıştırılması/yürütülmesi gereken çeşitli ikili dosyalara işaret eder; eski RESET vektörüne (FFFF FFF0h) geçmeden önce. Bu tür girişlerin her birinin yapısı aşağıdaki gibidir:

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

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Giriş Türü alanı size bu girişin işaret ettiği blok türünü söyler. Birkaç türü biliyoruz:

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

Artık girdilerden birinin Intel BG başlangıç ​​ACM ikili dosyasının konumuna işaret ettiği açıktır. Bu ikili dosyanın başlık yapısı, Intel tarafından geliştirilen kod modülleri için tipiktir (ACM'ler, mikro kod güncellemeleri, Intel ME kod bölümleri, ...).

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

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
İşlemci bu ikili dosyayı önbelleğine yükler, doğrular ve çalıştırır.

Intel BG girişimi ACM

Bu ACM'nin çalışmasının analiz edilmesi sonucunda aşağıdakileri yaptığı ortaya çıktı:

  • Intel ME'den yonga seti sigortalarına (FPF'ler) yazılan Intel BG yapılandırmasını alır;
  • KEYM ve IBM bildirimlerini bulur ve bunları doğrular.

Bu bildirimleri bulmak için ACM ayrıca yapı verilerini belirtmek üzere iki giriş türüne sahip olan FIT tablosunu da kullanır (bkz. yukarıdaki FIT_ENTRY_TYPES).

Manifestolara daha yakından bakalım. İlk manifestin yapısında, birkaç belirsiz sabit, ikinci manifestteki genel anahtarın karmasını ve iç içe geçmiş bir yapı olarak imzalanmış genel OEM Kök Anahtarını görüyoruz:

typedef struct KEY_MANIFEST
{
	char           Tag[8];          // ‘__KEYM__’
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 10h
	unsigned char  : 8;             // 0
	unsigned char  : 8;             // 1
	unsigned short : 16;            // 0Bh
	unsigned short : 16;            // 20h == hash size?
	unsigned char  IbbmKeyHash[32]; // SHA256 of an IBBM public key
	BG_RSA_ENTRY   OemRootKey;
};

typedef struct BG_RSA_ENTRY
{
	unsigned char  : 8;             // 10h
	unsigned short : 16;            // 1
	unsigned char  : 8;             // 10h
	unsigned short RsaPubKeySize;   // 800h
	unsigned long  RsaPubExp;
	unsigned char  RsaPubKey[256];
	unsigned short : 16;            // 14
	unsigned char  : 8;             // 10h
	unsigned short RsaSigSize;      // 800h
	unsigned short : 16;            // 0Bh
	unsigned char  RsaSig[256];
};

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
OEM Kök Anahtarı genel anahtarını doğrulamak için, şu anda Intel ME'den alınmış olan SHA256 sigorta karma değerini kullandığımızı hatırlatırız.

Gelelim ikinci manifestoya. Üç yapıdan oluşur:

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

İlki bazı sabitler içerir:

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

İkincisi, IBB'nin SHA256 karmasını ve IBB'nin içeriğini tanımlayan tanımlayıcıların sayısını (yani karmanın neyden hesaplandığını) içerir:

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

İBB tanımlayıcıları da bu yapıyı birbiri ardına takip etmektedir. İçerikleri aşağıdaki formata sahiptir:

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

Çok basit: her tanımlayıcı IBB öbeğinin adresini/boyutunu içerir. Dolayısıyla bu tanımlayıcıların işaret ettiği blokların (tanımlayıcıların sırasına göre) birleşimi İBB'dir. Ve kural olarak İBB, SEC ve PEI aşamalarının tüm modüllerinin koleksiyonudur.

İkinci manifesto, IBB genel anahtarını (ilk manifestteki SHA256 hash'iyle doğrulanmıştır) ve bu manifestonun imzasını içeren bir yapıyla tamamlanır:

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

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Böylece, UEFI BIOS çalışmaya başlamadan önce bile işlemci, SEC ve PEI aşama koduyla bölümlerin içeriğinin doğruluğunu doğrulayacak olan ACM'yi başlatacaktır. Daha sonra işlemci ACM'den çıkar, RESET vektörünü takip eder ve BIOS'u çalıştırmaya başlar.

Doğrulanan PEI bölümü, BIOS'un geri kalanını (DXE kodu) kontrol edecek bir modül içermelidir. Bu modül halihazırda IBV (Bağımsız BIOS Satıcısı) veya sistem satıcısının kendisi tarafından geliştirilmektedir. Çünkü Sadece Lenovo ve Gigabyte sistemleri elimizdeydi ve Intel BG desteğine sahipti; bu sistemlerden çıkarılan kodlara bakalım.

UEFI BIOS modülü LenovoVerifiedBootPei

Lenovo durumunda, bunun Lenovo tarafından geliştirilen LenovoVerifiedBootPei modülü {B9F2AC77-54C7-4075-B42E-C36325A9468D} olduğu ortaya çıktı.

Görevi, DXE'nin karma tablosunu (GUID'e göre) aramak ve DXE'yi doğrulamaktır.

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

UEFI BIOS modülü BootGuardPei

Gigabyte durumunda, AMI tarafından geliştirilen ve bu nedenle Intel BG desteğine sahip herhangi bir AMI BIOS'ta bulunan BootGuardPei modülü {B41956E1-7CA2-42DB-9562-168389F0F066} olduğu ortaya çıktı.

İşletim algoritması biraz farklıdır ancak özünde aynı şeye indirgenir:

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

Aradığı {389CC6F2-1EA8-467B-AB8A-78E769AE2A15} karma tablosu aşağıdaki formattadır:

typedef HASH_TABLE DXE_DESCRIPTORS[];

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

Intel Önyükleme Koruması 2.x

Apollo Lake mikro mimarisine sahip Intel SoC tabanlı daha yeni bir sistemde bulunan Intel Boot Guard'ın başka bir uygulamasından kısaca bahsedelim - ASRock J4205-IT.

Bu sürüm yalnızca SoC'lerde kullanılacak olsa da (Kaby Lake işlemci mikro mimarisine sahip yeni sistemler Intel Boot Guard 1.x'i kullanmaya devam ediyor), önemli değişiklikler gören Intel SoC platformları için yeni mimari seçeneğinin incelenmesi büyük ilgi görüyor. örneğin:

  • BIOS ve Intel ME bölgeleri (veya daha doğrusu Intel SoC terminolojisine göre Intel TXE) artık tek bir IFWI bölgesidir;
  • platformda Intel BG etkin olmasına rağmen flash bellekte FIT, KEYM, IBMM gibi yapıların bulunmadığı;
  • TXE ve ISH çekirdeklerine (x86) ek olarak, yonga setine üçüncü bir çekirdek eklendi (bu arada yine ARC) - güç alt sisteminin çalışabilirliğini ve performans izlemeyi sağlamakla ilişkili PMC (Güç Yönetimi Denetleyicisi).

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Yeni IFWI bölgesinin içeriği aşağıdaki modüllerden oluşur:

deplasman
isim
Açıklama

0000 2000h
SMIP
satıcı tarafından imzalanmış belirli bir platform konfigürasyonu

0000 6000h
RBEP
Intel TXE ürün yazılımı kod bölümü, x86, imzalı Intel

0001 0000h
PMCP
Intel PMC ürün yazılımı kodu bölümü, ARC, Intel imzalı

0002 0000h
FTPR
Intel TXE ürün yazılımı kod bölümü, x86, imzalı Intel

0007 B000h
UCOD
CPU için Intel imzalı mikro kod güncellemeleri

0008 0000h
IBBP
Satıcı tarafından imzalanmış UEFI BIOS, SEC/PEI aşamaları, x86

0021 8000h
ISHC
Satıcı tarafından imzalanmış Intel ISH donanım yazılımı kod bölümü, x86

0025 8000h
FTP
Intel TXE ürün yazılımı kod bölümü, x86, imzalı Intel

0036 1000h
IUNP
bilinmeyen

0038 1000h
OBBP
UEFI BIOS, DXE aşaması, x86, imzasız

TXE donanım yazılımının analizi sırasında, bir RESET sonrasında TXE'nin, CPU için adres alanının temel içeriğini (FIT, ACM, RESET vektörü ...) hazırlayana kadar işlemciyi bu durumda tuttuğu açıkça ortaya çıktı. Üstelik TXE bu verileri SRAM'ına yerleştirir, ardından geçici olarak işlemciye oraya erişim izni verir ve RESET'ten "serbest bırakır".

Rootkit'lere karşı koruma

Şimdi "sıcak" şeylere geçelim. Bir zamanlar birçok sistemde SPI flash tanımlayıcılarının, SPI flash belleğin bölgelerine erişim izinleri içerdiğini, böylece bu belleğin tüm kullanıcılarının herhangi bir bölgeyi yazıp okuyabildiğini keşfettik. Onlar. Mümkün değil.

MEinfo yardımcı programını (Intel STK'dan) kontrol ettikten sonra, bu sistemlerdeki üretim modunun kapalı olmadığını, bu nedenle yonga seti sigortalarının (FPF'ler) tanımsız bir durumda kaldığını gördük. Evet, bu gibi durumlarda Intel BG ne açılır ne de kapatılır.

Aşağıdaki sistemlerden bahsediyoruz (Intel BG ile ilgili olarak ve yazının ilerleyen kısımlarında anlatılacaklarımız için Haswell işlemci mikro mimarisi ve üzeri sistemlerden bahsedeceğiz):

  • tüm Gigabyte ürünleri;
  • tüm MSI ürünleri;
  • 21 model Lenovo dizüstü bilgisayar ve 4 model Lenovo sunucusu.

Elbette bu keşfi Intel'in yanı sıra bu satıcılara da bildirdik.

Sadece yeterli tepki geldi Lenovosorunu kim fark etti ve bir yama yayınladı.

Gigabyte Güvenlik açığıyla ilgili bilgileri kabul etmiş göründüler ancak hiçbir şekilde yorum yapmadılar.

İle iletişim MSI Genel PGP anahtarınızı gönderme isteğimiz üzerine (onlara şifreli biçimde bir güvenlik tavsiyesi göndermek için) tamamen durdu. "Donanım üreticisi olduklarını ve PGP anahtarları üretmediklerini" belirttiler.

Ama gelelim asıl meseleye. Sigortalar belirsiz bir durumda bırakıldığından, kullanıcı (veya saldırgan) bunları bağımsız olarak programlayabilir (en zor şey sigortalardır). Intel STK'yı bulun). Bunu yapmak için aşağıdaki adımları tamamlamanız gerekir.

1. Windows işletim sistemine önyükleme yapın (genel olarak aşağıda açıklanan eylemler, istenen işletim sistemi için bir Intel STK analogu geliştirirseniz Linux altında da yapılabilir). MEinfo yardımcı programını kullanarak sigortaların bu sistemde programlanmadığından emin olun.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
2. Flash Programlama Aracını kullanarak flash belleğin içeriğini okuyun.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
3. Herhangi bir UEFI BIOS düzenleme aracını kullanarak okunan görüntüyü açın, gerekli değişiklikleri yapın (örneğin bir rootkit ekleyin), ME bölgesindeki mevcut KEYM ve IBMM yapılarını oluşturun/düzenleyin.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Resimde, karma değeri Intel BG yapılandırmasının geri kalanıyla birlikte yonga seti sigortalarına programlanacak olan RSA anahtarının halka açık kısmı vurgulanıyor.

4. Flash Görüntü Aracını kullanarak yeni bir ürün yazılımı görüntüsü oluşturun (Intel BG yapılandırmasını ayarlayarak).

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
5. Flash Programlama Aracı'nı kullanarak flash belleğe yeni bir görüntü yazın ve MEinfo'yu kullanarak ME bölgesinin artık Intel BG yapılandırmasını içerdiğini doğrulayın.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
6. Üretim modunu kapatmak için Flash Programlama Aracını kullanın.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
7. Sistem yeniden başlatılacak ve ardından FPF'lerin artık programlandığını doğrulamak için MEinfo'yu kullanabilirsiniz.

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Bu eylemler sonsuza dek bu sistemde Intel BG'yi etkinleştirin. İşlem geri alınamaz; bu şu anlama gelir:

  • Yalnızca kök anahtarın özel bölümünün sahibi (yani Intel BG'yi etkinleştiren kişi) bu sistemdeki UEFI BIOS'u güncelleyebilecektir;
  • orijinal ürün yazılımını örneğin bir programlayıcı kullanarak bu sisteme iade ederseniz, açılmaz bile (doğrulama hatası durumunda uygulama politikasının bir sonucu);
  • Böyle bir UEFI BIOS'tan kurtulmak için, programlanmış FPF'lerle yonga setini "temiz" bir yonga setiyle değiştirmeniz gerekir (yani, bir arabanın fiyatına kızılötesi lehimleme istasyonuna erişiminiz varsa yonga setini yeniden lehimleyin veya sadece anakartı değiştirin) ).

Böyle bir rootkit'in neler yapabileceğini anlamak için kodunuzu UEFI BIOS ortamında çalıştırmayı neyin mümkün kıldığını değerlendirmeniz gerekir. Diyelim ki en ayrıcalıklı işlemci modunda - SMM. Böyle bir rootkit aşağıdaki özelliklere sahip olabilir:

  • işletim sistemiyle paralel olarak yürütülür (işlemeyi, bir zamanlayıcı tarafından tetiklenecek bir SMI kesintisi oluşturacak şekilde yapılandırabilirsiniz);
  • SMM modunda olmanın tüm avantajlarına sahip olun (RAM ve donanım kaynaklarının içeriğine tam erişim, işletim sisteminden gizlilik);
  • Rootkit'in program kodu, SMM modunda başlatıldığında şifrelenebilir ve şifresi çözülebilir. Yalnızca SMM modunda mevcut olan herhangi bir veri, şifreleme anahtarı olarak kullanılabilir. Örneğin, SMRAM'deki bir dizi adresten elde edilen karma. Bu anahtarı almak için SMM'ye girmeniz gerekecek. Ve bu iki şekilde yapılabilir. SMM kodunda RCE'yi bulun ve kullanın veya BIOS'a kendi SMM modülünüzü ekleyin; Boot Guard'ı etkinleştirdiğimizden beri bu imkansızdır.

Dolayısıyla bu güvenlik açığı bir saldırganın şunları yapmasına olanak tanır:

  • sistemde amacı bilinmeyen gizli, silinemez bir rootkit oluşturmak;
  • kodunuzu Intel SoC içindeki yonga seti çekirdeklerinden birinde, yani Intel ISH'de yürütün (resme dikkatlice bakın).

Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Schrödinger'in Güvenilir İndirmesi. Intel Önyükleme Koruması
Intel ISH alt sisteminin yetenekleri henüz araştırılmamış olsa da Intel ME için ilginç bir saldırı vektörü gibi görünüyor.

Bulgular

  1. Çalışma, Intel Boot Guard teknolojisinin işleyişine ilişkin teknik bir açıklama elde etmeyi mümkün kıldı. Belirsizlik modeli aracılığıyla Intel'in güvenliğinde eksi birkaç sır.
  2. Sistemde kaldırılamaz bir rootkit oluşturmanıza olanak tanıyan bir saldırı senaryosu sunulmaktadır.
  3. Modern Intel işlemcilerin, BIOS çalışmaya başlamadan önce bile pek çok özel kodu çalıştırabildiğini gördük.
  4. Intel 64 mimarisine sahip platformlar, özgür yazılım çalıştırmak için giderek daha az uygun hale geliyor: donanım doğrulama, artan sayıda özel teknolojiler ve alt sistemler (SoC yonga setinde üç çekirdek: x86 ME, x86 ISH ve ARC PMC).

azaltıcı etkenler

Üretim modunu kasıtlı olarak açık bırakan satıcıların mutlaka kapatması gerekir. Şu ana kadar sadece gözleri kapalı ve yeni Kaby Lake sistemleri de bunu gösteriyor.

Kullanıcılar, Flash Programlama Aracını -closemnf parametresiyle çalıştırarak (açıklanan güvenlik açığından etkilenen) sistemlerinde Intel BG'yi devre dışı bırakabilir. Öncelikle (MEinfo'yu kullanarak), ME bölgesindeki Intel BG yapılandırmasının, FPF'lerde programlama sonrasında bu teknolojinin kapatılmasını sağladığından emin olmalısınız.

Kaynak: habr.com

Yorum ekle