CVE-2026-97941
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
mm/slab: weź n->list_lock w __slab_try_return_freelist(), aby uniknąć wyścigu
Zatwierdź ba7425312607 („mm, płyta: dodaj optymistycznie
__slab_try_return_freelist()”) błędnie założono, że nikt nie został zwolniony
obiekt do płyty, o ile płyta->freelist ma wartość NULL i cmpxchg
udaje się.
Jednakże, jak donosi Hyunwoo Kim [1], inne procesory mogły zostać zwolnione
obiekt do płyty, następnie wstaw płytę do listy częściowej
przydzielił obiekt z płyty i był w trakcie usuwania
płytę z listy pod n->list_lock.
Ponieważ __refill_objects_node() umieszcza płytę z powrotem na pc.slabs
poza n->list_lock, może wstawić płytę do tej listy podczas
płyta jest jednocześnie usuwana z n->częściowa.
Doprowadziło to do uszkodzenia listy [1]:
list_add korupcja. następny->poprzedni powinien być poprzedni
(ffff888100000248), ale nie żył000000000122.
(następny=ffffea000416e410).
BŁĄD jądra w lib/list_debug.c:29!
Ups: nieprawidłowy kod operacji: 0000 [#1] SMP NOPTI
Procesor: 1 UID: 65534 PID: 144 Comm: poc Nieskażone
7.2.0-16172-gcf72cbb39da8-brudny #1 PREEMPT (leniwy)
RIP: 0010:__list_add_valid_or_report+0x80/0xd0
...
Zadzwoń do śledzenia:
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
obciążenie_msg+0x1aa/0x210
do_msgsnd+0x91/0x800
do_syscall_64+0x109/0x5d0
wpis_SYSCALL_64_after_hwframe+0x77/0x7f
...
Panika jądra – brak synchronizacji: wyjątek krytyczny
Jest to klasyczny problem ABA, w którym cmpxchg kończy się sukcesem, ale stan tak
zmienione, ponieważ __refill_objects_node() pobrało darmową listę z płyty.
Jak wspomniał Vlastimil Babka [2], zwrot więcej niż powinien być rzadkością
jedna płyta (ze względu na ostry odczyt płyty->liczniki w
get_partial_node_bulk()). Dlatego zamiast wprowadzać dodatkowe
złożoności, w najgorszym przypadku uzyskaj i zwolnij n->list_lock dwa razy.
Wróć płytę bezpośrednio do listy częściowej i przytrzymaj n->list_lock
poprzez cmpxchg i add_partial(). To jest podobne do początkowego
wersja zatwierdzenia ba7425312607 [3]. To wystarczy, aby uniknąć wyścigu jako
manipulacja listą jest serializowana przez n->list_lock. Będąc przy tym,
przywróć nieprawdopodobną() wskazówkę teraz, gdy warunek jest mało prawdopodobny.
>_ Referencje
Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.
This product uses the NVD API but is not endorsed or certified by the NVD.
Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.
CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org