QEMU qemu-img info json OOB write (CVE-2024-4467)¶
external-data-file adı bir
json:{}block-device descriptor'ı olan crafted bir qcow2 image,qemu-img info'nun onu nested bir block device olarak açmasına yol açar; DoS'a ve mevcut bir host file'ının read/write'ına olanak verir.
Mechanism¶
Sınır neden kırılıyor
qemu-img info'nun, attacker-chosen host kaynaklarını hiç açmadan yalnızca
image metadata'sını incelediği varsayılır. Bir qcow2 image bir external
data file (data_file header extension'ı) adlandırabilir. QEMU o field'ı
tam bir block-device specifier'ı olarak yorumlar; dolayısıyla bir attacker
onu, açılabilir herhangi bir host file/device'ını adlandıran bir
json:{...} descriptor'ına set edebilir. Aşılan invariant:
read-only bir "inspect" operasyonu, hangi host file'ının açılacağını
untrusted image metadata'sının belirlemesine izin vermemeli. NVD bu CVE'yi
şu an CWE-787 (out-of-bounds write) olarak etiketler; buna karşın Red Hat /
GitHub Advisory ekosistemi onu CWE-400 (uncontrolled resource consumption)
olarak sınıflar. Bu CWE-787 etiketi teknik olarak tam isabetli değildir —
load-bearing kusur, klasik bir buffer-bounds write'ı (index/offset hesabı
hatası) değil, untrusted-filename → arbitrary block-device yorumu, yani
untrusted metadata'nın hangi host file/device'ının açılacağını dikte
etmesidir (kavramsal olarak input-validation / untrusted-deserialization
sınıfına, ör. CWE-400 / CWE-20'ye daha yakındır). Sonuçta sözde read-only bir
inspection, mevcut bir host file'ını okuyabilir ya da yazabilir. Bir guest
gerekmez — bu,
herhangi bir image-intake tooling'ini vurur (upload'larda qemu-img info
çalıştıran cloud/CI pipeline'ları).
Walkthrough¶
Kavramsal, public advisory'den alınmıştır; çalışan bir exploit değil.
- Attacker, external-data-file adı bir host path'e işaret eden bir
json:{ ... }block-device descriptor'ı olarak craft edilmiş bir qcow2 image sağlar.
# Conceptual: data_file string is a json: block-device spec, not a plain name
qemu-img info malicious.qcow2
-
qemu-img info, qcow2 metadata'sını parse eder ve external data file'ını embed edilmiş JSON'a göre nested bir block device olarak açar. -
Inspection path'i artık attacker tarafından adlandırılmış bir host file'a dokunur → hedeflenen metadata-only davranışının dışında, denial of service ya da mevcut bir host file'ının read/write'ı.
Detection¶
- Host tarafı: image-intake pipeline'larındaki
qemu-imginvocation'larını audit et; beklenmedik host path'leri ya da block device'ları açan birqemu-img infoanormaldir. - Telemetry:
qemu-imgçalıştıran servis hesabında, image file'ının kendisinin dışındaki access'leri gösteren File-access /open()auditing. - Image scanning: İşlemeden önce
data_fileheader'ı birjson:prefix'i içeren qcow2 image'lerini flag'le.
Mitigation¶
- Patch: QEMU'da 9.1.0'dan önce düzeltildi; Red Hat errata aracılığıyla
dağıtıldı (RHSA-2024:4276/4277/4278/4420).
infopath'i artık external data file'ını arbitrary bir block-device spec'i olarak açmıyor. - Hardening: image-intake tooling'ini unprivileged ve sandbox'lanmış
çalıştır; untrusted image'ler üzerinde
qemu-img'i asla privileged bir kullanıcı olarak çalıştırma. - Defense in depth:
--image-opts/ explicit allowlisting kullan ve block-device backend'lerine untrusted string geçirmekten kaçın.