CVE-2026-98163
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
W jądrze Linuksa usunięto następującą lukę:
cgroup: Unikaj powtarzania umierających zadań przy zerowym przeliczeniu
Zatwierdzenie 260fbcb92bbea („cgroup: Przenieś czyszczenie umierających_zadań z
cgroup_task_release() do cgroup_task_free()”) przedłużyło żywotność
zadania na liście umiera_tasks.
Iteratory mają możliwość przejścia przez umieranie_zadania z powodu
jednak umierający liderzy grup wątków lub jawne CSS_TASK_ITER_WITH_DEAD
oczekiwano, że tego typu zadania mogą uzyskać nową referencję (tj
możliwe przed cgroup_task_release()/put_task_struct_rcu_user()).
Zadania po cgroup_task_release() i przed cgroup_task_free()
podlegają rasie, kiedy mogą mieć lub nie ->liczba zastosowań > 0.
Okno wyścigu znajduje się pomiędzy wywołaniami css_task_iter_next().
kiedy zostanie wydany css_set_lock i możemy dojść do nowego ->task_pos.
Iterator nie powinien próbować wskrzeszać zadań, których liczba ->użycia jest zliczana
spadła do zera. (Kiedy tak się stanie, __put_task_struct_rcu_cb() jest
już nieuchronne i można by zastosować zwróconą strukturę zadania
po darmowym.)
Jeśli chodzi o rozwiązanie, nie możemy po prostu sprawdzić sygnału->licznika aktywności zadania
na liście umierających, bo to nie wyróżni zwykłych czekających zombie
do zebrania z pozostałych zadań RCU, które zostaną uwolnione.
Dlatego dodaj dodatkową kontrolę, aby wykluczyć zadania ->usage==0 z dowolnego
iteracja.
Powtórzenie: pętla w css_task_iter_advance() nie uwzględnia ->użycia
count, więc dodaj nową pętlę do css_task_iter_next(), aby pominąć nieużywane zadania
na liście umierających.
Przybliżona ilustracja możliwej rasy
R (czytnik cgroup.procs) T (wątek) L (lider grupy)
---------------------------------- -------------------------------- --------------------------------
L wychodzi, sygnał->na żywo > 0
cgroup_task_dead(L)
css_set_skip_task_iters() // pomija tylko zadania cset->
list_add_tail(&L->cg_list, &cset->dying_tasks)
css_task_iter_next()
weź css_set_lock
css_task_iter_advance()
lider && sygnał->na żywo!= 0
=> it->task_pos = &L->cg_list
zwolnij css_set_lock
T. wychodzi
--sygnał->na żywo == 0
cgroup_task_dead(T) // css_set_lock
wydanie_zadania(T)
cgroup_task_release(T)
release_task(L) // zap_leader
cgroup_task_release(L)
put_task_struct_rcu_user(L)
...RCU...
put_task_struct(L)
L->użycie = 0
/* L nadal zajmuje się umieraniem_zadań */
...RCU...
__put_task_struct(L)
css_task_iter_next() // kolejna iteracja
weź css_set_lock
it->task_pos = &L->cg_list
get_task_struct(L)
=> dodanie na 0
upuść css_set_lock
cgroup_task_free(L)
css_set_skip_task_iters() // pominięcie umierania następuje za późno
wolne_zadanie(L)
cgroup_procs_show()
zadanie_pid_vnr(L)
>_ 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