Skip to content

VENOM (QEMU Floppy Disk Controller DMA out-of-bounds write)

QEMU'nun emüle edilmiş floppy disk controller'ında (FDC) bir guest-to-host escape (CVE-2015-3456); burada bir guest, FIFO position'ı reset etmeyen FDC command'leri üzerinden sabit 512-byte FIFO'yu overflow eder ve host process'inde out of bounds yazar.

Mechanism

Note

QEMU, legacy device'ları (burada i8272-style floppy disk controller) host user-space process'i içinde emüle eder. FDC, bir sonraki byte'ı index'leyen bir position counter data_pos artı sabit boyutlu 512-byte FIFO buffer tutar. Isolation invariant'ı şudur: her command handler data_pos'u [0, FIFO_SIZE) aralığında tutmalı ve bir command'in parametreleri tüketildiğinde onu 0'a reset etmelidir; böylece guest'in FIFO I/O port'una (FD_REG_FIFO) yazdıkları asla buffer'ın ötesini index'leyemez. VENOM bir device-emulation memory-safety başarısızlığıdır: iki command handler data_pos'u reset etmeden bırakır, yani o command'leri verdikten sonra FIFO byte'ları yazmaya devam eden bir guest, data_pos'u 512'nin ötesine sürer ve guest-controlled byte'ları komşu host heap memory'sine yazar — guest OS ya da privilege'dan bağımsız olarak guest→host sınırını aşan bir out-of-VM write.

Bug, guest'in FDC FIFO port'una yazdığı command byte'larını ve parametreleri alan handler olan fdctrl_write_data() içinde yaşar. Her iki x86 emulated machine type'ı (controller neredeyse her default config'de mevcuttur) affected'tır ve device, unprivileged bir guest user'dan bile erişilebilir çünkü FIFO port'u standart bir ISA I/O port'udur.

Walkthrough

Public referans: CrowdStrike'ın CVE-2015-3456 için VENOM disclosure'ı. Kavramsal, zaten-patch'lenmiş path (weaponize edilmiş host layout yok):

  1. Guest, FDC'yi FIFO data port'u üzerinden sürer. Normalde fdctrl_write_data() içindeki her command'in handler'ı, parametre byte'larını tükettikten sonra data_pos = 0 reset eder ve write'ları 512-byte FIFO içinde sınırlar.
  2. İki handler bu invariant'ı kırar:
  3. FD_CMD_READ_ID, data_pos'u hemen reset etmek yerine ~20 ms'lik bir completion timer kurar; bu pencere boyunca guest FIFO byte'ları yazmaya devam eder ve data_pos buffer'ın ötesine ilerler.
  4. FD_CMD_DRIVE_SPECIFICATION_COMMAND — 5. parametre byte'ı most-significant bit'inden yoksun olduğunda ne if ne de else-if branch'i çalışır, dolayısıyla data_pos asla reset edilmez.
  5. data_pos 512'nin ötesindeyken, sonraki her FIFO write controller'ın FDCtrl yapısına komşu host memory'sine düşer — kontrollü bir out-of-bounds write.
  6. Bir attacker, overflow'un QEMU process'indeki function pointer'ları / allocator metadata'sını corrupt etmesi için host heap'i şekillendirir ve host control-flow hijack elde eder.

Warning

Bug class için belgelenmiş tarihsel, patch'lenmiş bir sorun. Bu entry kavramsaldır ve hiçbir exploit offset ya da host heap layout vermez.

Representative trigger shape (illustrative pseudocode)
/* writes to the FDC FIFO data port (0x3f5) */
outb(FD_REG_FIFO, FD_CMD_READ_ID);   /* arms timer, data_pos not reset */
for (i = 0; i < OVERFLOW_LEN; i++)
    outb(FD_REG_FIFO, payload[i]);   /* data_pos walks past the 512-byte FIFO */

Beklenen gözlem: bir guest'ten gelen anormal FDC FIFO aktivitesinin ardından qemu/qemu-kvm process corruption ya da crash; non-exploit bir denemede host-side bir abort.

Detection

  • Host tarafı: floppy-controller FIFO aktivitesiyle korele olan QEMU process crash'leri/abort'ları; instrumente build'lerde FDCtrl.data_pos'u FIFO size'ına karşı monitor etmek.
  • Guest-behavior tarafı: READ ID / drive-specification dizileri verip sonra FDC FIFO'ya byte streaming yapan bir guest, gerçek herhangi bir floppy driver için anormaldir.

Mitigation

  • CVE-2015-3456 için QEMU fix'ini uygula (fdctrl_write_data() içinde data_pos/FIFO indexing'ini clamp et ve affected handler'larda position'ı reset et).
  • İhtiyacı olmayan guest'lerden floppy controller'ı kaldır (emulated FDC'yi expose etme), legacy-device attack surface'ini küçült.
  • Defense-in-depth: device-emulation process'ini sandboxed / deprivileged çalıştır (ör. seccomp, SELinux/sVirt) ki host-process corruption tam host kontrolü olmasın.

References

  • CrowdStrike, "VENOM Vulnerability Details" (CVE-2015-3456): https://www.crowdstrike.com/blog/venom-vulnerability-details/