Odebrany

CVE-2026-98256

opublikowano:
modyfikacja:
Ocena CVSS
n/a
Brak oceny

>_ Opis

Tłumaczenie automatyczne – może zawierać nieścisłości.

W jądrze Linuksa usunięto następującą lukę:

sygnał: Zapobiegaj wyścigowi exec().

Hyunwoo zdebugował następującą ikonę KASAN UAF:

BŁĄD: KASAN: użycie płyty po zwolnieniu w __send_signal_locked+0xb27/0xba0
Zapisz rozmiar 8 pod adresem ffff888007ed80c8 w zadaniu poc/79
...
Zadzwoń do śledzenia:
__send_signal_locked+0xb27/0xba0
do_send_sig_info+0xa7/0x160
do_send_specific+0x76/0xa0
__x64_sys_tgkill+0x193/0x270
...
Przydzielone przez zadanie 80:
do_timer_create+0x1a4/0x1030
__x64_sys_timer_create+0x145/0x190
...
Uwolniony przez zadanie 12:
kmem_cache_free_bulk+0x1f8/0x4a0
kvfree_rcu_bulk+0x14f/0x1c0
kfree_rcu_work+0x128/0x1a0
...
Ostatni potencjalnie powiązany utwór:
kvfree_call_rcu+0x39/0x390
__flush_timer_signals+0x211/0x320
Flush_timer_signals+0x47/0x90
Begin_new_exec+0xa6b/0x28c0

Okazało się, że dzieje się tak w przypadku exec() niebędącego liderem, jakim jest Hyunwoo
wyjaśnione:

de_thread() wywołuje funkcję Exchange_tids() przed release_task(lider), więc
Identyfikator struktury przechowywany przez licznik czasu SIGEV_THREAD_ID utworzony na podstawie tid lidera
teraz wskazuje na wątek, który wywołał execve(). pid_task() zwraca to
thread i lock_task_sighand() na nim powiedzie się.

Jeśli sygnał timera zostanie zablokowany, jego kolejka pozostaje w kolejce lidera
zadanie::oczekujące. Następny wygaśnięcie tego licznika czasu może następnie nastąpić
release_task() opróżnia kolejkę.

posixtimer_send_sigqueue() sprawdza, czy kolejka nie znajduje się już w kolejce
za pomocą zwykłej funkcji list_empty(), która czyta tylko list_head::next.
list_del_init() nie jest atomowa i INIT_LIST_HEAD() przechowuje list_head::next
przed list_head::prev, więc sprawdzenie może przejść pomiędzy. lista_add_tail()
kolejkuje wpis w task::pending aktywnego wątku i
list_head::prev przechowuje z koloru, a następnie zastępuje list_head::prev
link, który właśnie ustawił list_add_tail().

__flush_timer_signals() również tego nie cofa. Z list_head::prev
wskazując na sam wpis, jego list_del_init() przechowuje tylko to samo
wartości ponownie, dzięki czemu wpis nie zostanie usunięty z listy. To nadal tam jest
po odrzuceniu ostatniej wartości zadanej i zwolnieniu timera przez RCU, oraz
list_add_tail() późniejszej tgkill() następuje po funkcji list_head::prev do
zwolniony timer.

Ten problem pojawił się wraz z niedawnym zatwierdzeniem, które przesunęło spłukiwanie sigqueue
z obszaru trzymanego przez zamek westchnienia.

Hyonwoo zaproponował rozwiązanie tego problemu za pomocą list_del_init_careful(), ale to nie to
tylko dokumenty dotyczące problemu. Po kilku dyskusjach i różnych próbach
aby go rozwiązać, Eric zauważył, że nie ma powodu do spłukiwania
task::pending późno w release_task() i należy to zrobić w
exit_signals() już.

Ponieważ nic nie jest w stanie zebrać i dostarczyć sygnałów, które czekają w kolejce do umierania
oczekującego zadania w kolejce, nie ma powodu go dalej opóźniać.

Należy jednak zadbać o to, aby po tym czasie nie można było do niego kolejkować żadnych sygnałów
punkt. exit_signals() ustawia PF_EXITING w task::flags, którego można użyć jako
wskaźnik tego.

Wyleczyć to:

- Zapobieganie kolejkowaniu sygnałów dla prywatnych sygnałów zadań (PIDTYPE_PID), gdy
zadanie ma ustawione PF_EXITING w __send_signal_locked() i in
posixtimer_send_sigqueue().

- Ochrona odblokowanego ustawienia PF_EXITING w exit_signals() dla
grupa zadań pusta, a skrzynka wyjścia grupy z blokadą westchnienia

- Zadanie płukania::oczekujące sygnały właśnie tam.

Zoptymalizuj to, przenosząc całą oczekującą listę do nagłówka listy na stosie
pod zamkiem westchnieniowym i uwolnij sygnały bez trzymania zamka.

Odbyło się sporo dyskusji na temat spłukiwania bez zamka i
Przypadek wykonawczy niebędący liderem w systemach słabo uporządkowanych. Problem w tym, że trzeci
strona, która próbuje wysłać sygnał timera posix, opiera się na wyszukiwaniu PID
znajdź docelowe zadanie, a to wyszukiwanie może skutkować pojawieniem się nowego lidera, kiedy
sygnał był pierwotnie skierowany do starego przywódcy. W przypadku, gdy
sygnał został ustawiony w kolejce na starego lidera, po czym kolor bezzamkowy podniósł a
zaniepokojenie następującą sytuacją:

stary_lider nowy_lider strona trzecia

Odp.: Flush_list() // list_del_in
---obcięty---

>_ 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