Skip to content

QEMU 9pfs TOCTOU use-after-free (CVE-2021-20181)

QEMU'nun 9pfs server'ındaki bir race condition, kötü niyetli bir 9P client'ının per-client open-fid/file-descriptor state'ini desenkronize etmesine ve host QEMU process'inde free edilmiş memory'ye ulaşmasına izin verir — bir guest-to-host use-after-free.

Mechanism

Sınır neden kırılıyor

9pfs (Plan 9 filesystem / virtio-9p) backend'i bir host directory'sini bir guest'e export eder. 9P istekleri host QEMU process'inde coroutine olarak dispatch edilir ve per-client state — özellikle açık "fid"lerin listesi ve onların altında yatan host file descriptor'ları — paylaşılan değiştirilebilir state'tir. Bazı operation'lar (bir path/fid validate edilir, sonra daha sonra dereference edilir ya da close edilir) bir time-of-check / time-of-use penceresi oluşturur: aynı client'tan ikinci, eşzamanlı bir istek, nesne check edildikten sonra ama kullanılmadan önce onu mutate edebilir ya da free edebilir. Red Hat analizi bunu, bir use-after-free'ye yol açan "improper synchronization of [the] list [of open file descriptors]" olarak çerçeveler. İhlal edilen isolation invariant'ı şu: guest-pacing, host tarafındaki nesne lifetime'ını uçuştaki bir reference'a karşı interleave edememelidir — edebildiğinde, host bir dangling pointer'ı takip eder ki advisory bunun host'ta privilege escalation'a izin verebileceğini belirtir. Bkz. ../primitive/time-of-check-time-of-use.md ve ../primitive/use-after-free.md.

Walkthrough

Herkese açık CVE/Bugzilla ve upstream fix commit'inden kavramsal yeniden kurulum; yalnızca mantıksal adımlar, çalışan bir exploit değil.

  1. Bir guest bir 9pfs export'unu attach eder (örn. bir virtio-9p -fsdev/-virtfs mount'u) ve çok sayıda eşzamanlı istek gönderebilen kötü niyetli bir 9P client'ı gibi davranır.
  2. Client, open-fid / fd listesini paylaşan operation'ları sürer ve onları race eder: bir istek bir fid/fd kurar ya da referans verirken bir diğeri aynı state'i yıkar (close/reset path'i), coroutine interleave'ini sömürerek.
  3. Liste yeterli synchronization olmadan mutate edildiği için, "check" altında yakalanan bir reference, partner istek onu free ettikten sonra kullanılabilir — host QEMU process'i bir use-after-free gerçekleştirir.
Advisory açıklaması

"A race condition flaw was found in the 9pfs server implementation of QEMU up to and including 5.2.0. This flaw allows a malicious 9p client to cause a use-after-free error, potentially escalating their privileges on the system." — NVD CVE-2021-20181

Detection

  • Sanitizer sinyali: ASan/Valgrind ile instrumente edilmiş QEMU build'lerinde, eşzamanlı client yükü altında 9pfs request path'inde bir heap-use-after-free raporlanır — en doğrudan doğrulama.
  • Host crash telemetrisi: Tek bir guest'ten gelen 9P trafiği patlamalarıyla ilişkilendirilen, QEMU process'inin beklenmedik SIGSEGV/abort'u; free edilmiş 9pfs/fid structure'larına işaret eden core dump'lar.
  • Davranışsal: Anormal derecede yüksek oranda eşzamanlı, interleave edilmiş 9P fid open/clunk/reset operation'ları gönderen bir guest, normal filesystem kullanımı için anomalidir ve device-model logging'inde işaretlenmeye değer.

Mitigation

  • Patch: open-fid/descriptor handling'inin synchronization'ını düzelten ve böylece lifetime race'ini kapatan upstream QEMU fix'ini (commit 89fbea8737e8f7b954745a1ffc4238d377055305) uygula. 5.2.0'dan sonraki release'lerde düzeltildi.
  • Attack surface'i azalt: 9pfs'i untrusted guest'lere export etme. Red Hat, shipped qemu-kvm'inin etkilenmediğini belirtti çünkü virtio-9p backend'ini içermez — gerekmediği yerde 9p'yi devre dışı bırakmak/atlamak path'i ortadan kaldırır.
  • Sandboxing / defense in depth: QEMU'yu seccomp (-sandbox on) ve bir svirt/SELinux confinement profile'ı altında çalıştır ki UAF sonrası bir primitive device-model process'inin azaltılmış privilege setine kısıtlansın.

References