Skip to content

Xen vlapic_error recursive-lock deadlock (CVE-2024-45817)

XSA-462: illegal bir vector ile configure edilmiş bir APIC error interrupt, ilki hâlâ handle edilirken ikinci bir error yükseltir; bu da vlapic_error()'in zaten tuttuğu non-recursive bir lock'u almaya çalışmasına neden olur — Xen deadlock'a girer.

Mechanism

Bug sınıfı: re-entrant error path non-recursive bir lock alır

Buradaki güvenlik/availability invariant'ı, emulated-APIC error handling'in daima ileri doğru ilerleme (forward progress) kaydetmesi gerektiğidir. x86 APIC architecture'ında, LVT error entry'si bir illegal vector ile programlandığında, bir error interrupt teslim etmek başlı başına bir error koşuludur — bu da başka bir error yükseltir. Xen'in vlapic_error()'i, virtual APIC state register'ını koruyan spinlock'u tutarken çalışır. İlk error'ın handle edilmesi aynı path'e recurse ederse, kod o lock'u ikinci kez almaya çalışır. Lock recursive değildir, dolayısıyla nested error'ı temiz bir şekilde raporlamak yerine CPU zaten sahibi olduğu bir lock üzerinde sonsuza dek spin eder. Aşılan sınır availability'dir: tek bir guest, hypervisor içinde bir physical CPU'yu durdurur.

Trigger tamamen guest tarafından kontrol edilir (bir guest kötü bir LVT error vector yazar), bu yüzden malicious ya da yalnızca buggy bir guest ona ulaşabilir.

Walkthrough

Yalnızca kavramsal

Public, patch'lenmiş XSA-462 advisory'sinden alınmıştır. Exploit kodu yok.

Advisory'nin tarif ettiği mantıksal sıra:

  1. Bir HVM veya PVH guest, local-APIC LVT error register'ını illegal bir interrupt vector ile programlar.
  2. Bir error koşulu tetiklenir; Xen vlapic_error()'e girer ve error-status register'ını güncellemek için vlapic lock'unu alır.
  3. O error'ı kaydetmek kendisi bir başka error yükseltir (configure edilen error vector illegal olduğu için) ve error path'ine yeniden girer.
  4. Yeniden girilen path aynı non-recursive lock'u almaya çalışır → physical CPU Xen içinde deadlock'a girer.

Etki: host Denial of Service (sıkışmış bir pCPU; privilege escalation ya da information disclosure iddia edilmez). Fix recursion'ı kırar, böylece nested error tutulan lock'u yeniden almaya çalışamaz.

Detection

  • Belirli bir guest'in aktivitesiyle ilişkili olarak, asılı/yanıt vermeyen bir host ya da ilerleme olmadan %100'de sabitlenmiş bir pCPU başlıca semptomdur.
  • Etkilenen pCPU üzerinde watchdog / NMI-watchdog lockup mesajları; etkinse Xen hung-task veya soft-lockup tarzı uyarılar.
  • Buna yalnızca HVM/PVH guest'ler ulaşabilir; PV guest'ler ulaşamaz. Detection'ı Xen 4.5+ üzerinde HVM/PVH çalıştıran host'larla sınırla.
  • Monitoring açısından, düzenli bir offline event olmadan bir CPU'nun scheduler'ın runnable set'inden aniden kaybolması yararlı bir anomali sinyalidir.

Mitigation

  • Patch'le. Branch'in için XSA-462'yi (xsa462.patch) uygula — tek eksiksiz fix. Savunmasız: Xen 4.5 ve sonrası (x86). Xen 4.4 ve öncesi etkilenmez.
  • Patch'lenmemiş host'larda untrusted HVM/PVH guest'leri kısıtla; etkilenen emulated-APIC path'ini devre dışı bırakan güvenli bir configuration ayarı yok.
  • Host watchdog'larını etkin tut, böylece sıkışmış bir pCPU en azından gözlemlenebilir ve host hızla recover/reboot edilebilir.

References