O que kernel-exploitation faz?
Manual de exploração do kernel Linux. Use ao explorar vulnerabilidades do kernel (UAF, OOB, condição de corrida, confusão de tipo) para escalonamento de privilégios via commit_creds, sobrescrita de modprobe_path ou cadeias ROP do kernel em cenários CTF e do mundo real.
Técnicas Abordadas
- UAF (Use-After-Free): Exploração de objetos do kernel liberados, como
struct cred, para obter escalonamento de privilégios. - OOB (Out-of-Bounds): Leitura/escrita fora dos limites de buffers do kernel (ex.:
sk_buff, arrays depipe_buffer). - Condição de Corrida (Race Condition): Cenários de Time-of-Check Time-of-Use (TOCTOU) em chamadas de sistema como
ioctl,read/writeconcorrentes. - Confusão de Tipo (Type Confusion): Abuso de conversões de tipo em objetos do kernel (ex.: confundir
credcom outra estrutura).
Métodos de Escalonamento
commit_creds(prepare_kernel_cred(0)): Clássico escalonamento para PID 0 (root).- Sobrescrita de
modprobe_path: Redireciona o caminho do bináriomodprobepara um script arbitrário (técnica de fallback). - Cadeias ROP do Kernel: Uso de gadgets para construir uma cadeia ROP (Return-Oriented Programming) que chame
commit_credsou altere flags de processo.
Ambiente de Exploração
- Recomenda-se usar
pwntools(Python) comgdbpara depuração remota do kernel viakgdb. - Kernel configurado com
CONFIG_DEBUG_INFO=yeKASLRdesabilitado para CTF; em cenários reais, mitigações comoSMAP,SMEP,KPTIdevem ser consideradas. - Use
ropperouROPgadgetpara extrair gadgets ROP do kernel (vmlinux).
Exemplo de Exploit (UAF via cred)
#!/usr/bin/env python3
from pwn import *
context.arch = 'amd64'
context.log_level = 'info'
# Endereço da função commit_creds (obtido via /proc/kallsyms ou ropper)
COMMIT_CREDS = 0xffffffff810c8d30
PREPARE_KERNEL_CRED = 0xffffffff810c8cc0
def exploit():
# 1. Alocar e liberar um objeto struct cred
# 2. Sobrescrever o objeto liberado com dados controlados
# 3. Chamar commit_creds(prepare_kernel_cred(0))
#
# Implementação específica depende da vulnerabilidade.
# Exemplo genérico:
payload = p64(PREPARE_KERNEL_CRED) # ROP gadget para chamar prepare_kernel_cred(0)
payload += p64(COMMIT_CREDS) # ROP gadget para chamar commit_creds
# ... continuação da cadeia ROP
print("[*] Payload pronto, enviando para o dispositivo alvo...")
if __name__ == '__main__':
exploit()
Verificações de Segurança
- KASLR: Para bypassar, use vazamento de endereço via
/proc/kallsymsou vazamento de ponteiro em mensagens de erro. - SMAP/SMEP: Evite executar código do espaço do usuário; prefira ROP com gadgets do kernel ou escalonamento via
modprobe_path. - KPTI: Após o escalonamento, pode ser necessário alternar a tabela de páginas do kernel usando
swapgseiretq.
Boas Práticas
- Sempre valide endereços com
ropperouobjdumpantes de construir a cadeia ROP. - Teste o exploit localmente com
qemu-system-x86_64antes de usar em ambientes remotos. - Documente cada etapa e mantenha logs detalhados para depuração.
Referências
- Documentação oficial do kernel Linux sobre
credemodprobe_path. - Tutoriais de CTF: pwn.college, CTF101.
- Ferramentas:
pwntools,ropper,ROPgadget,gdb,kgdb.
Este playbook é fornecido apenas para fins educacionais e de pesquisa em segurança autorizada. Não use em sistemas sem permissão explícita.