SPI flash descriptor not protected (chipsec common.spi_desc)¶
Yazılım
SPI Flash Descriptorregion'ına yazabiliyorsa, her flash region içinper-masterokuma/yazma izinlerini yeniden yazabilir ve böylece descriptor tabanlı tüm korumayı bypass edebilir.
Mechanism¶
Invariant
Flash Descriptor, SPI çipinin ilk region'ıdır. Region haritasını ve
per-master access permission'larını — yani hangi bus master'ın (CPU,
ME, GbE) hangi region'ı okuyup/yazabileceğini — bildirir. Controller bu
izinleri Flash Region Access Permissions (FRAP) register'ı üzerinden
zorlar: FRAP.BRRA (okuma erişimi) ve FRAP.BRWA (yazma erişimi). Tüm bu
şema yalnızca descriptor'un kendisi OS'a karşı değiştirilemez (immutable)
olduğunda sağlamdır. Invariant şudur: OS kodunu çalıştıran master,
Descriptor region'ına yazma erişimine sahip OLMAMALIDIR. Eğer descriptor,
host CPU'ya region 0'a (descriptor'un kendisine) yazma erişimi verirse —
"genellikle debugging için kullanılan" ama "production sistemlerde olmaması
gereken" bir ayar — saldırganın ring-0 kodu descriptor'u yeniden yazıp
kendisine BIOS/ME region'larına yazma erişimi verir ve tüm access-control
modelini çökertir.
Walkthrough¶
CHIPSEC'in common.spi_desc modülü, host master'ın FRAP izinleri üzerinden
descriptor region'ına yazıp yazamadığını kontrol eder.
# chipsec_main -m common.spi_desc
[x][ =======================================================================
[x][ Module: SPI Flash Region Access Permissions in Descriptor
[x][ =======================================================================
[*] FRAP = 0x...
BRWA (Region Write Access) = 0x..
[*] Software has no write access to Flash Descriptor
[+] PASSED: SPI Flash Descriptor is read-only to software
FAIL sonucu, FRAP.BRWA'nın host master'a Descriptor region'ına yazma erişimi
verdiği anlamına gelir — saldırgan region izinlerini yeniden yazıp ardından BIOS
region'ına serbestçe yazabilir.
Warning
Bu hata spi_lock ve bios_wp korumalarını aynı anda işlevsiz bırakır:
controller mükemmel şekilde kilitli olsa bile, controller'ın zorladığı izin
tablosu saldırgan tarafından yeniden yazılabiliyorsa bu kilit anlamsızdır.
Detection¶
- CHIPSEC
common.spi_descFAIL = descriptor yazılım tarafından yazılabilir. - FRAP'i okuyup host master'ın region 0 için ilgili bit'ini kontrol ederek doğrulayın.
Mitigation¶
- Production descriptor'ları, host-CPU'nun Descriptor region'ına (ve ideal olarak
ME/GbE region'larına) yazma erişimini kaldırmalı; controller'ı
FLOCKDNile kilitleyin.