bhyve E1000 checksum-offset out-of-bounds write (CVE-2022-23087)¶
bhyve'ın emüle edilmiş Intel e1000 NIC'inde guest tarafından kontrol edilen, validate edilmemiş bir checksum offset'i, host
bhyveprocess'indeki on-stack header buffer'ının ötesine yazar — guest-to-host bir memory-corruption primitive'i.
Mechanism¶
Sınır neden kırılıyor
bhyve'da PCI device model'leri (e1000/Intel 82545 NIC dahil) guest
tarafından değil, host userspace bhyve process'inde emüle edilir.
Guest'in emüle edilmiş NIC'inden checksum offload ile bir packet transmit
etmesi istendiğinde, device model packet header'ının değiştirilmiş bir
kopyasını bir on-stack buffer'da oluşturur ve hesaplanan checksum'ı
guest tarafından belirlenen bir offset'e yazar. Hatanın özü: bu offset
belirli packet type'ları için bounds validation olmadan kullanılıyordu.
Buffer host memory'sinde yaşadığı ve offset guest tarafından kontrol
edildiği için, kötü niyetli bir guest yazma işlemini buffer'ın dışına
yönlendirebilir. Bir hypervisor'ın dayandığı isolation invariant'ı —
guest input'u asla host memory index'i olarak güvenilmemeli — ihlal
edilir, dolayısıyla corruption bhyve process'ine düşer ve "muhtemelen host
context'inde code execution'a yol açar" (FreeBSD-SA-22:05'e göre).
Walkthrough¶
Bu, public advisory'den kavramsal trigger path'ini yeniden kurar; açıklayıcıdır, weaponize edilmiş uçtan uca bir escape değildir.
- Host, emüle edilmiş bir e1000 NIC ile bir guest çalıştırır:
-
Guest'in içinde, privileged bir aktör emüle edilmiş NIC'in TX descriptor ring'ini bir packet'i checksum offload enabled halde transmit edecek şekilde programlar, device model'in checksum offset'ini range-check etmediği bir packet type seçer ve range dışı bir offset sağlar.
-
Host e1000 model'i header'ı on-stack buffer'ına kopyalar ve checksum'ı
header + offset'e yazar.offsetbuffer sonunu aştığında, host process guest tarafından etkilenmiş bir konumla out-of-bounds bir write gerçekleştirir.
Advisory etki metni
"the e1000 device emulation used a guest-provided value to specify the checksum offset in an on-stack buffer. The offset was not validated for certain packet types. ... a misbehaving guest could overwrite memory in the bhyve process on the host, possibly leading to code execution in the host context." — FreeBSD-SA-22:05.bhyve
Detection¶
- Host tarafı crash sinyali:
bhyveprocess'i guest network TX sırasında abort/segfault verir; stack-smashing canary'leri veya ASan (instrumented build'lerde) e1000 checksum path'indeki OOB write'ı işaretler. - Davranışsal: Olağandışı packet type'ları için bozuk checksum offload parametreleriyle TX descriptor'ları gönderen bir guest anomalidir; NIC offload telemetry'si veya offset'i loglayan değiştirilmiş bir device model bunu ortaya çıkarabilir.
Mitigation¶
- Patch: FreeBSD-SA-22:05.bhyve'ı uygula (Nisan 2022'de 12.x/13.x genelinde düzeltildi); fix, write'tan önce etkilenen packet type'ları için guest tarafından sağlanan checksum offset'ini validate eder.
- Configuration workaround: Yalnızca
e1000model'i etkileniyor — guest'i bu code path'ine sahip olmayanvirtio-net'e geçir. - Defense in depth: bhyve, device model'lerini bir Capsicum sandbox içinde çalıştırır; bu, corruption sonrası blast radius'unu sınırlar (ama yok etmez).