Documentação e código de prova de conceito para CVE-2022-24125 e CVE-2022-24126.
Uma nova atualização do jogo, 1.15.1, foi lançada para Dark Souls III em 25/08/2022, juntamente com a restauração dos serviços online. Esta atualização corrigiu tanto CVE-2022-24125 quanto CVE-2022-24126, além de uma vasta gama de outras potenciais vulnerabilidades de segurança presentes na rede P2P do jogo (leituras/escritas fora dos limites). Além disso, todos os exploits conhecidos que permitiam corromper o save de outros jogadores foram corrigidos. Muitos cheats menores comuns (ex.: "curse knife") que eram frequentemente encontrados durante o multijogador online também foram corrigidos.
Este repositório contém código de prova de conceito e documentação para o exploit RCE mais recente que afeta jogos da FROM SOFTWARE, CVE-2022-24126. Embora teoricamente possível em outros jogos, o foco está em Dark Souls III, pois é o jogo onde minha pesquisa foi conduzida. Atualmente, o código de prova de conceito existe apenas para Dark Souls III; a vulnerabilidade foi confirmada como presente em:
O código vulnerável também está presente em Sekiro (crédito: LukeYui), embora não haja como acioná-lo. A presença em Demon's Souls não foi confirmada, mas é muito provável. Embora o teste de rede fechado tenha sido afetado, a versão de lançamento de Elden Ring não foi. Na verdade, uma enorme lista de crashes de rede, leituras/escritas fora dos limites e exploits que permitiam aos jogadores modificar os dados de jogo de outros jogadores, que estavam presentes em Dark Souls III, foram corrigidos em Elden Ring. Parabéns a por compilar essa lista e à FROM SOFTWARE por agir rapidamente! Fico feliz em dizer que
Ao contrário do que se acredita, isso NÃO é um exploit de rede peer-to-peer. Está relacionado ao servidor de matchmaking e, portanto, é muito mais grave, pois você não precisa participar de nenhuma atividade multijogador para estar vulnerável devido a outra vulnerabilidade do servidor de matchmaking (CVE-2022-24125).
Com o jogo tendo uma base média de jogadores simultâneos de cerca de 20.000 jogadores nos meses anteriores ao desligamento do servidor, era claramente um problema que precisava ser corrigido imediatamente, especialmente com a possibilidade de estar presente em Elden Ring. Como a FROM SOFTWARE não havia agido por mais de 40 dias após meu relatório inicial com vídeos de prova de conceito e documentação detalhada do exploit (na qual grande parte deste readme é baseada), decidi demonstrar a existência do exploit publicamente de forma benigna, na esperança de chamar a atenção para que fosse resolvido pelos desenvolvedores, e funcionou.
Veja aqui para mais detalhes sobre esses 3 gadgets. Se para algum outro jogo esse método de chamada virtual não for uma abordagem viável, o redirecionamento arbitrário de código ainda pode ser usado para configurar um exploit ROP mais tradicional.
Para executar o código de prova de conceito, você deve primeiro ter um servidor para se conectar. Embora os servidores oficiais tenham sido desativados devido ao exploit, você pode configurar um servidor privado usando ds3os. O ds3os foi projetado para imitar o comportamento do servidor de varejo o mais próximo possível, mas patches de segurança já foram implantados neste projeto para corrigir este exploit. No entanto, você ainda pode configurar um ambiente de teste compilando o projeto com as constantes SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS e NRSSR_SANITY_CHECKS definidas como false em BuildConfig.h. Isso imita o comportamento inseguro do servidor de varejo. Siga as instruções fornecidas por ds3os para iniciar o jogo e conectar-se ao seu servidor.
Depois que isso for feito e seu jogo estiver conectado aos servidores, compile o código PoC e inicie o executável Injector.exe. Ele injetará uma DLL contendo o código do exploit no processo de Dark Souls III. Essa DLL usará a função do jogo que envia mensagens FRPG para o servidor para entregar o exploit ao seu próprio cliente.
A função 140ca5010 verifica os tamanhos das entradas, mas 140ca4fa0 é para entradas de tamanho variável e não realiza verificações de sanidade no campo de tamanho (Bug #1). Para alcançar o exploit de redirecionamento arbitrário de código descrito acima, precisamos defini-lo como 14F3B0. Isso causará uma leitura fora dos limites de aproximadamente 1,3 MiB, mas a página de memória deve ser grande o suficiente para evitar violações de acesso.
140ca56b0Esta função é chamada pela anterior com nrssr_data como argumento. Cria o objeto DLMemoryInputStream na pilha, que é então passado como argumento para o analisador NRSSR.
141955f50: ParseNRSessionSeachResultO analisador de NRSessionSearchResult. Verifica a assinatura NRSSR e números de versão (14196a0f0), analisa a lista de propriedades (14196a260), nome do host (14195603a) e mais algumas informações (veja rce.h)
14195603aLoop na função acima que copia o nome do host de forma insegura (Bug #2). Aqui estão alguns endereços que podem ajudar a acompanhar o que está acontecendo durante o estouro de buffer:
14F128DLMemoryInputStream: 14F3A0DLMemoryInputStream após a sobrescrita: 1439e8b30DLMemoryInputStream usado pelo DLInputStreamReader: 0x181439e8b48MOV RCX,qword ptr [RCX + 0x8]
MOV RAX,qword ptr [RCX]
JMP qword ptr [RAX + 0x40]
Onde acabamos após o primeiro redirecionamento de código causado pela vtable do stream de memória sobrescrita. É aqui que a cadeia de redirecionamentos de chamada virtual começa.
Para Dark Souls III Ver. 1.15. O tamanho máximo teórico do payload depende do layout da pilha e, portanto, varia de acordo com o jogo e a versão. ↩