Skip to content

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ış):

  1. İki logical CPU'ya pinlenmiş iki thread.
  2. Thread A, BIOS_CNTL'de BIOSWE = 1'i mümkün olduğunca hızlı set ederek döner.
  3. Thread B, sıkı bir loop'ta BIOS region'a SPI flash yazmaları issue eder.
  4. 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.
  5. Ç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).

References