Estamos em 2025 e, enquanto as equipes de segurança estão reforçando seus perímetros, as listas de discussão sobre o kernel do Linux estão agitadas com uma nova ameaça. O Grupo de Análise de Ameaças (TAG) do Google confirmou o armamento de CVE-2025-38352.
Esse não é um bug de corrupção de memória comum. É um bug sofisticado, dependente do tempo Condição de corrida que reside no subsistema de temporizador da CPU POSIX do kernel do Linux. Com uma pontuação CVSS de 7,4, ela pode parecer gerenciável à primeira vista, mas não se deixe enganar pela pontuação. Nas mãos de fornecedores comerciais de spyware, essa vulnerabilidade já foi transformada em uma arma para obter resultados confiáveis. Escalonamento de privilégios locais (LPE) em dispositivos Android totalmente corrigidos, contornando mitigações modernas como KASLR e PAN.
Para o engenheiro de segurança de elite, o CVE-2025-38352 representa o auge da exploração "Race-to-Use-After-Free". Ele explora a lacuna microscópica entre um processo que entra em um estado "Zumbi" e o kernel que limpa seus temporizadores. Este artigo abandona os resumos de alto nível para realizar uma dissecação cirúrgica de kernel/time/posix-cpu-timers.cA análise temporal orientada por IA é a única maneira de detectar o que os auditores humanos deixaram passar.
A falha fatal do kernel: uma dança de spinlock quebrada
Para entender o CVE-2025-38352, precisamos analisar como o kernel do Linux lida com a concorrência durante o encerramento do processo. A vulnerabilidade decorre de uma violação de atomicidade na forma como o kernel processa os temporizadores da CPU expirados enquanto um thread está simultaneamente tentando excluí-los.
O caminho do código vulnerável
A falha está no handle_posix_cpu_timers() função. Essa função é responsável por iterar em uma lista de temporizadores ativos e disparar os que expiraram. Para realizar essa iteração, ela deve manter o suspiro->siglock.
No entanto, antes da correção, a lógica continha uma sequência fatal:
- Aquisição de travas: O kernel adquire
suspiro->siglockpara percorrer a lista de cronômetros. - A queda: Para lidar com um recurso de expiração específico (especificamente
CPUCLOCK_PERTHREAD), o código resumidamente deixa cair o cadeado para executar uma operação de verificação ou reenfileiramento. - O uso: Ele readquire o bloqueio e passa a desreferenciar o objeto do cronômetro.
A janela de corrida
É dentro dessa janela microscópica, onde a fechadura é solta, que o invasor ataca.
Um thread simultâneo (Thread B) emite uma syscall timer_delete(). Como o bloqueio está livre, o Thread B o adquire com êxito, remove o timer da lista e libera a memória por meio do kfree_rcu ou da desalocação de slab.
Quando o Thread A (o contexto da vítima) readquire o bloqueio, ele mantém um ponteiro para um posix_cputimer struct que tecnicamente não existe mais. Ele continua a gravar nessa memória (por exemplo, atualizando o tempo de expiração), acionando um Use-After-Free (UAF) escrever.

Armando o zumbi: Os primitivos de exploração
A exploração de uma condição de corrida do kernel é frequentemente comparada a ganhar na loteria. No entanto, os desenvolvedores de exploits avançados não jogam dados; eles manipulam o jogo. No contexto do CVE-2025-38352, os invasores manipulam o jogo usando Processos de zumbis.
1. Ampliação da janela (a técnica de "zumbificação")
A janela de corrida padrão pode ter apenas alguns nanossegundos de largura. Para tornar a exploração confiável (taxa de sucesso de 90%+), os invasores utilizam o estado de saída do processo.
Ao gerar um processo filho e fazer com que ele saia - mas deliberadamente não colhendo-o (via waitpid)-o processo entra no EXIT_ZOMBIE estado. Nesse estado, a estrutura da tarefa permanece na memória, mas a lógica de limpeza está pendente. Os invasores descobriram que o acionamento de operações de timer em um processo Zombie força o kernel a um caminho de código mais lento e mais complexo dentro do posix_cpu_timer_deldilatando artificialmente a janela de corrida de nanossegundos para microssegundos.
2. Feng Shui do SLUB (pulverização de pilhas)
Quando o UAF é acionado, o kernel grava dados em um slot de memória liberado. Se esse slot estiver vazio, o kernel será bloqueado (DoS). Para obter o Root, o invasor deve substituir o objeto de temporizador liberado por uma carga útil.
Os atacantes aproveitam o O alocador do SLUB comportamento previsível (Last-In, First-Out).
- Grátis: Acione a corrida para libertar o
cronômetroestrutura. - Spray: Inundar imediatamente o heap do kernel com objetos controlados pelo usuário exatamente do mesmo tamanho (por exemplo, usando
sendmsgdados auxiliares ouchave_serialobjetos). - Corrupção: O kernel, pensando que está atualizando o timer, grava no objeto do invasor. Se o invasor pulverizar uma estrutura que contenha um ponteiro de função (por exemplo, um
tty_structoufile_operations), o kernel sobrescreve esse ponteiro. - Execução: Quando o invasor invoca o objeto pulverizado (por exemplo, fechando o arquivo), o kernel salta para o endereço sobrescrito -> Cadeia ROP -> Raiz.

Além do Syzkaller: Por que o Fuzzing tradicional falhou
O CVE-2025-38352 não foi detectado por fuzzers automatizados, como o Syzkaller do Google, durante anos. Por quê?
A fuzzing tradicional guiada por cobertura é probabilístico. Ele executa syscalls aleatórias no kernel na esperança de causar falhas.
- Ele não entende Cronograma.
- Ele não entende Dependências de estado (por exemplo, "O thread A deve estar saindo enquanto o thread B exclui um timer").
A probabilidade estatística de um fuzzer cego atingir essa condição de corrida específica, com o processo na exata ZOMBIE é astronomicamente baixo.
A solução de IA: Análise temporal da Penligent
Esse fracasso das ferramentas tradicionais destaca a necessidade de Análise lógica orientada por IA. É aqui que Penligent.ai muda o paradigma de "Fuzzing" para "Reasoning".
A Penligent utiliza um sistema especializado de Agente de IA com reconhecimento de tempo projetado para a caça de bugs de simultaneidade:
1. Reconhecimento de padrões de simultaneidade
Em vez de entradas aleatórias, o modelo da Penligent analisa a AST (Árvore de Sintaxe Abstrata) do Kernel Source. Ele identifica "Pares Perigosos" - chamadas de sistema que modificam o mesmo recurso compartilhado (neste caso, posix_cputimer), mas seguem caminhos de bloqueio diferentes. Ele sinalizou timer_delete e handle_posix_cpu_timers como um alvo de colisão de alta probabilidade.
2. Dilatação da janela de corrida via IA
A Penligent não se limita a executar syscalls; ela as orquestra. Reconhecendo a necessidade de ampliar a janela de corrida, a IA inferiu automaticamente o EXIT_ZOMBIE analisando relatórios anteriores de vulnerabilidade "Ref-Count". Ele gerou uma prova de conceito que paralisou programaticamente a CPU (usando rendimento do cronograma ou barreiras de memória extensas) para garantir a colisão.
Para o engenheiro de segurança, isso significa que a Penligent vai além da comunicação de "possíveis bugs" e passa a fornecer exploits verificados e armados que demonstram o verdadeiro perfil de risco do código.
Remediação e detecção da equipe azul
A correção, incorporada ao Kernel do Linux no final de 2025, envolve uma verificação lógica em vez de apenas um bloqueio.
A correção:
Em run_posix_cpu_timers(), o kernel agora verifica explicitamente se (tsk->exit_state). Se a tarefa já estiver morta ou morrendo, ele aborta o processamento do temporizador imediatamente. Isso efetivamente remove a variável "Zombie" da equação.
Estratégias de detecção (EDR/Syslog):
As Blue Teams devem procurar os seguintes indicadores de comprometimento (IoC) em servidores Linux/Android:
- Churn de temporizador de alta frequência: Um processo que cria e exclui rapidamente milhares de temporizadores POSIX por segundo.
- Zombie Floods (Inundações de zumbis): Um acúmulo incomum de
Zprocessos de estado que são rapidamente gerados e não colhidos. - Kernel Taint:
dmesgregistros que mostram "Falhas de proteção geral" ou "Corrupção de laje" emkmalloc-192(ou o tamanho específico da placa para temporizadores em seu arco).
Conclusão
O CVE-2025-38352 serve como um lembrete festivo de que o código legado é um campo minado. O código do temporizador POSIX foi escrito há décadas, mas continha uma falha latente que exigia o complexo cenário de memória de 2025 para ser transformado em uma arma.
Para os engenheiros de segurança mais dedicados, a lição é clara: o futuro da pesquisa de vulnerabilidades não se resume a encontrar simples estouros de buffer. Trata-se de compreender a quarta dimensão do código.Tempo. Enquanto os kernels empregarem mecanismos de bloqueio complexos, as condições de corrida continuarão sendo as "joias da coroa" da exploração.

