CVE-2024-53111

Yüksek

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: mm/mremap: move_page_tables() fonksiyonundaki adres kayması (wraparound) hatası düzeltildi 32 bit platformlarda, `len + old_addr` ifadesinin taşma yapması durumunda `len + old_addr < old_end` ifadesinin hatalı bir şekilde doğru (false-positive) sonuç vermesi mümkündür. `old_addr`, eski aralıkta sayfa tablosu girişlerinin taşındığı noktaya kadar olan imleçtir; dolayısıyla işlem başarılı olduysa `old_addr` eski bölgenin sonudur ve buna `len` eklemek taşmaya neden olabilir. Bu taşma, mremap()'in PTE'lerin kopyalandığını yanlışlıkla düşünmesine yol açar; bunun sonucunda mremap() işlemi durdurur ancak yeni VMA eşlemesi kaldırılmadan önce PTE'leri geri taşımaz, bu da bölgedeki anonim sayfaların kaybına neden olur. Temel olarak, kullanıcı alanı özel-anonim (private-anon) bir bölgeyi mremap() ile yeniden eşlemeye çalışırsa ve bu hata tetiklenirse, mremap() bir hata döndürecek ve özel-anonim bölgenin içeriği sıfırlanmış gibi görünecektir. Bu kontrolün amacı `old_end - len` ifadesinin orijinal başlangıç adresi olmasıdır ve kontrolün bu şekilde yazılması okunabilirliği de artırmaktadır; bu nedenle karşılaştırma uygun şekilde yeniden düzenlenerek kontrol düzeltilmiştir. (Alternatif bir çözüm, "orig_old_start" gibi bir değişken tanıtarak bu fonksiyonun yeniden yapılandırılması olabilirdi.) 32 bit X86 çekirdekli bir VM üzerinde test edilmiştir; yama olmadan: ``` user@horn:~/big_mremap$ cat test.c #define _GNU_SOURCE #include <stdlib.h> #include <stdio.h> #include <err.h> #include <sys/mman.h> #define ADDR1 ((void*)0x60000000) #define ADDR2 ((void*)0x10000000) #define SIZE 0x50000000uL int main(void) { unsigned char *p1 = mmap(ADDR1, SIZE, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED_NOREPLACE, -1, 0); if (p1 == MAP_FAILED) err(1, "mmap 1"); unsigned char *p2 = mmap(ADDR2, SIZE, PROT_NONE, MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED_NOREPLACE, -1, 0); if (p2 == MAP_FAILED) err(1, "mmap 2"); *p1 = 0x41; printf("first char is 0x%02hhx\n", *p1); unsigned char *p3 = mremap(p1, SIZE, SIZE, MREMAP_MAYMOVE|MREMAP_FIXED, p2); if (p3 == MAP_FAILED) { printf("mremap() failed; first char is 0x%02hhx\n", *p1); } else { printf("mremap() succeeded; first char is 0x%02hhx\n", *p3); } } user@horn:~/big_mremap$ gcc -static -o test test.c user@horn:~/big_mremap$ setarch -R ./test first char is 0x41 mremap() failed; first char is 0x00 ``` Yama ile: ``` user@horn:~/big_mremap$ setarch -R ./test first char is 0x41 mremap() succeeded; first char is 0x41 ```

ÖnemYüksek
CVSS7.1
İstismar olasılığı—
ÜrünLinux Kernel
Yayın2 Ara 2024
İlk görülme2 Ara 2024
Zayıflık türüCWE-190Tamsayı taşması

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.11.10 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.7 ≤ v < 6.11.10, 6.126.11.10

Sürümünüzü kontrol edin

Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.

Intelligence 360 paketinde

Attack Surface Management

Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.

CVE-2024-53111 · Linux Kernel · Dark Radar