Skip to content

SPI flash BIOS write-protection misconfig (BIOS_CNTL BLE / SMM_BWP)

BIOS_CNTL, BLE temizlenmiş, SMM_BWP/EISS set edilmemiş ya da PR register'ları BIOS region'ı kapsamayacak şekilde bırakıldığında, ring-0 software SPI flash'ın BIOS region'ına yazabilir ve firmware implant edebilir.

Mechanism

Invariant

SPI flash'ın BIOS region'ına yazmalar BIOS Control Register (BIOS_CNTL / BC) tarafından kapılanır:

  • BIOSWE (BIOS Write Enable) — 1 olduğunda, BIOS region yazılabilirdir.
  • BLE (BIOS Lock Enable) — 1 olduğunda, BIOSWE'yi set etme girişimi bir SMI üretir; SMI handler'ın BIOSWE'yi hemen tekrar temizlemesi beklenir. BLE, platform reset'ine kadar sticky'dir.
  • SMM_BWP / EISS (SMM BIOS Write Protect / Enable In-SMM.STS) — 1 olduğunda, BIOS region yalnızca bir logical processor gerçekten SMM'deyken, BIOSWE'den bağımsız olarak yazılabilirdir.
  • PR0–PR4 (Protected Range register'ları) — SMM'e bile read-only olan flash aralıklarını tanımlar.

Amaçlanan invariant şudur: SMM dışında, BIOS region asla yazılabilir değildir. BLE tek başına yetersizdir (Speed Racer race'i, bkz. speed-racer-intel-flash-protection-race-condition.md, yalnızca-BLE'yi yener) — SMM_BWP da set edilmelidir. BLE temizse, ya da SMM_BWP set edilmemişse, ya da PR register'ları BIOS region'ı kuşatmıyorsa, ring-0 malware BIOSWE'yi set edip yeniden flash'layabilir ve kalıcı bir implant kurabilir (uefi-firmware-implant-in-spi-flash.md).

Walkthrough

CHIPSEC'in common.bios_wp'si BLE, SMM_BWP ve PR kapsamasını kontrol eder.

# chipsec_main -m common.bios_wp
[x][ =======================================================================
[x][ Module: BIOS Region Write Protection
[x][ =======================================================================
[*] BC = 0x... << BIOS Control (b:d.f 00:31.5 + 0xDC)
    [00] BIOSWE           = 0
    [01] BLE              = 1
    [05] SMM_BWP          = 1
[+] PASSED: BIOS region write protection is enabled (writes restricted to SMM)

Bir FAIL BLE = 0, ya da SMM_BWP = 0 ile BLE = 1 (race'e savunmasız), ya da BIOS region'ı kapsamayan PR register'larıdır. Canlı test için, OS'tan BIOSWE'yi set edin ve BIOS region'ın yazılabilir hâle gelip gelmediğini gözlemleyin.

Warning

BLE = 1, SMM_BWP = 0 klasik tehlikeli durumdur: korumalı görünür ama Speed Racer TOCTOU race'iyle yenilir. Her zaman SMM_BWP'yi şart koşun.

Detection

  • Yukarıdaki CHIPSEC common.bios_wp FAIL koşulları.
  • OS'tan BIOS region'ın başarılı bir flashrom -w'si, korumanın eksik ya da bypass edilebilir olduğunu kanıtlar.

Mitigation

  • BLE = 1 ve SMM_BWP/EISS = 1'i set edin, BIOSWE'yi temizleyin ve PR0–PR4'ü BIOS region'ı kapsayacak şekilde programlayın, ardından SPI controller'ı kilitleyin (FLOCKDN).
  • BIOSWE yazmalarını servis eden SMI handler, BIOSWE'yi yeniden temizlemelidir.

References