SPI controller not locked (chipsec common.spi_lock)¶
HSFS.FLOCKDNset edilmediğinde, SPI flash controller yapılandırması — Protected Range register'ları dahil — runtime'da yeniden programlanabilir, BIOS write protection'ı yener.
Mechanism¶
Invariant
PCH SPI flash controller bir dizi MMIO register açığa çıkarır: hardware
sequencing flash status/control (HSFS/HSFC), flash aralıklarını
read-only/write-protected olarak işaretleyen Protected Range register'ları
(PR0–PR4) ve opcode menüsü (OPMENU). Bu register'lar bizzat uygulama
mekanizması'dır. Lockdown bit'i HSFS.FLOCKDN, o uygulamayı değiştirilemez
kılmak için vardır: bir kez 1'e yazıldığında, SPI controller yapılandırmasını
— PR0–PR4 dahil — bir sonraki platform reset'ine kadar kilitler ve FLOCKDN
yalnızca bir reset ile temizlenebilir. Invariant şudur: flash'ı koruyan
yapılandırma çalışan OS tarafından yeniden yazılabiliyorsa, hiçbir flash
protection gerçek değildir. BIOS FLOCKDN = 0 bıraktığında, saldırgan ring-0
kod Protected Range'leri basitçe temizleyebilir ya da yeniden yönlendirebilir
ve ardından BIOS region'a yazabilir.
Walkthrough¶
CHIPSEC'in common.spi_lock'u controller lock durumunu okur.
# chipsec_main -m common.spi_lock
[x][ =======================================================================
[x][ Module: SPI Flash Controller Configuration Locks
[x][ =======================================================================
[*] SPI Flash Controller Lockdown (FLOCKDN) = 1
[+] PASSED: SPI Flash Controller configuration is locked
Bir FAIL FLOCKDN = 0'dır. Controller kilitsizken, Protected Range register'ları
(CHIPSEC'in common.bios_wp'sinin incelediği) yalnızca tavsiye niteliğindedir —
bir saldırgan PR0–PR4'ü yeniden yazar ve flash'a geçer.
Warning
FLOCKDN, controller yapılandırmasını kilitler; tek başına BIOS region'ı
read-only yapmaz. Yine de BIOS region'ı kapsayan PR register'larına ve/veya
BIOS_CNTL'e (spi-flash-bios-write-protection-misconfig.md) ihtiyacınız var.
Üçü birlikte doğru olmalıdır.
Detection¶
- CHIPSEC
common.spi_lock'u çalıştırın;FLOCKDN = 0bir FAIL'dir. flashromgibi araçların OS'tan BIOS region'a yazmayı başarması, controller'ın hiç kilitlenmediğine dair güçlü bir göstergedir.
Mitigation¶
- BIOS, Protected Range register'larını programladıktan sonra POST'un sonuna doğru
HSFS.FLOCKDN = 1'i set etmelidir, böylece runtime OS controller'ı yeniden yapılandıramaz.