Skip to content

QEMU virtiofsd SGID file ownership flaw (CVE-2022-0358)

virtiofsd, bir shared directory'de SGID bit'ini doğru şekilde temizlemeden / dizin group-inheritance semantiğine uymadan dosya oluşturabiliyordu; bu da unprivileged bir guest kullanıcısının istenmeyen bir (örn. root) gruba ait dosyalar elde etmesine izin veriyordu — guest/host dosya sınırı boyunca bir privilege-escalation primitive'i.

Mechanism

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

virtiofsd, virtio-fs'i destekleyen host tarafı daemon'dur: host'ta guest adına filesystem işlemleri gerçekleştirir ve guest request'lerini (create, write, setattr) shared directory tree'si içinde host syscall'larına çevirir. Normal bir Unix filesystem'inde, bir dizin set-group-ID (SGID) bit'i set edilmiş olduğunda, yeni oluşturulan dosyalar dizinin grubunu inherit eder ve kernel, privilege retention'ı önlemek için grup üyesi olmayan biri tarafından yapılan write'ta SGID'yi temizler. virtiofsd dosya oluşturmayı user space'te yeniden implement eder, bu yüzden o kernel semantiğini sadık biçimde yeniden üretmekten sorumludur. Açık: dosya oluştururken, daemon SGID bit'ini doğru şekilde drop/clear etmedi ya da group ownership'i kernel'in unprivileged bir caller için yapacağı şekilde uygulamadı. İhlal edilen invariant şudur: daha az ayrıcalıklı bir principal adına hareket eden bir file-server, host kernel'inin SGID-clearing ve group-inheritance kurallarını tam olarak yeniden üretmelidir; herhangi bir sapma caller'ın doğrudan elde edemeyeceği bir group ownership'e sahip bir dosya elde etmesine izin verir. Pratik etki: bir guest unprivileged kullanıcısı bir SGID dizininde bir dosya oluşturur ve sonunda ayrıcalıklı bir gruba (örneğin root grubu) ait bir dosyaya, ya da SGID'yi koruyan bir executable'a sahip olur — guest'te ve potansiyel olarak dizini paylaşan host'ta privilege escalation'a doğru bir basamak. Bu, qemu-virtiofsd-xattrmap-capability-leak.md gibi capability-leak bug'larının permission-translation analoğudur; ../kernel/overlayfs-userns-capability-privesc.md'deki namespace privilege pattern'iyle karşılaştırın.

Walkthrough

Public advisory ve virtiofsd fix'inden kavramsal yeniden kurgu; yalnızca mantıksal adımlar.

  1. Host, ayrıcalıklı bir gruba ait bir SGID dizininin shared tree'de erişilebilir olduğu bir dizini virtio-fs aracılığıyla export eder.
  2. Unprivileged bir guest kullanıcısı içinde bir dosya oluşturur. virtiofsd host tarafı create'i gerçekleştirir ama SGID'yi o unprivileged kimlik için kernel'in yapacağı şekilde sadık biçimde temizlemez / group ownership'i yeniden türetmez.
  3. Ortaya çıkan dosya istenmeyen gruba aittir (örn. root grubu). Guest kullanıcısı artık asla elde etmemesi gereken bir group erişimine sahip bir dosya tutar — group-readable/writable resource'lara ulaşmak ya da ayrıcalıklı bir executable yerleştirmek için kullanılabilir.
Fix'teki kavramsal hardening

Fix, create'te mode handling'i sıkılaştırır, böylece SGID unprivileged caller'lar için drop edilir ve kernel davranışıyla eşleşir:

/* drop SGID (and clear set-id bits) when the creator is not a member  */
/* of the target group, mirroring the host kernel's create semantics    */

"A local guest user can create files in the directories shared by virtio-fs with unintended group ownership ... could allow a malicious unprivileged user inside the guest to gain access to resources accessible to the root group." — NVD / Red Hat, CVE-2022-0358

Detection

  • Ownership anomalileri: virtio-fs shared tree'lerinde, oluşturan guest kimliğinin set edememesi gereken bir group owner'a (özellikle ayrıcalıklı gruplar) sahip dosyalar birincil sinyaldir; shared export'lar üzerinde periyodik find -group <priv> denetimleri bunları yüzeye çıkarır.
  • SGID-korunmuş executable'lar: Shared directory'lerde bir yönetici tarafından üretilmemiş yeni SGID-bit executable'ları şüphelidir; export üzerindeki integrity monitoring (AIDE/Tripwire) bunları işaretler.
  • Telemetri: Unprivileged guest principal'ları için set-id bit'leriyle sonuçlanan virtiofsd create/setattr işlemleri loglanıp uyarılabilir.

Mitigation

  • Patch: SGID'yi doğru şekilde drop eden ve create'te group ownership'i yeniden türeten düzeltilmiş bir virtiofsd / QEMU build'ine (6.2.0-7 ve sonraki vendor errata) güncelleyin.
  • Export'u kısıtlayın: Ayrıcalıklı gruplara ait SGID dizinleri içeren dizinleri paylaşmayın; shared tree'leri nosuid,nodev mount edin ve mümkün olduğunda guest tarafından erişilebilir hiçbir SGID dizini olmadan.
  • Unprivileged çalıştırın: virtiofsd'yi özel bir unprivileged kullanıcı ve kısıtlayıcı bir seccomp/namespace sandbox altında çalıştırın, böylece yanlış sahipli bir dosya bile düşük ayrıcalıklı bir host kimliğine map'lenir.
  • Defense in depth: Herhangi bir user-space file server'ı set-id semantiği için güvenlik açısından hassas olarak ele alın; create/chmod/setattr path'lerini kernel kurallarına karşı gözden geçirin.

References