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.
- Bir guest bir 9pfs export'unu attach eder (örn. bir virtio-9p
-fsdev/-virtfsmount'u) ve çok sayıda eşzamanlı istek gönderebilen kötü niyetli bir 9P client'ı gibi davranır. - 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.
- 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.