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.
- 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.
- 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.
- Ortaya çıkan dosya istenmeyen gruba aittir (örn.
rootgrubu). 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,nodevmount 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.