Skip to content

SPI controller not locked (chipsec common.spi_lock)

HSFS.FLOCKDN set 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ı (PR0PR4) 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 PR0PR4'ü 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 = 0 bir FAIL'dir.
  • flashrom gibi 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.

References