Skip to content

QEMU ARM GIC OOB heap access (CVE-2021-20221)

QEMU'nun emulate edilmiş ARM Generic Interrupt Controller'ındaki maskelenmemiş bir SGI interrupt ID'si, privileged bir guest'in sabit boyutlu bir host array'ini out of bounds index'lemesine ve QEMU process'ini crash etmesine izin verir.

Mechanism

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

aarch64'te, in-kernel irqchip kullanılmadığında QEMU ARM Generic Interrupt Controller'ı (GIC) host process'inde emulate eder. GICD_SGIR distributor register'ına yazmak bir Software Generated Interrupt forward'lar; ARM spec'ine göre interrupt-ID field'ı yalnızca 0–15 aralığında geçerlidir (4 bit). Açık: değer, 4 bit (value & 0xf) yerine 10-bit bir mask ile maskelendi (value & 0x3ff, 0–1023'e izin verir), sonra 16 SGI için boyutlandırılmış GIC state array'lerini (örn. bir uint8_t[16][8] tablosu) index'lemek için kullanıldı. Bu yüzden guest tarafından sağlanan, 15'in üzerindeki bir ID, host memory'sinde bir out-of-bounds heap access'i sürer. İhlal edilen invariant klasik olanıdır: guest tarafından kontrol edilen bir değer, bir host array index'i olarak kullanılmadan önce emulate edilen register'ın tanımlı genişliğine range-constrain'lenmelidir. Etki denial of service'tir — privileged guest user QEMU'yu crash eder. Bkz. ../primitive/out-of-bounds-write.md.

Walkthrough

Herkese açık CVE/Bugzilla ve upstream fix'inden kavramsal yeniden kurulum; yalnızca mantıksal adımlar.

  1. Host, GIC'i QEMU userspace'inde emulate edilen bir aarch64 guest çalıştırır (etkilenen yapılandırma kernel-irqchip=off'tur; varsayılan kernel-irqchip=on in-kernel GIC kullanır ve etkilenmez).
  2. Privileged bir guest aktörü, distributor'ın GICD_SGIR register'ına 15'ten büyük bir SGI interrupt ID'siyle yazar.
  3. Model, ID'yi fazla bit ile maskeler ve onu 16 girişli SGI state array'lerine bir index olarak kullanır, dolayısıyla host array sınırının ötesini okur/yazar, tipik olarak fault verir ve QEMU process'ini abort eder.
Advisory açıklaması

"An out-of-bounds heap buffer access issue was found in the ARM Generic Interrupt Controller emulator of QEMU ... The issue occurs because while writing an interrupt ID to the controller memory area, it is not masked to be 4 bits wide." — NVD CVE-2021-20221

Detection

  • Host crash sinyali: emulate edilmiş bir GIC kullanan aarch64 guest'lerde, guest interrupt-controller programlamasıyla ilişkilendirilen QEMU process abort/segfault'u.
  • Sanitizer: ASan ile instrumente edilmiş QEMU, aralık dışı bir SGI ID'si sağlandığında GIC distributor write path'inde bir heap-buffer-overflow işaretler.
  • Configuration audit: Hangi aarch64 guest'lerin kernel-irqchip=off ile çalıştığını envanterle — yalnızca onlar savunmasız userspace GIC koduna ulaşır.

Mitigation

  • Patch: SGI interrupt ID'sini ARM spesifikasyonuna göre 4 bit'e maskeleyen (irq = value & 0xf) upstream QEMU fix'ini (commit edfe2eb4360cde4ed5d95bda7777edcb3510f76a) uygula.
  • Configuration hardening: Mümkün olan yerde varsayılan kernel-irqchip=on'u (in-kernel GIC) kullan; o path hatalı userspace kodunu çalıştırmaz.
  • Sandboxing: QEMU'yu seccomp (-sandbox on) ve svirt/SELinux confinement ile çalıştır ki crash patlama yarıçapı confine edilmiş device-model process'i içinde kalsın.

References