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 LukeYui por compilar essa lista e à FROM SOFTWARE por agir rapidamente! Fico feliz em dizer que Elden Ring é, indiscutivelmente, o título mais seguro da FROM SOFTWARE no que diz respeito à extensão dos danos que hackers podem causar.
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.
A verificação inadequada de limites em um buffer de pilha e no campo de tamanho de dados durante a análise dos dados de matchmaking NRSessionSearchResult permite que um atacante execute código arbitrário. O estouro de pilha permite sobrescrever os dois bytes inferiores do vftable_ptr do objeto DLMemoryInputStream usado internamente pelo leitor de stream, redirecionando a execução para código vizinho cuidadosamente escolhido. A exploração inteligente da estrutura do objeto DLMemoryInputStream e do campo de tamanho de dados permite então alcançar o redirecionamento arbitrário de código, com RCX apontando para o endereço do nosso pacote. A partir daí, uma série de redirecionamentos de código por meio de chamadas virtuais com diferentes deslocamentos (que agora saltarão para quaisquer endereços que escrevemos no buffer do pacote) pode ser usada para alcançar a execução arbitrária de código.
Os vetores de distribuição são o que tornam este RCE particularmente grave (além de já ser um RCE). O exploit é transmitido através de solicitações de push de matchmaking contendo informações de NRSessionSearchResult. Isso significa que o atacante pode atingir qualquer pessoa que entre em sua sessão online. Em particular, para DS3:
PushRequestSummonSign)PushRequestAllowBreakInTarget)PushRequestVisit)PushRequestAcceptQuickMatch)Isso já é bastante ruim, mas o verdadeiro potencial é desbloqueado pela solicitação RequestSendMessageToPlayers:
message RequestSendMessageToPlayers {
repeated uint32 player_ids = 1;
required bytes push_message = 2;
}
O host usa essa solicitação para enviar diretamente a mensagem push PushRequestAllowBreakInTarget para invasores, para que eles possam obter as coordenadas de spawn e entrar na sessão P2P. É só isso. Essa é a única maneira como essa solicitação é usada pelo jogo.
Não posso enfatizar o quão terrivelmente inseguro isso é. Qualquer jogador pode basicamente se passar pelo servidor de matchmaking. Ao usar essa solicitação para enviar o exploit através de um PushRequestVisit, qualquer jogador online pode ser alvo remoto do atacante, desde que seu ID de jogador seja conhecido. O atacante também pode enviar o exploit para toda a base de jogadores online muito rapidamente, enviando várias solicitações, cada uma contendo uma grande fatia de possíveis IDs de jogadores.
Embora o RCE não seja exatamente portável para todos os jogos, a ideia central do exploit que dá ao atacante o redirecionamento arbitrário de código é a mesma. Se isso puder ser alcançado, é muito provável que uma cadeia de chamadas virtuais ou cadeia ROP específica do jogo possa ser encontrada. Este "primeiro passo" usa as seguintes vulnerabilidades: