Speed Racer: Intel flash protection race condition (CVE-2014-8273 / VU#766164)¶
BIOSWE/BLE flash-locking mekanizmasında bir TOCTOU race: bir thread'de BIOSWE'yi set ederken başka bir thread'de flash yazarak, saldırgan SMI handler BIOSWE'yi temizlemeden önce yazmaları araya sokar.
Mechanism¶
Invariant
BIOS_CNTL'in şunu uygulaması beklenir: BIOS region yalnızca SMM'den
yazılabilir. BLE = 1 ama SMM_BWP = 0 ile, chipset bunu dolaylı olarak
uygular: BIOSWE = 1'in hemen etkili olmasına izin verilir ve yalnızca
sonrasında BIOSWE'yi set etmek, handler'ı BIOSWE'yi tekrar 0'a temizleyen
bir SMI üretir. VU#766164'ün ifadesiyle, "BIOS_CNTL.BIOSWE'yi 1'e set etme
girişiminin yapıldığı an ile SMI tarafından tekrar 0'a set edildiği an arasında
BIOS'a yazmaların gerçekleşmesine izin verebilecek bir race condition vardır."
Kusur klasik bir time-of-check/time-of-use aralığıdır: BIOSWE, BLE-tetiklemeli
uygulama çalışmadan önce değer değiştirir. Invariant ("SMM dışında asla
yazılabilir değil") her SMI'da küçük bir pencere boyunca ihlal edilir ve o
pencere saldırgan tarafından tekrarlanabilirdir.
Walkthrough¶
Kallenberg–Wojtczuk açıklamasından kavramsal yeniden üretim (kamuya açık, yamalanmış):
- İki logical CPU'ya pinlenmiş iki thread.
- Thread A, BIOS_CNTL'de
BIOSWE = 1'i mümkün olduğunca hızlı set ederek döner. - Thread B, sıkı bir loop'ta BIOS region'a SPI flash yazmaları issue eder.
- BLE-tetiklemeli SMI ateşlenir ve BIOSWE'yi temizler, ama A BIOSWE'yi set ettikten sonra ve SMI handler onu temizlemeden önce B'nin yazmasının düştüğü bir pencere vardır.
- Çoğu yazma bloke edilir; istatistiksel olarak bazıları geçer. Tüm target aralığı yazılana kadar tekrarlayın.
# Conceptual (do not run on production firmware):
thread_A: while(1) outl(BIOS_CNTL_addr, BC | BIOSWE); // keep re-enabling
thread_B: while(bytes_left) spi_write(flash_off, buf); // race the SMI
Sonuç "Protected Range mask'leriyle korunmayan BIOS firmware'inin herhangi bir bölümünde keyfi değişiklikler"dir. Daha sonra LoJax gibi UEFI implant'ları da BLE-vulnerable yapılandırmalardan (BLE=1, SMM_BWP=0) yararlanabilir; ancak LoJax'ın gözlemlenen esas flash-write yolu bu BIOSWE/BLE race timing'i değil, OS context'ten SPI flash'a erişmek için kötüye kullanılan vulnerable imzalı driver'lardır (ör. RWEverything RwDrv.sys).
Warning
Yalnızca eğitim amaçlı/savunma amaçlı — herhangi bir analizi kamuya açık CCC 2014 whitepaper'ına ve CERT notuna dayandırın. Asıl mesele sınıf'tır: SMM_BWP'siz BLE yapısal olarak race'e savunmasızdır.
Detection¶
- CHIPSEC
common.bios_wp,BLE = 1, SMM_BWP = 0'ı savunmasız durum olarak işaretler (bkz.spi-flash-bios-write-protection-misconfig.md). - BIOS_CNTL yazmalarıyla ilişkili tekrarlayan beklenmedik SMI'lar, aktif bir race girişimini gösterebilir.
Mitigation¶
- SMM_BWP/EISS = 1'i set edin: chipset o zaman BIOS-region yazmalarını yalnızca bir CPU fiziksel olarak SMM'deyken onurlandırır, pencereyi ortadan kaldırır — bu tam olarak Intel/CERT'in önerdiği çözümdür.
- PR0–PR4 Protected Range'leri ekleyin ve controller'ı kilitleyin (
FLOCKDN).