QEMU virtio-fs device-file host priv-esc (CVE-2020-35517)¶
virtiofsd, shared directory'deki special file'ların açılmasını engellemeyi başaramadı; bu da privileged bir guest'in bir host device node'unu açıp altta yatan host device'a read/write erişimi kazanmasına izin verdi.
Mechanism¶
Sınır neden kırılıyor
virtiofsd daemon'ı (tools/virtiofsd/passthrough_ll.c) shared tree'deki
girdileri yalnızca opak regular file'lar ve dizinler olarak ele almalıdır. İhlal
edilen invariant: shared-fs daemon'ı guest adına asla bir special file'ı
(character/block device node, vb.) open() etmemelidir. FUSE_OPEN path'inde
(lo_open()/lo_create()) bir file-type check eksikti, dolayısıyla virtiofsd
shared directory'ye yerleştirilmiş bir device-special node'u açar ve guest'e
doğrudan host device I/O'su verirdi — bir guest-to-host privilege escalation. Not:
normal bir guest userspace'i buraya erişemez (guest kernel'i special file'ları
yerel olarak ele alır); değiştirilmiş/kurcalanmış bir guest tarafı FUSE client
gerektirir.
Walkthrough¶
Kavramsal, public advisory ve patch serisinden.
- Host bir dizini virtio-fs/virtiofsd aracılığıyla guest'e paylaşır.
- Kurcalanmış bir guest FUSE client'a sahip privileged bir guest, shared
directory'de bulunan bir device-special file'ı hedefleyen bir
FUSE_OPENhazırlar. - virtiofsd host device node'unu doğrudan açar → guest host device r/w kazanır.
Detection¶
- Host tarafı: virtiofsd'nin shared dir altında device node'ları / non-regular
file'lar açması; virtiofsd process'inin character/block device'lar üzerindeki
open()çağrılarını denetleyin. - Davranışsal: Bir shared directory'de device-special file'ların bulunması ve guest'in bunlara karşı FUSE_OPEN yapması anormaldir.
Mitigation¶
- Patch: Stefan Hajnoczi'nin serisini (v3, 2021-01-27) uygulayın; bu seri,
/proc/self/fd/üzerindenO_NOFOLLOWile açan ve inodeS_ISREGya daS_ISDIRolmadıkça-EBADFdöndürenlo_inode_open()'ı ekleyerek device node'ları ve symlink'leri reddeder. - Hardening: virtiofsd'yi bir sandbox içinde çalıştırın; bir shared directory'yi asla device-special file'larla doldurmayın; özel, minimum ayrıcalıklı bir share kullanın.