CVE-2026-97941
mm/slab: दौड़ से बचने के लिए __slab_try_return_freelist() में n->list_lock लें
- प्रकाशित
- 25 सित॰ 2026
- अद्यतन
- 19 अक्टू॰ 2026
- सीएनए असाइन करना
- Linux
- साक्ष्य देखे गए
- 4 नव॰ 2026
प्राथमिक सीवीएसएस
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hकम · अगले 30 दिन
- प्रतिशत
- 6.8%
- मॉडल दिनांक
- 4 नव॰ 2026
ईपीएसएस एक सांख्यिकीय अनुमान है, कोई निश्चितता या प्रभाव का माप नहीं। इसे सीवीएसएस, केईवी स्थिति, एक्सपोज़र और अपने वातावरण के साथ मिलाएं।
सारांश
Linux कर्नेल में, निम्नलिखित भेद्यता का समाधान कर दिया गया है: mm/slab: रेस से बचने के लिए __slab_try_return_freelist() में n->list_lock लें। कमिट ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") ने गलत तरीके से मान लिया था कि जब तक slab->freelist NULL है और cmpxchg सफल होता है, तब तक किसी ने slab में कोई ऑब्जेक्ट मुक्त नहीं किया है। हालाँकि, जैसा कि Hyunwoo Kim [1] ने रिपोर्ट किया, अन्य CPU ने slab में कोई ऑब्जेक्ट मुक्त किया हो सकता है, slab को partial सूची में डाला हो सकता है, फिर slab से कोई ऑब्जेक्ट आवंटित किया हो सकता है, और n->list_lock के अंतर्गत सूची से slab को हटाने के बीच में हो सकता है। चूँकि __refill_objects_node() slab को n->list_lock के बाहर pc.slabs पर वापस रखता है, यह slab को उस सूची में तब डाल सकता है जब slab समवर्ती रूप से n->partial से हटाया जा रहा हो। इससे सूची में भ्रष्टाचार हुआ [1]: list_add corruption. next->prev should be prev (ffff888100000248), but was dead000000000122. (next=ffffea000416e410). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 65534 PID: 144 Comm: poc Not tainted 7.2.0-16172-gcf72cbb39da8-dirty #1 PREEMPT(lazy) RIP: 0010:__list_add_valid_or_report+0x80/0xd0 ... Call Trace: alloc_from_new_slab+0x183/0x300 ___slab_alloc+0x31c/0x890 __kmalloc_noprof+0x3d4/0x800 lsm_blob_alloc+0x2d/0x50 security_msg_msg_alloc+0x26/0x90 load_msg+0x1aa/0x210 do_msgsnd+0x91/0x800 do_syscall_64+0x109/0x5d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... Kernel panic - not syncing: Fatal exception यह एक क्लासिक ABA समस्या है जहाँ cmpxchg सफल होता है लेकिन जब से __refill_objects_node() ने slab से freelist लिया है, तब से स्थिति बदल चुकी है। जैसा कि Vlastimil Babka [2] ने उल्लेख किया, एक से अधिक slab लौटाना दुर्लभ होना चाहिए (get_partial_node_bulk() में slab->counters के रेसी रीड के कारण)। इसलिए, अतिरिक्त जटिलता शुरू करने के बजाय, सबसे खराब स्थिति में n->list_lock को दो बार प्राप्त और जारी करें। slab को सीधे partial सूची में लौटाएँ और cmpxchg तथा add_partial() के दौरान n->list_lock को पकड़े रखें। यह कमिट ba7425312607 [3] के प्रारंभिक संस्करण के समान है। चूँकि सूची में हेरफेर n->list_lock द्वारा क्रमबद्ध किया जाता है, यह रेस से बचने के लिए पर्याप्त है। साथ ही, अब जब स्थिति unlikely है, तो unlikely() संकेत वापस लाएँ।
स्रोत
CVE-2026-97941 के आधिकारिक PoC का ARM64 Android पोर्ट, जो एक SLAB सबसिस्टम कर्नेल भेद्यता है, जिसमें 7.0/7.2 कर्नेल के लिए पोर्ट किया गया रेस टाइमिंग और हीप लेआउट शामिल है।
जिम्मेदारीपूर्ण उपयोग
भेद्यता जानकारी का उपयोग केवल उन प्रणालियों पर करें जिनके मालिक आप हैं या परीक्षण के लिए अधिकृत हैं। किटप्लॉइट सार्वजनिक अनुसंधान मेटाडेटा से लिंक करता है और शोषण कोड या दुर्भावनापूर्ण पेलोड को संग्रहीत नहीं करता है।