CVE-2026-63813
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: Revert "f2fs: remove non-uptodate folio from the page cache in move_data_block" Bu işlem, 9609dd704725a40cd63d915f2ab6c44248a44598 numaralı commit işlemini geri alır. Özellikle f2fs bölümü neredeyse tamamen dolduğunda kernel panic raporları gelmeye devam etmektedir. Yapılan incelemeler sonucunda, bir f2fs sayfasının LRU listesinden silinmeden buddy ayırıcıya serbest bırakıldığının tespit edilmiş ve temel nedenin bu commit ile ortaya çıkan [2]'deki yarış durumu (race condition) olduğu belirlenmiştir. Bu senaryoda üç yarış süreci bulunmaktadır; ana faaliyetleri aşağıda belirtilmiştir: move_data_block() fonksiyonundaki değiştirilen kod, GC yolunun folio_end_dropbehind() aracılığıyla kuyruk sonu foliosunu sayfa önbelleğinden tahliye etmesine izin verir. folio_unmap_invalidate(), foliosunu mapping->i_pages üzerinden kaldırdığında, folio içindeki tüm sayfalar için sayfa önbelleği referansları düşürülür. Folio daha sonra yalnızca geçici harici referanslarla hayatta kalır; bu durum, alt sayfalarının artık sayfa önbelleği referanslarıyla korunmadığı bir folio üzerinde daha sonra bölme işlemi yapılmasına olanak tanır. Sayfa önbelleği referansları kaybolduktan sonra, split_folio_to_order() büyük foliosunu tekil sayfalara bölebilir ve sonuçlanan alt sayfaları tekrar LRU'ya yerleştirebilir. EOF ötesindeki kuyruk sayfaları için split işlemi bunları sayfa önbelleğinden kaldırır ve sayfa önbelleği referanslarını düşürür. Bir kuyruk sayfası, yalnızca bölme işlemini çağıranın geçici referansını tutarken PG_lru biti set edilmiş halde LRU'da kalabilir. free_folio_and_swap_cache() bu son referansı düşürdüğünde, sayfa nihai folio_put() serbest bırakma yoluna girer. Paralelde, folio_isolate_lru() aynı kuyruk sayfasını sıfır olmayan bir refcount ve set edilmiş PG_lru ile gözlemleyebilir. Kendi referansını almadan önce PG_lru bitini temizler. Eğer bu işlem, bölme yolundan gelen nihai folio_put() ile yarışırsa, __folio_put() PG_lru'nun zaten temizlendiğini görür ve lruvec_del_folio() işlemini atlar. Sayfa, LRU bağlantıları hala LRU listesinde mevcutken ayırıcıya geri serbest bırakılır. Komşu bir sayfa üzerindeki sonraki bir LRU işlemi bayat bağlantıyı tespit eder ve liste bozulmasını bildirir. [1] [ 22.486082] list_del corruption. next->prev should be fffffffec10e0ac8, but was dead000000000122. (next=fffffffec10e0a88) [ 22.486130] ------------[ cut here ]------------ [ 22.486134] kernel BUG at lib/list_debug.c:67! [ 22.486141] Internal error: Oops - BUG: 00000000f2000800 [#1] SMP [ 22.488502] Tainted: [W]=WARN, [O]=OOT_MODULE [ 22.488506] Hardware name: Spreadtrum UMS9230 1H10 SoC (DT) [ 22.488511] pstate: 604000c5 (nZCv daIF +PAN -UAO -TCO -DIT -SSBS BTYPE=--) [ 22.488517] pc : __list_del_entry_valid_or_report+0x14c/0x154 [ 22.488531] lr : __list_del_entry_valid_or_report+0x14c/0x154 [ 22.488539] sp : ffffffc08006b830 [ 22.488542] x29: ffffffc08006b868 x28: 0000000000003020 x27: 0000000000000000 [ 22.488553] x26: 0000000000000000 x25: 0000000000000004 x24: fffffffec10e0ac0 [ 22.488564] x23: 00000000000000e8 x22: 0000000000000024 x21: dead000000000122 [ 22.488574] x20: fffffffec10e0a88 x19: fffffffec10e0ac8 x18: ffffffc080061060 [ 22.488585] x17: 20747562202c3863 x16: 6130653031636566 x15: 0000000000000058 [ 22.488595] x14: 0000000000000004 x13: ffffff80f91e0000 x12: 0000000000000003 [ 22.488605] x11: 0000000000000003 x10: 0000000000000001 x9 : ffe85721f0e25f00 [ 22.488615] x8 : ffe85721f0e25f00 x7 : 0000000000000000 x6 : 6c65645f7473696c [ 22.488625] x5 : ffffffed39b23026 x4 : 0000000000000000 x3 : 0000000000000010 [ 22.488636] x2 : 0000000000000000 x1 : 0000000000000000 x0 : 000000000000006d [ 22.488647] Call trace: [ 22.488651] __list_del_entry_valid_or_report+0x14c/0x154 (P) [ 22.488661] __folio_put+0x2bc/0x434 [ 22.488670] folio_put+0x28/0x58 [ 22.488678] do_garbage_collect+0x1a34/0x2584 [ 22.488689] f2fs_gc+0x230/0x9b4 [ 22.488697] f2fs_fallocate+0xb90/0xdf4 [ 22.488706] vfs_fallocate+0x1b4/0x2bc [ 22.488716] __arm64_sys_fallocate+0x44/0x78 [ 22.488725] invoke_syscall+0x58/0xe4 [ 22.488732] do_el0_svc+0x48/0xdc [ 22.488739] el0 ---truncated---
Nasıl düzeltilir
- Linux Linux1991d49433e90b2202de2fe90be3c24161873d7c, 6e035dae44154af4dd7bdb8ef7a1118c0b5f17b6, ccaba785821970f422c47770331c7e3271763f17 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | 5a4d3968cf820686400fc757a4512dcaddd84846 ≤ v < 1991d49433e90b2202de2fe90be3c24161873d7c, 9609dd704725a40cd63d915f2ab6c44248a44598 ≤ v < 6e035dae44154af4dd7bdb8ef7a1118c0b5f17b6, 9609dd704725a40cd63d915f2ab6c44248a44598 ≤ v < ccaba785821970f422c47770331c7e3271763f17, 7.0 | 1991d49433e90b2202de2fe90be3c24161873d7c, 6e035dae44154af4dd7bdb8ef7a1118c0b5f17b6, ccaba785821970f422c47770331c7e3271763f17 |
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.
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.