No kernel Linux, a seguinte vulnerabilidade foi resolvida. posix- cpu- timers: Prevenir UAF causada por não- lider exec() raça Wongi e Jungwoo descodificaram e reportaram uma raça relacionada com exec() não líder que pode resultar em um UAF: sys_timer_delete() exec() posix_cpu_timer_del() // Observa old leader p = pid_task(pid, pid_type); de_thread() switch_leader(); release_task(old_leader) __exit_signal(old_leader) suspirand = lock(old_leader, shiland); posix_cpu_timers*_exit(); shiland = lock_task_sighand(p) unhash_task(old_leader); sh = lock(p, shilling) old_leader->sighand = NULL; over(sighand); (p->sighand == NULL) destrave(sh) devolva NULL;.
// Retorna sem ação if(!sighand) retorna 0; free_posix_ timer(). Isto é "innocuo" a menos que o temporizador excluído tenha sido armado e encoberto no sinal p-> porque no exec() um temporizador alvo do TGID é herdado. Como sys_timer_delete() libertou o objeto posix temporizador subjacente run_posix_cpu_timers() ou qualquer operação de adicionar/ eliminar temporizadores relacionada a outros temporizadores irá acessar o nó de temporizador do objeto livre, o que resulta em um UAF. Há um problema semelhante vs. posix_cpu_timer_set(). Para os temporizadores posix regulares, ele retorna transitivamente -ESRCH ao espaço do usuário, mas para o caso de uso no do_cpu_nanosleep() é o mesmo UAF apenas que o k_ imimer é alocado na pilha.
Também posix_cpu_timer_rearm() não consegue rearm o temporizador, o que significa que ele pára de expirar. Enquanto debateva soluções Frederic apontou outro problema. posix_ cpu_ timer_ del( tmr) __ exit_ signal( p) posix_ cpu_ timers*_ exit( p); unhash_ task( p); p-> sighand = NULL; sh = lock_ task_ sighand ( p) suspirando = p- > sighand; se (! sighand) devolve NULL; lock ( sighand); if (!sh) WARN_ON_ONCE( timer_queued( tmr)). Em arquiteturas de forma fraca, não é garantido que posix_cpu_timer_del() irá observar as lojas em posix_cpu_timers*_exit() quando p->sighand é observado como NULL, o que significa que o WARN() pode ser um falso positivo.
Resolva estes problemas por. 1 ) Mudando a loja em __exit_signal() para smp_store_release(). 2 ) Adicionando um smp_ aquire__after_ctrl_dep() no caminho de lock_task_sighand() para!sighand. 3 ) Criando uma função de ajuda para procurar a tarefa e bloquear o suspirado que não retorna quando suspirado == NULL. Em vez disso, retorna a busca pela tarefa e só se falhar, ela desiste.
4 ) Usando aquele ajudante nas três funções afetadas. # 1 /# 2 garante que o lado do leitor que observa o suspirado e == NULL também observa todas as lojas anteriores, ou seja, as lojas em posix_ cpu_ timers*_ exit() e as que estão em unhash_ task(). # 3 garante que a situação exec() não- líder acima descrita seja tratada com graça. Quando a busca pela tarefa retorna o antigo líder, mas suspiro e == NULL, então ele retorna. No caso do exec() não líder, a busca subsequente da tarefa irá observar o novo líder devido ao # 1 /# 2. Em cenários normais de saída() a procura subsequente falha.
Quando a procura por tarefa falha, a função também verifica se o temporizador ainda está encoberto e emite um aviso se esse for o caso. Infelizmente, não há nada que possa ser feito sobre isso, mas como a tarefa já não está mais visível, o temporizador não deve mais ser acessado. Esta verificação também requer ordenação de memória, que não é fornecida quando a primeira procura falha. Para conseguir que a verificação seja precedida por um smp_rmb() que se acopla com o smp_wmb() em write_seqlock() em __exit_signal(). Isso garante que as lojas em posix_cpu_timers*_exit() sejam visíveis. O histórico do problema exec() não líder remonta aos primeiros dias dos temporizadores posix da CPU, que armazenaram um ponteiro para a tarefa do líder do grupo no temporizador. Isso obviamente falha quando um exec() não líder muda o líder. commit e 0 a 70217107 e ("posix- cpu- timers: arranjo para suprimir os problemas com o mt exec") adicionou uma arranjo temporário para isso em 2010 que surv --- truncado-- Registro de aconselhamento: GHSA- 78 Ph- mc 3 q-. 52 vv. Identificadores relacionados: CVE- 2026 - 64560.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 29 T 18: 31: 40.000 Z e lista a sua última modificação como 2026 - 07 - 30 T 12: 32: 17.000 Z. Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H.
Software afetado: o registro de aconselhamento não fornece um pacote normalizado ou faixa de versões. Classificação e evidência: nenhum identificador CWE está listado. O registro contém 9 suporte de referências nestes tipos: AVISO, WEB.