CVE-2024-46687

Yüksek

Açıklama

Linux kernel'de aşağıdaki güvenlik açığı giderilmiştir: btrfs: btrfs_submit_chunk() içerisinde hatalarla karşılaşıldığında meydana gelen bir serbest bırakıldıktan sonra kullanım (use-after-free) durumu düzeltildi. [HATA] KASAN'ın aşağıdaki geri izleme (backtrace) ile serbest bırakıldıktan sonra kullanım raporladığına dair dahili bir rapor bulunmaktadır: BUG: KASAN: slab-use-after-free in btrfs_check_read_bio+0xa68/0xb70 [btrfs] Read of size 4 at addr ffff8881117cec28 by task kworker/u16:2/45 CPU: 1 UID: 0 PID: 45 Comm: kworker/u16:2 Not tainted 6.11.0-rc2-next-20240805-default+ #76 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-3-gd478f380-rebuilt.opensuse.org 04/01/2014 Workqueue: btrfs-endio btrfs_end_bio_work [btrfs] Call Trace: dump_stack_lvl+0x61/0x80 print_address_description.constprop.0+0x5e/0x2f0 print_report+0x118/0x216 kasan_report+0x11d/0x1f0 btrfs_check_read_bio+0xa68/0xb70 [btrfs] process_one_work+0xce0/0x12a0 worker_thread+0x717/0x1250 kthread+0x2e3/0x3c0 ret_from_fork+0x2d/0x70 ret_from_fork_asm+0x11/0x20 Allocated by task 20917: kasan_save_stack+0x37/0x60 kasan_save_track+0x10/0x30 __kasan_slab_alloc+0x7d/0x80 kmem_cache_alloc_noprof+0x16e/0x3e0 mempool_alloc_noprof+0x12e/0x310 bio_alloc_bioset+0x3f0/0x7a0 btrfs_bio_alloc+0x2e/0x50 [btrfs] submit_extent_page+0x4d1/0xdb0 [btrfs] btrfs_do_readpage+0x8b4/0x12a0 [btrfs] btrfs_readahead+0x29a/0x430 [btrfs] read_pages+0x1a7/0xc60 page_cache_ra_unbounded+0x2ad/0x560 filemap_get_pages+0x629/0xa20 filemap_read+0x335/0xbf0 vfs_read+0x790/0xcb0 ksys_read+0xfd/0x1d0 do_syscall_64+0x6d/0x140 entry_SYSCALL_64_after_hwframe+0x4b/0x53 Freed by task 20917: kasan_save_stack+0x37/0x60 kasan_save_track+0x10/0x30 kasan_save_free_info+0x37/0x50 __kasan_slab_free+0x4b/0x60 kmem_cache_free+0x214/0x5d0 bio_free+0xed/0x180 end_bbio_data_read+0x1cc/0x580 [btrfs] btrfs_submit_chunk+0x98d/0x1880 [btrfs] btrfs_submit_bio+0x33/0x70 [btrfs] submit_one_bio+0xd4/0x130 [btrfs] submit_extent_page+0x3ea/0xdb0 [btrfs] btrfs_do_readpage+0x8b4/0x12a0 [btrfs] btrfs_readahead+0x29a/0x430 [btrfs] read_pages+0x1a7/0xc60 page_cache_ra_unbounded+0x2ad/0x560 filemap_get_pages+0x629/0xa20 filemap_read+0x335/0xbf0 vfs_read+0x790/0xcb0 ksys_read+0xfd/0x1d0 do_syscall_64+0x6d/0x140 entry_SYSCALL_64_after_hwframe+0x4b/0x53 [NEDEN] Hata yeniden üretilemese de, raporun kendisi nedeni belirlemek için yeterlidir. Çağrı izlemesi standart endio iş kuyruğu bağlamındadır ancak görev tarafından serbest bırakılma izlemesi, btrfs_submit_chunk() sırasında kritik bir hatanın oluştuğunu ve hata çıkışı yapmak için btrfs_bio_end_io() fonksiyonunun çağrıldığını göstermektedir. Orijinal endio fonksiyonu ise tüm bio yapısını serbest bırakmak için bio_put() fonksiyonunu çağırmıştır. Bu durum, örneğin şu şekilde çift serbest bırakmaya ve dolayısıyla serbest bırakıldıktan sonra kullanıma neden olur: 1. Bir okuma bio'su ile btrfs_submit_bio() fonksiyonuna girilir. Okuma bio uzunluğu 128K'dır ve iki adet 64K şeridi geçer. 2. btrfs_submit_chunk()'ın ilk çalışması: 2.1 64K döndüren btrfs_map_block() çağrılır. 2.2 btrfs_split_bio() çağrılır. Artık biri ilk 64K'ya, diğeri ikinci 64K'ya referans veren iki bio vardır. 2.3 İlk yarı gönderilir. 3. btrfs_submit_chunk()'ın ikinci çalışması: 3.1 Herhangi bir nedenle başarısız olan btrfs_map_block() çağrılır. Hatayı yönetmek için btrfs_bio_end_io() çağrılır. 3.2 btrfs_bio_end_io(), orijinal endio fonksiyonu olan end_bbio_data_read()'i çağırır ve bu da orijinal bio için bio_put() işlemini gerçekleştirir. Böylece orijinal bio serbest bırakılmış olur. 4. Gönderilen ilk 64K bio tamamlanır. Şimdi btrfs_check_read_bio() çağrılır ve bio iterator ilerletilmeye çalışılır. Ancak orijinal bio (ve dolayısıyla onun iterator'ı) zaten serbest bırakıldığı için yukarıdaki serbest bırakıldıktan sonra kullanım tetiklenir. Bellek zehirlenmemiş veya bozulmamış olsa bile, daha sonra orijinal endio fonksiyonu tekrar çağrılacak ve bu da çift serbest bırakmaya yol açacaktır. [ÇÖZÜM] btrfs_bio_end_io() yerine, bölünmüş bio'lar üzerinde ek kontrol yapan btrfs_orig_bbio_end_io() çağrılmıştır.

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın13 Eyl 2024
İlk görülme13 Eyl 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.6.49, 6.10.8 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel6.3 ≤ v < 6.6.49, 6.7 ≤ v < 6.10.8, 6.116.6.49, 6.10.8

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-46687 · Linux Kernel · Dark Radar