Skip to content

LeftoverLocals: Listening to LLM responses through leaked GPU local memory (CVE-2023-4969)

Trail of Bits'in GPU memory-disclosure açığı (CVE-2023-4969): GPU local memory kernel çağrıları arasında ya da process'ler arasında temizlenmez, bu yüzden bir "listener" kernel başka bir process'in artık compute sonuçlarını — bir LLM'in inference'ının ara değerleri dahil — process ve container sınırlarının ötesinde okuyabilir.

Mechanism

Note

GPU programlama framework'leri (OpenCL, Vulkan, Metal, CUDA), local memory adı verilen hızlı, on-chip bir scratchpad sunar (OpenCL __local, CUDA shared memory, Metal threadgroup memory). Bir workgroup'un thread'leri arasında paylaşılır ve global memory'den çok daha hızlıdır, bu yüzden kernel'lar ara veriyi orada tutar.

İzolasyon için geçerli olması gereken değişmez (invariant) şudur: bir process'e verilen bellek, başka bir process'in verisini içermemelidir. CPU'larda OS, page'leri yeniden kullanmadan önce sıfırlar. Etkilenen GPU'larda ise local memory sıfırlanmaz — ne bir kernel'ın execution'ı ile bir sonraki arasında, ne de process'ler arasında. Bir kernel bittiğinde, artık değerleri fiziksel local-memory bank'lerinde durur; bir sonraki kernel (belki farklı bir process'ten) aynı compute unit'e schedule edilip initialize edilmemiş local memory'yi okuduğunda, önceki kiracının kalıntısını gözlemler.

GPU'lar yoğun biçimde multiplex edildiği ve CPU'ların sahip olduğu per-process bellek temizlemesinden yoksun olduğu için, kötü niyetli bir process tekrar tekrar büyük local buffer'lar allocate edip onları initialize edilmemiş hâlde okuyabilir ve kendisinden önce çalışan şeyin parçalarını toplayabilir — GPU'nun kiracı sınırının ötesinde bir covert/side okuma.

Walkthrough

Aşağıdaki, araştırmacıların yayımladığı kavramsal listener/writer tekniğidir; GPU compute çalıştırmanın ötesinde herhangi bir ayrıcalık gerektirmez.

Writer (victim model). Normal bir GPU workload'u — örneğin llama.cpp üzerinden inference yapan bir LLM — activation'ları ve matrix-multiply sonuçlarını local memory'de tutar. Her kernel tamamlandığında, o değerler local memory bank'lerinde kalır.

Listener (saldırgan). İkinci, ortak yerleşik (co-resident) bir process tekrar tekrar, büyük bir local array tanımlayan ve önce yazmadan onu okuyan önemsiz bir kernel dispatch eder, initialize edilmemiş içeriği host'un inceleyebileceği global memory'ye geri kopyalar:

Conceptual listener kernel (OpenCL-style, reads uninitialized local memory)

__kernel void listener(__global float *out) {
    __local float canary[256];   /* e.g., 256 floats; not initialized */
    size_t lid = get_local_id(0);
    /* read leftover local memory and exfiltrate it to global memory */
    out[get_global_id(0)] = canary[lid];
}
Çok sayıda dispatch boyunca tekrarlandığında, out, o local-memory bank'leri en son kullanan kernel'ın kalıntısıyla dolar. Araştırmacılar, listener'ın bir LLM'in çıktısını yeniden inşa edebildiğini gösterdi çünkü modelin ara tensor'ları bu kalıntı üzerinden sızıyor — saldırganın başka bir kullanıcının LLM yanıtlarını "dinlemesine" izin veriyor.

Etkilenen üreticiler. Trail of Bits'in koordineli açıklaması (CVE-2023-4969), etkilenen GPU mimarları olarak Apple, AMD, Qualcomm ve Imagination Technologies'i listeler (NVIDIA ve Arm cihazlarının etkilenmediği doğrulandı); sızıntı, savunmasız yığınlarda process ve container sınırlarını aşar.

Warning

Teknik yalnızca GPU'nun temizleyemediği belleği okur — bu bir disclosure primitive'idir, memory corruption değil. Güvenilirlik co-residency ve scheduling'e bağlıdır; etkilenen donanımda gerçek bir cross-tenant confidentiality ihlalidir ve özellikle bir GPU'yu paylaşan ML/LLM workload'ları için önemlidir.

Detection

  • Bu, corruption içermeyen pasif bir okumadır, bu yüzden runtime'da tespit etmesi zordur. Pratik sinyaller: ayrıcalıksız bir process'in, sıkı bir loop içinde büyük initialize edilmemiş local buffer'ları okuyan kernel'ları tekrar tekrar dispatch etmesi.
  • Etkilenen üreticilerin yığınlarında driver/firmware patch seviyelerini doğrula.

Mitigation

  • Üretici düzeltmelerini uygula: Qualcomm firmware/kernel patch'leri yayımladı; Apple, AMD ve Imagination koordineli açıklama doğrultusunda driver/firmware güncellemelerinde ele aldı. Patch'lenmiş driver'ın kurulu olduğunu doğrula.
  • Kernel dispatch'inden önce local memory'yi sıfırla (local memory'yi initialize eden bir compiler/runtime pass'i ya da kiracılar arasında açık bir temizleme kernel'ı).
  • Hassas workload'lar için karşılıklı olarak birbirine güvenmeyen kiracılar arasında bir GPU'yu paylaşmaktan kaçın; ML inference'ını her kiracı için izole et. AMD'nin bunun için opsiyonel secure-compute özelliği varsayılan olarak devre dışıdır.

References