CVE-2025-39779
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılmışdır: btrfs: subpage: folio təmizlənənə qədər TOWRITE teqi saxlanılmalıdır btrfs_subpage_set_writeback() funksiyası folio ilk dəfə geri yazıldıqda folio_start_writeback() funksiyasını çağırır və folio-da hələ də çirkli bloklar olsa belə, PAGECACHE_TAG_TOWRITE teqini silir. Bu, btrfs_wait_ordered_extents() tərəfindən tələb olunanlar kimi sıralama zəmanətlərini poza bilər. Sıralamanın pozulması real xətaya səbəb olur. Məsələn, zonalı quruluşda generic/464 testinin işlədilməsi aşağıdakı ASSERT xətasına yol açacaq. Bu, pozulmuş sıralama fayl ölçüsü kəsilməzdən əvvəl mövcud çirkli səhifələrin boşaldılmasına (flush) nail ola bilmədiyi üçün baş verir. assertion failed: !list_empty(&ordered->list) :: 0, in fs/btrfs/zoned.c:1899 ------------[ cut here ]------------ kernel BUG at fs/btrfs/zoned.c:1899! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 2 UID: 0 PID: 1906169 Comm: kworker/u130:2 Kdump: loaded Not tainted 6.16.0-rc6-BTRFS-ZNS+ #554 PREEMPT(voluntary) Hardware name: Supermicro Super Server/H12SSL-NT, BIOS 2.0 02/22/2021 Workqueue: btrfs-endio-write btrfs_work_helper [btrfs] RIP: 0010:btrfs_finish_ordered_zoned.cold+0x50/0x52 [btrfs] RSP: 0018:ffffc9002efdbd60 EFLAGS: 00010246 RAX: 000000000000004c RBX: ffff88811923c4e0 RCX: 0000000000000000 RDX: 0000000000000000 RSI: ffffffff827e38b1 RDI: 00000000ffffffff RBP: ffff88810005d000 R08: 00000000ffffdfff R09: ffffffff831051c8 R10: ffffffff83055220 R11: 0000000000000000 R12: ffff8881c2458c00 R13: ffff88811923c540 R14: ffff88811923c5e8 R15: ffff8881c1bd9680 FS: 0000000000000000(0000) GS:ffff88a04acd0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f907c7a918c CR3: 0000000004024000 CR4: 0000000000350ef0 Call Trace: <TASK> ? srso_return_thunk+0x5/0x5f btrfs_finish_ordered_io+0x4a/0x60 [btrfs] btrfs_work_helper+0xf9/0x490 [btrfs] process_one_work+0x204/0x590 ? srso_return_thunk+0x5/0x5f worker_thread+0x1d6/0x3d0 ? __pfx_worker_thread+0x10/0x10 kthread+0x118/0x230 ? __pfx_kthread+0x10/0x10 ret_from_fork+0x205/0x260 ? __pfx_kthread+0x10/0x10 ret_from_fork_asm+0x1a/0x30 </TASK> WB_SYNC_NONE ilə writepages() funksiyasını çağıran A prosesini nəzərdən keçirin. Zonalı rejimdə və ya sıxılmış yazmalar üçün o, delalloc üçün bir neçə folio-nu kilidləyir və onları yazmağa başlayır. Sonuncu kilidlənmiş folio-nu X folio adlandıraq. Tutaq ki, yazı diapazonu yalnız qismən X folio-nu əhatə edir və bəzi səhifələri çirkli saxlayır. A prosesi bio qurarkən btrfs_subpage_set_writeback() funksiyasını çağırır. Bu funksiya çağırışı, ölçüsü 8K və blok ölçüsü 4K olan X folio-nun TOWRITE teqini silir. Vəziyyət belədir: 0 4K 8K |/////|/////| (bayraq: DIRTY, teq: DIRTY) <-----> A prosesi bu diapazonu yazacaq. İndi tutaq ki, B prosesi eyni zamanda WB_SYNC_ALL ilə writepages() funksiyasını çağırır. O, çirkli folio-ları PAGECACHE_TAG_TOWRITE ilə etiketləmək üçün tag_pages_for_writeback() funksiyasını çağırır. X folio hələ də çirkli olduğu üçün etiketlənir. Daha sonra B prosesi filemap_get_folios_tag() vasitəsilə etiketlənmiş folio-ları toplayır və writepages()-dən geri dönməzdən əvvəl X folio-nun yazılmasını gözləməlidir. 0 4K 8K |/////|/////| (bayraq: DIRTY, teq: DIRTY|TOWRITE) Lakin, etiketləmə və toplama arasında A prosesi btrfs_subpage_set_writeback() funksiyasını çağıra və X folio-nun TOWRITE teqini silə bilər. 0 4K 8K | |/////| (bayraq: DIRTY|WRITEBACK, teq: DIRTY) Nəticədə, B prosesi öz paketində X folio-nu görmür və onu gözləmədən geri dönür. Bu, WB_SYNC_ALL sıralama tələbinə ziddir. Bu problem, TOWRITE teqini saxlayan btrfs_subpage_set_writeback_keepwrite() funksiyasından istifadə edilərək həll edilmişdir. Artıq biz teqi yalnız folio təmizləndikdən sonra, xas əməliyyatı vasitəsilə əllə silirik.
Necə düzəltmək olar
- linux linux_kernel6.12.44, 6.16.4 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 5.13 ≤ v < 6.12.44, 6.13 ≤ v < 6.16.4, 6.17 | 6.12.44, 6.16.4 |
Versiyanızı yoxlayın
Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.
Attack Surface Management
Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.