Skip to content

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.

  1. Host bir dizini virtio-fs/virtiofsd aracılığıyla guest'e paylaşır.
  2. Kurcalanmış bir guest FUSE client'a sahip privileged bir guest, shared directory'de bulunan bir device-special file'ı hedefleyen bir FUSE_OPEN hazırlar.
  3. 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/ üzerinden O_NOFOLLOW ile açan ve inode S_ISREG ya da S_ISDIR olmadıkça -EBADF döndüren lo_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.

References