
Um exploit de kernel baseado em webkit e jailbreak para PS5
Este repositório contém um exploit ROP de WebKit da vulnerabilidade de use-after-free de corrida UMTX (CVE-2024-43102) reportada pela Synacktiv. É basicamente um port da estratégia de exploit do fail0verflow e do flatz. Ele abusa da UAF para obter um mapeamento de leitura/escrita na pilha de uma thread do kernel e usa leituras e escritas em pipes para estabelecer uma primitiva de leitura/escrita arbitrária (não exatamente ideal) no kernel. Essa leitura/escrita é então evoluída para uma melhor, que utiliza um par de sockets ipv6 e um par de pipes para uma leitura/escrita estável que pode ser passada para payloads da mesma forma que era possível com o exploit de kernel IPV6 do PS5 anterior.
A própria página é uma versão reduzida e modificada do PS5 Exploit Host do idlesauce, pois ele já havia feito o trabalho de integrar o psfree ao estilo de código que usei anteriormente. Este host também é minha escolha pessoal para executar as coisas, pois é muito fluido e integra payloads úteis; espero que ele seja atualizado para suportar este exploit em um futuro próximo <3.
Por fim, um carregador de payloads será iniciado para escutar por ELFs de payloads na porta 9021. Recomendo o PS5 Payload Dev SDK, pois ele deve ter compatibilidade total com este carregador quando os offsets de kernel forem adicionados.
Esta vulnerabilidade afeta do firmware 1.00 ao firmware 7.61, porém FW >= 3.00 parecem ter mitigações adicionais que exigem ajustes no exploit para funcionar. Como estou principalmente interessado apenas em firmwares mais antigos, este exploit não suporta FW >= 3.00 por enquanto. Além disso, a vulnerabilidade de WebKit que usamos em cadeia foi corrigida no 6.00, então outro exploit de WebKit que alcance leitura/escrita em userland será necessário para esses sistemas. Novamente, como não estou focado em firmwares mais altos, isso ficou incompleto por enquanto.
Notas Importantes
Os seguintes firmwares são atualmente suportados:
dns.conf para apontar manuals.playstation.net para o endereço IP do seu PCpython fakedns.py -c dns.confpython host.py0.0.0.0
Para usar o carregador de ELF, execute o exploit até a conclusão. Ao concluir, ele executará um servidor na porta :9021. Conecte-se e envie seu ELF para o PS5 via TCP e ele o executará. Este carregador deve continuar aceitando e executando payloads mesmo após sair do navegador.
Double free inicial
A estratégia para este exploit vem em grande parte do fail0verflow e do flatz. Veja o writeup do chris@accessvector para mais informações sobre a vulnerabilidade. Ao explorá-la, essencialmente obtemos um double free. Podemos usar isso para sobrepor o vmobject de uma pilha do kernel com o de um mapeamento mmap para obter uma janela para a pilha de uma thread do kernel. Essa capacidade muito poderosa nos permite ler/escrever em ponteiros arbitrários do kernel na pilha, derrotando o ASLR e permitindo criar primitivas. A thread cuja pilha temos acesso chamaremos de thread vítima.
Obtendo leitura/escrita arbitrária
Ao criar um pipe e encher o buffer do pipe na thread principal, e então tentar escrever nele usando a thread vítima, a thread vítima ficará bloqueada esperando que espaço seja liberado no buffer. Durante esse tempo, podemos usar nossa janela para a pilha do kernel para alterar os ponteiros iovec para ponteiros de kernel e definir flags para que sejam tratados como endereços de kernel. Ao então ler o pipe na thread principal, podemos obter leitura arbitrária do kernel.
Da mesma forma, ao fazer a thread vítima ler no pipe, ela ficará bloqueada esperando dados recebidos. Podemos então, novamente, sobrescrever os ponteiros iovec e torná-los ponteiros de kernel, e escrever dados na thread principal para obter escrita arbitrária do kernel.
Aprimorando a leitura/escrita arbitrária
Neste estágio, temos uma leitura/escrita arbitrária sem restrições reais, mas estamos presos ao uso de multithreading e bloqueio para que funcione, o que não é ideal. Então usamos a R/W para iterar a tabela de FDs do processo e sobrepor os pktopts de dois sockets IPV6. Podemos então criar outra leitura/escrita arbitrária via o sockopt IPV6_PKTINFO. Essa primitiva de leitura/escrita novamente não é ideal, pois é limitada em tamanho e conteúdo devido à opção de socket subjacente. Mantemos essa etapa principalmente para emular o cenário do exploit IPV6, no qual a maioria dos payloads e afins foram construídos.
Podemos obter uma leitura/escrita melhor via pipes. Ao iterar novamente a tabela de FDs do processo e modificar os objetos de buffer pipemap, podemos estabelecer leitura/escrita. O par de sockets IPV6 é usado como mecanismo para controlar o buffer pipemap.
Corrigindo/contornando a corrupção
Se deixarmos as coisas como estão e tentarmos fechar o navegador, o sistema irá travar. Isso porque a limpeza do processo tentará liberar a pilha do kernel que já foi liberada. Para evitar isso, fazemos duas coisas:
td_kstack da thread vítima na lista de threads do processo.Em FW < 3.00, este exploit é muito estável. O único ponto crítico de falha é não conseguir sobrepor os vmobjects. Em firmwares mais altos, essa sobreposição é mais difícil de alcançar devido a supostas mitigações no nível do alocador de páginas/heap.
Aqueles interessados em contribuir com pesquisa/desenvolvimento do PS5 podem entrar em um discord que eu configurei aqui.