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):
- 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 sonradata_pos = 0reset eder ve write'ları 512-byte FIFO içinde sınırlar. - İki handler bu invariant'ı kırar:
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 vedata_posbuffer'ın ötesine ilerler.FD_CMD_DRIVE_SPECIFICATION_COMMAND— 5. parametre byte'ı most-significant bit'inden yoksun olduğunda neifne deelse-ifbranch'i çalışır, dolayısıyladata_posasla reset edilmez.data_pos512'nin ötesindeyken, sonraki her FIFO write controller'ınFDCtrlyapısına komşu host memory'sine düşer — kontrollü bir out-of-bounds write.- 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)
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çindedata_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/