Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
cve-2026-98260-uaf — Pesquisa de exploit para CVE-2026-98260 (UAF em exec de posix-cpu-timers): S9280 Android 14 GKI 6.1 — gatilho de UAF + primitiva de escrita zero + SELinux Permissive. Documento de transferência em HANDOFF.md | Kitploit
Ferramentas/GitHubGitHub/nanoturtle1145/cve-2026-98260-uaf
Segurança AndroidEscalada de PrivilégiosForensia de MemóriaAnálise de VulnerabilidadesExploraçãoPapers e PesquisaExploração de Binários
GitHub

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
nanoturtle1145/cve-2026-98260-uaf

cve-2026-98260-uaf

Pesquisa de exploit para CVE-2026-98260 (UAF em exec de posix-cpu-timers): S9280 Android 14 GKI 6.1 — gatilho de UAF + primitiva de escrita zero + SELinux Permissive. Documento de transferência em HANDOFF.md

Ver Repositório
33há 2 diasAinda não revisado

CVE-2026-98260 — PoC somente de disparo (UAF em posix-cpu-timers)

Vulnerabilidade

exec: Cleanup POSIX timers right after de_thread() (autor Hyunwoo Kim, upstream em 2026-09-11, Fixes: 55e8c8eb2c7b = a partir da 5.7).

Um timer CLOCK_THREAD_CPUTIME_ID está anexado à thread não-leader E; em execve(), após de_thread() trocar o tid, o timer falha ao localizar a task pelo PID e o nó permanece no posix_cputimers de E. Se mmap_read_lock_killable() de exec_mmap() retornar -EINTR (exec falha e o código de limpeza vem mais adiante), do_exit() → exit_itimers() libera o k_itimer mas o nó não é removido; quando o processo pai o recolhe via wait4(), cleanup_timerqueue() → timerqueue_del() opera sobre um objeto já liberado → UAF.

Estado do patch (verificado em 2026-10-27 em fs/exec.c de cada branch estável)

Branchposixtimer_execEstado
linux-6.1.yausentenão corrigido
linux-5.15.yausentenão corrigido
linux-6.6.ypresentecorrigido (6.6.158+)
linux-6.12.ypresentecorrigido (6.12.112+)

→ Os alvos deste projeto (linhas 5.15 / 6.1, e 6.6 anterior à 6.6.158) estão todos na faixa afetada.

Por que este disparo é "determinístico" e não uma aposta de timing

  1. Janela longa de write lock: fragment_vmas() usa memfd + MAP_FIXED para dividir o espaço de endereçamento em --vmas (padrão 50000) VMAs não mescláveis (o vm_pgoff de cada uma é 0, e pgoffs de endereços adjacentes não são contíguos → vma_merge falha). A thread locker repete mprotect sobre todo o trecho, e percorrer dezenas de milhares de VMAs mantém o write lock de mmap retido por milissegundos.
  2. Ponto de sincronização preciso: o killer usa o retorno ESRCH de tgkill(tgid, tid antigo, 0) para determinar que "de_thread() concluiu a troca de tid", e só então envia SIGKILL.
  3. A thread vítima necessariamente bloqueia em mmap_read_lock_killable() no ponto de exec_mmap() (o read lock é barrado pelo write lock), e o SIGKILL chega microssegundos depois → essa chamada retorna -EINTR → exec falha. A janela (ms) ≫ o tempo de reação (µs), portanto não depende de sorte.

⚠️ Atenção à distinção: o disparo é determinístico; a passagem do UAF para escrita arbitrária/alteração de cred depende da orquestração de reutilização do slab de posix_timers_cache (order, objects/slab, CPU partial, pertencimento a memcg), o que é engenharia de heap mensurável e iterável, não uma corrida.

Compilação

export ANDROID_NDK_HOME=/home/nt/项目/samsung_root_research/06_工具链/android-ndk-r29
make            # 产物 trigger(aarch64 / Android 21+ / 仅依赖 libc、libdl)

Etapas de teste

adb push trigger /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/trigger"
adb shell "/data/local/tmp/trigger --check"        # 先看环境
adb shell "/data/local/tmp/trigger; echo exit=\$?"

Sinais de sucesso (basta um dos três):

  • Após imprimir [*] 开始触发, o dispositivo reinicia/tela fica preta (mais direto quando panic_on_oops=1)
  • O processo é morto por sinal (exit=137/139), e o sistema continua vivo depois
  • dmesg (requer root) mostra a pilha de chamadas de cleanup_timerqueue / timerqueue_del / rb_erase / rb_next

Em caso de falha (não disparou), o programa tenta novamente sozinho --attempts vezes e imprime o resultado de wait4 de cada rodada, por fim sugere ajuste de parâmetros: --vmas 120000 --lockers 4 --cpu 0.

Limitações conhecidas

  • O disparo bem-sucedido quase certamente fará o dispositivo reiniciar (essa é a evidência de "sucesso"); antes do teste, confirme que não há trabalho não salvo.
  • O panic_on_oops da Samsung pode ser 0: nesse caso a tarefa é morta e o kernel continua rodando com a rbtree corrompida; recomenda-se executar 2~3 vezes seguidas para observar se ocorre um panic subsequente.
  • Este PoC não contém código de escalada de privilégios (não faz reclaim, não toca em cred), servindo apenas para verificar alcançabilidade e determinismo.

Referências

  • Patch upstream https://github.com/torvalds/linux/commit/acb03d3881818581052924a9bbbe92b8741ed448
  • Cadeia completa do Honor MagicPad3 Pro (6.12.38, incluindo uid-0 e boot KSU) https://github.com/woshigenm/CVE-2026-98260
  • Notas de port para vivo/iQOO 6.6.127 (orquestração de reclaim, parâmetros SLUB) https://github.com/janewas/cve-2026-98260-vivo-gki-research

Registro de testes reais (SM-S9280 / e3q / 6.1.162 / Android 17 / patch de segurança 2026-09-05)

Ambiente de teste: S9280ZHU6EZIF, kernel 6.1.162-android14-11-34343818-abS9280ZHU6EZIF (build 2026-09-20), sem root, domínio shell (uid 2000), SELinux Enforcing.

Conclusão: o disparo é determinístico (sem apostar em timing)

RodadaObservaçãoSignificado
Cada rodadaO processo pai tgkill(child_tgid, etid, 0) retorna ESRCHde_thread() já concluiu a troca de tid
Cada rodadaEm seguida kill(child_tgid, SIGKILL), o processo filho retorna rc=-9exec foi abortado (não é rc=0 de exec bem-sucedido)
Controle --no-killerexec do estado armed até o fim leva 277 ms (com killer, 287 ms)O write lock do mmap de fato bloqueia o mmap_read_lock_killable() de exec_mmap()

5/5 rodadas acertaram "ESRCH → SIGKILL → falha do exec", nenhuma vez o exec teve sucesso. Isso prova que a janela para abortar o exec após de_thread é controlável e estável; a janela vem do mprotect do locker (60 mil VMAs, 200–700 ms por vez), e a reação do processo pai é em nível de µs.

Duas armadilhas críticas encontradas (ambas já corrigidas no código)

  1. O killer deve estar no processo pai: de_thread() executa zap_other_threads() e mata todas as outras threads do mesmo processo; um killer escrito no processo filho morre antes, no momento do de_thread, e nunca vê o ESRCH (o sintoma é o exec ter sucesso sempre).
  2. Momento do reclaim: fazer spray imediatamente após o SIGKILL é ineficaz — nesse momento o processo filho ainda não morreu e o k_itimer ainda não foi liberado pelo RCU. A ordem correta é waitid(WNOWAIT) aguardar o zumbi → aguardar o callback do RCU liberar → disputar a página → por fim wait4 disparar o caminho de reclaim.

Ainda não concluído: tornar o UAF visível

Atualmente a etapa "após a liberação, o nó ainda está na fila" já foi alcançada de forma estável, mas o rb_erase no momento do wait4 não gera oops — isso indica que a página do slab vítima ainda não foi capturada pelo nosso spray (o partial slab do posix_timers_cache ainda está em cache, a página não voltou ao buddy). Isso pertence à orquestração de reclaim do exploit, não é um problema de corrida; é preciso seguir a abordagem das notas do vivo: primeiro usar o próprio k_itimer para encher/esvaziar o slab e forçar a devolução da página inteira, depois usar um portador order-0 (AIO ring etc.) para capturar com precisão a meia-página dividida.

Sugestão para o próximo passo: usar esta máquina como referência e fazer reclaim direcionado seguindo a ideia de docs/08-reclaim-choreography.md (notas do vivo); ou validar com um kernel compilado com KASAN se o UAF realmente ocorre.


Viabilidade de port da cadeia completa (limiar medido em SM-S9280 / 6.1.162)

A cadeia pública (Honor uid0.c) depende dos eventos kmem do tracefs para duas coisas críticas:

用途Honor 611/6.12 用的本机(Samsung 6.1.162)
找受害 k_itimer 地址 V(算 payload 在页内偏移)kmem:kmem_cache_alloc事件存在,但 events/kmem/*/enable 是 0644 root:root,shell 无法 enable(events/sched/*/enable 可写,kmem 不行)
判断 order-1 slab 页已归还 buddy(精确抢页时刻)kmem:mm_page_free同上,存在但无法 enable
读原始 trace 缓冲per_cpu/cpuN/trace_pipe_raw可读(-r--r----- root readtracefs)✓
KASLR slide各 trace 事件 static site可做:sched 事件可 enable,项目已有同类手法 ✓

结论:公开链不能原样移植。缺的不是内核能力(事件都在),而是 shell 没有 kmem 事件的 enable 权限。

Baixar ferramenta