Skip to content

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 bhyve process'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.

  1. Host, emüle edilmiş bir e1000 NIC ile bir guest çalıştırır:
bhyve -s 0,hostbridge -s 3,e1000,tap0 \
      -s 31,lpc -l com1,stdio -c 2 -m 2G vm0
  1. 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.

  2. Host e1000 model'i header'ı on-stack buffer'ına kopyalar ve checksum'ı header + offset'e yazar. offset buffer 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: bhyve process'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 e1000 model'i etkileniyor — guest'i bu code path'ine sahip olmayan virtio-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).

References