Option ROM attack¶
Bir PCI/PCIe genişletme kartının üzerinde gelen firmware'i altüst ederek saldırgan kodunun boot sırasında, OS'in altında çalışmasını ve isteğe bağlı olarak platform firmware'ine kalıcılık yazmasını sağlamak.
Mechanism¶
Note
Bir PCI/PCIe cihazı bir Option ROM (expansion ROM) taşıyabilir: platform BIOS/UEFI'sinin enumeration sırasında keşfedip POST sırasında çalıştırdığı, cihazın kendini initialize etmesini sağlayan firmware (bir NIC'in PXE stack'i, bir RAID controller'ının setup'ı, bir GPU'nun VBIOS'u). Bu kod işletim sisteminden önce, yüksek privilege ile, pre-boot ortamında çalışır. Platform Option ROM'u authenticate etmiyorsa, kartın ROM'unu yazabilen (ya da kötü niyetli bir cihaz sunan) bir saldırgan rastgele pre-boot kod yürütmesi elde eder. OS'in altında çalıştığı için, bu tür kod boot'u hook'layabilir, bağlı storage'ı tahrif edebilir veya OS reinstall'unu ve disk değişimini atlatan bir kalıcılık için kendini UEFI runtime services içine yazabilir.
Bu sınıf çok eskidir (Heasman, Black Hat 2007, EFI/Option-ROM rootkit'lerini göstermişti) ve hâlâ geçerlidir: kötü niyetli Option ROM'lar, legacy boot yollarının ve imzasız expansion firmware'inin açık bıraktığı, tanınan bir firmware saldırı yüzeyidir. Thunderstrike (Hudson, 31C3 2014), boot sırasında bir Thunderbolt Option ROM'unun, platformun firmware update yolundaki signature verification eksikliğini istismar ederek imzasız kod çalıştırabildiğini gösterdi.
Walkthrough¶
Saldırı akışı şudur: kodu kartın ROM'una sok, firmware'in onu POST'ta çalıştırmasını sağla, isteğe bağlı olarak platform firmware'ine kalıcı ol.
1. Acquire write access to a device's expansion ROM (flashable NIC/RAID/GPU,
or a physically presented rogue PCIe/Thunderbolt device).
2. Build an Option ROM image with the legacy PCI ROM header / UEFI PE driver
so firmware accepts and dispatches it during enumeration.
3. On boot, BIOS/UEFI maps and executes the ROM -> attacker code runs pre-OS.
4. (Optional) The ROM installs a UEFI Runtime Services hook or writes the SPI
flash for persistence across OS reinstalls.
Çalışan bir Linux sisteminde Option ROM'ları incelemek (salt-okunur gözlem):
# Each PCI device that carries an expansion ROM exposes it via sysfs.
for r in /sys/bus/pci/devices/*/rom; do
echo 1 | sudo tee "$r" >/dev/null # enable ROM decode
sudo cat "$r" > "$(dirname "$r" | xargs basename).rom"
echo 0 | sudo tee "$r" >/dev/null
done
# A legacy PCI Option ROM begins with the 0x55 0xAA signature.
xxd device.rom | head -1
# 00000000: 55aa .... PCI expansion ROM header
Detection¶
- Dump'lanan Option ROM image'larını bilinen-iyi vendor firmware hash'leriyle karşılaştırın.
- Firmware measurement: TPM destekli measured boot, option ROM'ları kapsayan PCR'leri kaydeder; beklenmeyen PCR değerleri tahrifata işaret eder.
- UEFI memory forensics, bir ROM'un bıraktığı sahte runtime-services hook'larını tespit edebilir.
Mitigation¶
- Option ROM signature verification ile birlikte UEFI Secure Boot, uyumlu platformlarda imzasız expansion firmware'ini reddeder.
- Kernel DMA Protection / IOMMU ve legacy Option ROM yürütmesini devre dışı bırakmak, sahte-cihaz varyantlarını sınırlar.
- Cihaz firmware'ini kimin flash'layabileceğini kısıtlayın; imzalı firmware güncellemeleri zorunlu kılın.