1 pontos por GN⁺ 2024-08-08 | 1 comentários | Compartilhar no WhatsApp
  • O buffer overflow de strcpy no processamento do gap name em arquivos salvos do Create-A-Park levou a exploits via save files e rede em várias plataformas, como original Xbox, Xbox 360, PS2 e GameCube
  • Na versão de THPS4 para original Xbox, uma string limitada a 31 caracteres era copiada sem verificação de limites para um buffer de pilha de 32 bytes, permitindo sobrescrever o return address e executar shellcode usando o cabeçalho do save file e um segmento de dados executável
  • Em THPS3, a mesma entrada corrompia a heap em vez da pilha, exigindo uma cadeia ROP que passava por um allocator customizado e por um caminho de vtable, enquanto nas versões de THUG 1 e 2 para Xbox o stack cookie bloqueava o caminho do gap name
  • No multiplayer de THPS4, um host malicioso enviava um arquivo de park ao cliente para realizar execução remota de código e transferência assíncrona de arquivos, e um vazamento de memória de rede revelado durante a transferência era contornado com um hot patch dentro do exploit
  • Tony Hawk’s American Wasteland no Xbox 360 também permite execução de ROP com o overflow de gap name, mas a execução completa de código no hypervisor só é possível quando combinada com um bug no system call handler do kernel 4548; o código-fonte e os save files corrigidos foram publicados no GitHub

Ponto de partida: gap name e strcpy

  • Em 2016, durante a busca por um novo bug de save file hack para o original Xbox, o arquivo salvo de custom park de Tony Hawk’s Pro Skater 4 virou alvo de análise
  • O recurso Create-A-Park de THPS4 permite que o jogador crie seu próprio skate park e dê nomes aos gaps, trechos de salto
    • O gap name é uma string definida pelo usuário com no máximo 31 caracteres mais o terminador nulo
    • Se essa string for processada por uma função como strcpy, ela pode se tornar um primitive de corrupção de memória
  • Ao substituir o gap name por uma string maliciosa longa com repetições de 0x41, copiá-la para o Xbox e carregá-la, o console travou e o instruction pointer foi definido como 0x41414141
    • Isso indicava que o gap name havia sido copiado para a pilha e sobrescrito até o return address
  • A análise no IDA mostrou que, ao percorrer a lista de gaps do save file, o jogo copiava gap_name de save_file_gap_data para gap_description gapDesc, na pilha, usando strcpy
    • Sem verificação de limites, a cópia continuava até encontrar o terminador nulo
    • Essa versão do jogo foi compilada sem stack cookie, então era possível sobrescrever os dados da pilha e o return address

THPS4 no original Xbox: movendo shellcode para uma área executável

  • O original Xbox não tinha DEP de hardware para impedir execução de dados arbitrários como dispositivos modernos, mas kernels mais recentes e jogos já tinham alguma forma de soft DEP
    • O método alterava o endereço do seletor do segmento de código para permitir execução apenas abaixo de certo endereço
    • A pilha e as alocações de heap onde ficava o save file estavam fora da área executável
  • Como o segmento de dados read-write do executável do jogo ficava dentro da área executável, a estratégia foi copiar o código para lá e executá-lo dali
  • O nome do park fica no cabeçalho do save file e, quando o jogador seleciona o save, os primeiros 136 bytes do cabeçalho são copiados para uma struct no segmento de dados do executável para exibição na UI
    • Não dava para alterar livremente o cabeçalho inteiro, mas havia espaço suficiente para inserir um pequeno stub de memcpy
  • Fluxo do exploit de THPS4 no original Xbox
    • Após carregar o save file e antes de apertar “Start Game”, os primeiros 136 bytes são copiados para o segmento de dados executável
    • Ao apertar “Start Game”, o gap name malicioso é copiado para a pilha e o return address é sobrescrito com o endereço do stub de cópia de shellcode
    • Quando a função retorna, o fluxo salta para o stub de cópia, que move o payload maior do buffer do save file para o segmento de dados executável
    • Após a cópia, o fluxo salta para o payload e obtém execução arbitrária de código

Bypass de assinatura e habibi key

  • Depois de obter execução de código no original Xbox, era necessário desativar a verificação de assinatura e executar um executável não assinado
  • O payload foi montado com base no payload de um save file do softmod installer já existente de 007 Agent Under Fire
    • Ele encontrava endereços de funções e dados do kernel, além do endereço da RSA public key usada na verificação de assinatura do executável
    • Desativava a proteção contra escrita do machine state register e aplicava um patch na RSA public key para a habibi key
    • Em seguida, executava um executável auxiliar incluído no save file; nos testes, foi usado um executável de nyan cat
  • O par de chaves habibi provavelmente é uma chave RSA criada por um grupo de hacking de Linux no original Xbox no começo dos anos 2000
    • Em vez de forçar a verificação de assinatura RSA do kernel a sempre passar, o método trocava a public key pela própria chave do grupo para executar um loader de Linux
    • Essa foi uma escolha para impedir que o save file fosse usado para executar conteúdo pirateado, mas depois outros grupos publicaram arquivos de exploit para instalar hacks persistentes
  • Um detalhe curioso é que o modulus da habibi public key difere da Microsoft RSA public key em apenas 4 bytes
    • Parece que o exponent também deveria mudar para 3, mas os payloads de shellcode existentes não alteram o exponent
    • Não está claro exatamente como isso funciona
  • O método da habibi key foi escolhido por causa da compatibilidade com várias versões de kernel do Xbox
    • Fazer patch na função de verificação de assinatura para sempre retornar true exigiria correspondência de padrões de instrução para cada versão de kernel
    • Com a habibi key, basta aplicar um patch de 4 bytes em uma área de memória fácil de localizar

Análise de variantes: THPS3, THUG, THAW

  • Tony Hawk’s Pro Skater 3

    • O THPS3 também tinha Create-A-Park e gap name, mas não travava logo após carregar o arquivo de save malicioso
    • Era possível andar de skate no jogo, e o console travava ao selecionar “quit game”
    • O gap name era copiado para a heap, não para a stack, e o overflow sobrescrevia o allocation header da próxima alocação da heap
    • Quando a próxima allocation era liberada, os pointers do header levavam a uma vtable com o function pointer da rotina de cleanup
    • Diferentemente do THPS4, o THPS3 não copiava o header do arquivo de save para um segmento de dados executável, e os dados do save também ficavam em memória heap não executável
    • Sobrescrevendo o pointer pAllocOwner, era possível controlar o local de carregamento do function pointer de cleanup e usar uma ROP chain na memória do arquivo de save com stack pivot
    • A ROP chain, com apenas alguns gadgets, copiava o shellcode da heap para um segmento de dados executável e saltava para lá
    • Depois disso, assim como no payload genérico “hack xbox kernel” do THPS4, eram aplicados o patch da habibi key e a execução de executáveis unsigned
  • Tony Hawk’s Underground 1 & 2

    • Ao fazer fuzzing do gap name no THUG, em vez de access violation ocorria um bug check completo com a mensagem Buffer overrun detected!
    • O executável continha verificação de stack cookie
    • O stack cookie é um valor aleatório colocado antes do return address, e a função verifica antes de retornar se esse valor foi alterado
    • Para sobrescrever o return address, seria preciso conhecer o valor do cookie, mas no caminho do gap name não havia como fazer esse leak
    • Havia variáveis corrompíveis entre o fim do buffer de gap name e o stack cookie, mas elas eram logo sobrescritas pelo código do jogo e não eram úteis para o exploit
    • A exploração via SEH também foi considerada, mas não havia como provocar uma exceção no código restante antes da verificação do stack cookie, e naquele ponto também não havia nenhum exception handler registrado que percorresse a cadeia SEH
    • O THUG2 no Xbox também não permite exploit baseado em gap name pelos mesmos motivos
    • Ainda assim, existem outros bugs de strcpy e bugs exploráveis baseados em heap
    • As versões de PlayStation 2, PC e provavelmente GameCube foram compiladas sem stack cookie, então podem ser exploradas com o buffer de gap name
  • Tony Hawk’s American Wasteland

    • Como o THAW é um jogo posterior ao THUG 1 e 2, esperava-se que tivesse stack cookie, mas a versão de Xbox foi compilada sem stack cookie
    • Era vulnerável ao buffer overflow de gap name, e o exploit foi montado quase da mesma forma que no THPS4

RCE em rede no THPS4: hackeando o cliente sem arquivo de save

  • Como o exploit via arquivo de save exigia memory card, escolheu-se como superfície de ataque com barreira de entrada menor o multiplayer LAN
    • Ao usar no multiplayer LAN um park criado com Create-A-Park, o host envia o arquivo de save pela rede e o cliente o carrega
    • Partiu-se da hipótese de que seria possível hackear o console do cliente enviando um arquivo de park malicioso
  • Para evitar que o host hackeasse a si mesmo, o executável do jogo foi modificado para bloquear o bug de strcpy, e também foi adicionado um code segment para funções extras
  • No começo, o cliente conseguia se conectar ao host e andar de skate normalmente, mas o payload não era executado e o buffer overflow também não era acionado
    • Os dados do arquivo de park na memória do cliente estavam alterados em relação ao arquivo de exploit
    • Depois que o host carregava o arquivo de park, ele o salvava novamente a partir da memória e enviava esse resultado ao cliente, corrompendo os dados do exploit
  • Ao transformar essa function call em NOP, o cliente passou a receber o arquivo de park malicioso e foi comprometido, com mudança na cor do LED
  • No caminho de rede, o header do arquivo de save não é copiado para o segmento de dados, então não era possível usar o stub local do exploit de THPS4 que copia o shellcode
    • Uma ROP chain semelhante à do THPS3 copia o shellcode para memória executável

Descoberta do código-fonte de THUG e uso do código de rede

  • Era necessário entregar pela rede ao cliente um executable de payload auxiliar, mas não dava para colocar o arquivo junto na pasta do save game como no exploit local por arquivo de save
  • Também foram considerados métodos de carregar o executable a partir de um CD gravado ou de um endereço de rede local, mas eles não foram adotados
    • A implementação de winsock do Xbox usa por padrão secure socket connection, então foi necessário reproduzir a camada de segurança do Xbox com um script Python
  • Ao procurar material relacionado ao arquivo de save de park, a busca pela string Sk4Ed_Dead levou ao repositório thug no GitHub
    • Constatou-se que não era uma ferramenta homebrew, mas sim o código-fonte completo de Tony Hawk’s Underground
    • Não era exatamente o THPS4, mas a base de código era suficientemente parecida para aproveitar o networking code e escrever hooks
  • No código-fonte havia o código de carregamento do arquivo de park e a linha exata com o bug de strcpy
    • Foi possível reconstruir o arquivo de projeto do Visual Studio e corrigir alguns compiler errors para gerar uma build executável com os assets finais do jogo
    • Não parece ser idêntico à versão final, mas o código aparenta ser muito próximo
  • O objetivo deixou de ser apenas um RCE simples e passou a ser obter RCE de forma silenciosa no console que entra na partida, habilitar a execução de código unsigned e então transferir um executable auxiliar durante o jogo

Restauração da execução e transferência assíncrona de arquivos

  • Para transmitir o payload enquanto o cliente continuava jogando, foi necessário restaurar o fluxo de execução do jogo após a execução do shell code
  • A ROP chain foi alterada para salvar o stack pointer original antes do stack pivot e restaurá-lo depois da execução do shell code
    • Depois disso, ela copia o shell code para memória executável e salta para lá
  • O sistema de networking do jogo registra message ID e handler function, e chama o handler correspondente ao ID das mensagens recebidas
  • Foi registrado um message ID não utilizado para implementar um protocolo simples de transferência de arquivos
    • Quando o cliente se conecta, ele envia MSG_ID_PAYLOAD_REQUEST ao host para iniciar a transferência
    • O host envia os dados do payload em mensagens MSG_ID_PAYLOAD_DATA
    • Quando o cliente recebe PAYLOAD_MSG_ID_END, a transferência é concluída

Vazamento de memória de 15 anos e hot patch

  • Durante a transferência do arquivo, o console do cliente travava com null pointer dereference
  • O allocator de dados de rede retornava NULL, e os bytes livres do memory pool de rede chegavam a 0
  • No código-fonte do THUG havia código para liberar o buffer de dados da mensagem, mas essa correção não existia na build lançada do THPS4
    • O buffer p_data de stream_desc não era liberado a cada mensagem, esgotando o memory pool de rede
    • Em partidas multiplayer normais, isso talvez não causasse problema a menos que a sessão durasse muito tempo
  • O exploit aplicava um hot patch no código do cliente para liberar o buffer p_desc->p_data com a função free correta
  • Depois do hot patch, a transferência de arquivos teve sucesso entre os consoles host e cliente, e o cliente executou o executable nyan-cat
    • Usando um app de tunneling, o mesmo exploit também foi testado remotamente no console de um amigo em outra região

Fluxo final do exploit de rede do Xbox original

  • o cliente se conecta ao console host malicioso e recebe pela rede o arquivo de park “Hack Xbox”
  • ao analisar o arquivo de park, o cliente sofre um buffer overflow, o endereço de retorno da pilha é sobrescrito e a cadeia ROP começa
  • a cadeia ROP copia o payload completo de shellcode para uma região de memória executável e salta para ele
  • o shellcode configura os hooks e patches necessários antes de voltar à execução do jogo e faz o spawn do jogador na partida
  • enquanto o jogador anda de skate no jogo, o host envia um arquivo executável ao cliente, que o salva no HDD do cliente
  • após a conclusão da transferência do arquivo, o shellcode aplica um patch no kernel do cliente para usar a habibi key e inicializa o executável secundário transferido
  • se a cor do LED não mudar, é difícil para o usuário perceber o progresso até que outro aplicativo seja inicializado de repente

Xbox 360: THAW e o kernel 4548

  • Tony Hawk’s American Wasteland para Xbox 360 também é vulnerável ao buffer overflow do nome do gap
  • o objetivo era explorar o console em uma nova versão do kernel, mas isso era impossível sem um novo bug no hypervisor
  • em vez disso, foi possível criar o primeiro exploit exclusivamente por software do Xbox 360 combinando o bug de strcpy do THAW com o bug do handler de system call do kernel 4548
  • o hack anterior do King Kong no Xbox 360 usava um arquivo de shader modificado para realizar uma escrita arbitrária na memória do kernel e explorar o bug do handler de system call
    • esse método exigia abrir o console e modificar o firmware do drive de DVD para usar um disco modificado de King Kong
    • o bug do save game podia servir como outro ponto de entrada para iniciar uma cadeia ROP

Assinatura de arquivos de save no Xbox 360 e o papel dos consoles de desenvolvimento

  • os arquivos de save de jogos do Xbox 360 são assinados com um par de chaves RSA exclusivo de cada console
    • o armazenamento de chaves de cada console contém a chave criptográfica usada para assinar saves de jogos
  • o motivo de outros consoles conseguirem verificar o arquivo de save é que a chave pública RSA está incluída no cabeçalho do arquivo de save
    • essa própria chave pública é assinada com outro par de chaves RSA que só a Microsoft possui
    • não é possível simplesmente colocar qualquer chave pública no cabeçalho e fazer passar na validação
  • para usar em outro console um arquivo de save modificado arbitrariamente, é necessário o key store descriptografado de algum console Xbox 360
  • o ponto de partida do hacking de Xbox 360 foi o vazamento de consoles de desenvolvimento e do SDK
    • como o código executável estava criptografado, sem conseguir inspecioná-lo externamente não era possível encontrar bugs
    • os consoles de desenvolvimento e o SDK forneceram as informações necessárias para a descriptografia do código executável e para a engenharia reversa da cadeia de boot, do hypervisor e do código dos jogos

Bug do handler de system call 4548

  • no Xbox 360 existem o modo real do hypervisor e o modo kernel
    • o modo real do hypervisor é o modo com mais privilégios
    • no modo kernel, o sistema operacional e o jogo são executados
  • a CPU tem uma unidade criptográfica ao lado do cache L2 responsável pela criptografia e pelo hashing da memória
    • no modo kernel, as páginas do hypervisor aparecem criptografadas + com hash, e se forem sobrescritas arbitrariamente o console para quando o hypervisor tenta acessá-las
  • no modo real, os 32 bits superiores do endereço físico de 64 bits são usados para controlar a criptografia e o hashing
    • ao aplicar a máscara 0x80000000.00000000, é possível acessar a memória ignorando a criptografia e o hashing
    • onde o modo kernel pode fornecer um endereço físico ao hypervisor, os 32 bits superiores precisam ser limpos obrigatoriamente
  • o handler normal de system call usa a instrução slwi para deslocar o ordinal da system call 2 bits para a esquerda e descarta os 32 bits superiores do resultado, usando apenas um offset de 32 bits
  • o handler de system call do kernel 4548 usa sldi em vez de slwi
    • como sldi opera em 64 bits, os 32 bits superiores de r0 também entram no cálculo do offset do índice da tabela
    • a verificação de intervalo do ordinal se aplica apenas aos 32 bits inferiores de r0
    • por exemplo, 0x20000000.0000003F passa na verificação de intervalo enquanto cria o offset 0x80000000.000000FC, induzindo um acesso de memória desprotegido
  • essa mudança é considerada mais provavelmente um bug de compilador do que uma modificação intencional do desenvolvedor

Estrutura do exploit do Xbox 360

  • se a visualização de memória criptografada do hypervisor for sobrescrita no modo kernel, normalmente o console para, mas se o handler de system call for levado a ler um ponteiro de função de um endereço com o bit de proteção superior definido, ele pode ler o valor sobrescrito sem gerar fault
  • etapas do exploit
    • carrega o shellcode na memória e obtém o endereço físico
    • altera uma variável do gerenciador de memória do kernel para expor a visualização de memória criptografada do hypervisor em um intervalo de endereços gravável
    • sobrescreve o ponteiro de função da system call do hypervisor com o endereço da sequência de instruções mtctr r4; bctr
    • coloca um ordinal malicioso em r0 e, em r4, um valor com máscara OR do endereço físico do shellcode com 0x80000000.00000000
    • executa a instrução de system call para que o hypervisor leia o ponteiro de função sobrescrito e salte para o shellcode por meio de mtctr r4; bctr
  • o exploit de save do THAW usa uma cadeia ROP em PowerPC
    • o plugin IDA Ida-Sploiter foi modificado para suportar busca de gadgets PowerPC
    • o exploit completo é composto por 24 gadgets ROP
  • fluxo completo do THAW no Xbox 360
    • o buffer overflow no nome do gap sobrescreve o endereço de retorno com o primeiro gadget ROP
    • faz pivot do stack pointer para a cadeia ROP dentro do buffer de save
    • aloca memória física para o shellcode do hypervisor com MmAllocatePhysicalMemoryEx
    • copia o shellcode com memcpy e obtém o endereço físico com MmGetPhysicalAddress
    • faz o mapping da visualização de memória criptografada do hypervisor para permitir escrita
    • sobrescreve o endereço da função de system call com a sequência mtctr r4; bctr
    • executa syscall com o ordinal malicioso da system call e o endereço físico do shellcode
    • depois de obter execução de código no hypervisor, altera a cor do LED e faz patch na verificação de assinatura RSA de executáveis
    • volta para a cadeia ROP em modo kernel, mapeia uma pasta do HDD com ObCreateSymbolicLink e executa um payload secundário não assinado com XLaunchNewImage
  • esse método permite obter execução ROP a partir do bug de strcpy do THAW em qualquer versão de OS do Xbox 360, mas a execução completa de código no hypervisor só é possível no kernel 4548
    • se um novo bug no hypervisor for descoberto, ele pode ser combinado com esse ponto de entrada para funcionar também em versões mais novas do kernel

Divulgação em 2024 e port para outras plataformas

  • em 2024, os exploits de Tony Hawk foram organizados e divulgados
  • o mesmo bug de strcpy existe em 5 iterações da série Tony Hawk e em várias plataformas de console e portáteis
  • PlayStation 2

    • o exploit de RCE via rede do THPS4 foi portado para a versão de PlayStation 2
    • com PCSX2 ou outro console e apenas o disco de THPS4, é possível hackear o console pela rede
    • o exploit envia o uLaunchElf pela rede e o executa quando a transferência termina
    • depois disso, é possível carregar o instalador do FreeMcBoot ou do FreeHDBoot a partir de outra mídia, como um pendrive USB
    • o exploit de save game do PS2 tem pouca utilidade
    • se houver uma forma de copiar arquivos para o memory card, basta instalar o FreeMcBoot diretamente
    • é possível comprar um memory card com FreeMcBoot na Amazon por 15 dólares, ou usar o FreeHDBoot em um console phat com adaptador de rede
  • GameCube

    • o exploit de save game do THPS4 foi portado para a versão de GameCube
    • a versão de RCE via rede e outras variantes de exploit por save game não foram portadas
    • copiar arquivos para um memory card de GameCube não é simples, e memory cards com save pré-hackeado vinham sendo vendidos no eBay por mais de 50 dólares
    • a versão de GameCube dos jogos Tony Hawk não tem suporte de rede, então não é possível usar o exploit de rede mesmo com adaptador de rede
    • como já existem vários exploits por save e não há hack de software persistente, muitos usuários escolhem modchip
  • Windows

    • também foi criado um exploit de save game para THUG PRO, e um bug report foi enviado há 7 anos, mas na época não havia interesse em corrigir
    • ele não foi divulgado porque não oferece valor no Windows
    • os jogos Tony Hawk para PC têm o mesmo bug de strcpy e são exploráveis
    • também existem outros bugs de strcpy exploráveis no modo de jogo em rede
    • recomenda-se forçar ASLR e não executar como Administrator

Materiais publicados

  • o código-fonte completo e os arquivos de save patchados foram publicados no GitHub
  • um único bug de strcpy levou a exploits de save, RCE via rede e a um ponto de entrada de exploit somente por software no Xbox 360 em várias plataformas

1 comentários

 
GN⁺ 2024-08-08
Comentários do Hacker News
  • O aspecto mais interessante da chave Habibi é que o módulo da chave pública difere da chave pública RSA da Microsoft em apenas 4 bytes
    Um inteiro aleatório de 2048 bits tem uma chance razoável de ser fatorado de forma trivial e, embora eu não saiba a probabilidade exata, dá para estimar algo na ordem de 2^-32
    Provavelmente usaram um código que alterava aleatoriamente ou incrementava 4 bytes do módulo público, tentava fatorar por cerca de 1 milissegundo e parava quando dava certo
    Como resultado, é bem provável que o módulo público tenha muitos fatores pequenos; normalmente um módulo RSA é o produto de exatamente dois primos, mas desde que seja coprimo com e, a matemática ainda funciona mesmo com mais fatores

    • Basta começar com um inteiro aleatório de 2048 bits e mudar os bytes menos significativos para que ele seja divisível por 3. Como só estamos lidando com a chave pública, isso é fácil e, se a chave pública for divisível por 3, dá para usar o pequeno teorema de Fermat para pular a maioria dos candidatos possíveis de chave privada, reduzindo em várias ordens de grandeza a quantidade de cálculo necessária
      Se por sorte a implementação de RSA usar exatamente dois fatores primos, você já sabe que um deles é 3, então basta dividir a chave pública por 3 para obter o outro fator primo
      Segundo a Wikipedia, a estrutura da chave pública RSA exige que N seja um semiprimo grande e que e seja coprimo com φ(N); quem fatorar N pode obter a chave privada. No contexto do hack do Xbox, fazer N ser divisível pelo primo 3 significa que o outro primo é N/3, então a fatoração já foi bem-sucedida
      O código que assina com a chave Habibi está em https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f.... Ele troca os últimos 4 bytes para 0x89, 0x9c, 0x90, 0x6b, divide por 3 e então gera uma chave privada adequada a partir desse valor
    • Um artigo do qual fui coautor trata exatamente desse problema. O tema era se é possível gerar uma chave privada correspondente a uma chave pública real corrompida, que nesse caso também era de 2048 bits
      A aplicação é corromper a chave pública via rowhammer e depois usar essa fatoração para criar uma nova chave privada correspondente. Funcionou com chaves SSH e GPG, assumindo para fins práticos coisas como conhecer o conteúdo da página onde a chave está armazenada
      A taxa de sucesso empírica conforme o tempo de computação disponível está na Figure 7; o tratamento analítico está no capítulo 3 e a descrição do método real na seção 4.4
      https://www.usenix.org/system/files/conference/usenixsecurit...
    • A probabilidade é muito, muito, muito maior do que 2^-32. Basta ir dividindo por quantos primos pequenos der e, no valor restante, rodar um teste de primalidade rápido como Miller–Rabin
      Por exemplo, usando um código que tenta dividir pelos primos de 2 até 499 e, se o valor não virar 1, executa Miller–Rabin 20 vezes, no meu ambiente foram necessárias cerca de 100 tentativas para fatorar completamente um inteiro aleatório de 2048 bits
    • Uma implementação da teoria chinesa do resto falha se houver fatores repetidos
  • É difícil até expressar o quão absurda é essa conquista
    Fazer softmod no Xbox 360 usando o nome de um parque em um jogo do Tony Hawk, chegando até uma cadeia ROP de 24 etapas, é impressionante
    Juntando a breve elegia ao hipervisor, a análise concisa e prática e a ideia imediata de uma botnet de x360, isso parece um golpe direto de nostalgia do Xbox 360 no mais alto nível

  • A parte de “se der sorte vai ser strcpy” é engraçada. Originalmente deveria ser strncpy, mas um Tony Hawk famoso por defender equipamentos de segurança provavelmente preferiria ser associado a uma cópia de string mais segura

    • O jeito certo é usar memcpy e saber tanto o tamanho do buffer de destino quanto o do buffer de origem
      Se a origem não couber no destino, é preciso decidir conforme a aplicação se pode truncar, se deve abortar toda a operação ou se precisa realocar o buffer de destino. strncpy quase sempre faz a coisa errada
    • strncpy não é mais seguro. Quando chega em n, ele produz uma string sem terminador
      Na prática, strncpy quase nunca deveria ser usado; ele serve para campos de tamanho fixo como struct dirent { unsigned short inode; char name[14]; };
      Mesmo nesses casos, com frequência os bytes de preenchimento deveriam ser espaços em vez de nul, e strncpy nunca deveria ter entrado na biblioteca padrão
    • Se você desenvolve em C/C++ no Windows, pode usar as funções de strsafe.h (https://learn.microsoft.com/en-us/windows/win32/api/strsafe/)
      Quando eu usava C/C++, achava mais fácil trabalhar com elas do que com as funções padrão de C, porque tratavam falhas comuns como buffer pequeno demais ou overflow de inteiro, e todas retornavam códigos de erro, o que facilitava verificar falhas
      Neste caso, StringCchCopyW() ou StringCbCopyW() seriam escolhas melhores do que strcpy
    • Li certa vez que Tony Hawk costumava andar de carro e, ao ver skatistas, gritava “manda um ollie”; se a pessoa conseguisse, ele lhe dava um capacete novo
  • É um pouco triste que esse exploit também se aplique ao THUG PRO
    A cena competitiva da série Tony Hawk está praticamente morta há quase 20 anos, com a breve exceção do remake THPS1+2, e esse mod ainda é jogado até hoje
    O próprio mod já tem mais de 10 anos e os desenvolvedores originais aparentemente saíram, então dá para entender por que, quando Ryan reportou o problema, ninguém quis corrigir. Mas agora ficou difícil usar esse mod por causa do risco de comprometimento total do PC
    Espero que este texto chegue a alguém disposto a corrigir o mod

    • Se eu tivesse tempo, parece o tipo de coisa divertida que eu tentaria fazer. Quando eu tinha mais tempo, cheguei a deixar o código-fonte do THUG1 quase jogável no Windows
      Aquele código era apenas para a versão de console, e assumir compilação para Windows não significava Xbox Windows, mas sim para ferramentas, então muita coisa funcionava de forma completamente diferente
  • O que parece ser o ícone de cabeçalho de seção antes do texto “So what's the habibi key?” é na verdade uma área de HTML details que se expande ao clicar, então vale a pena abrir se você tiver interesse
    A dúvida é: se a história de que a chave Habibi era usada exclusivamente pelo grupo Linux console para impedir o uso de conteúdo pirata for verdadeira, então onde, quando e como a chave privada correspondente foi tornada pública ou vazou?
    O autor alterou a diferença de 4 bytes entre a chave da Microsoft e a chave Habibi para executar um binário “não assinado”, que na prática estava assinado com a chave privada Habibi, então parece claro que ele obteve a chave privada

    • A chave Habibi é criada aplicando um patch à chave da Microsoft para que ela seja divisível por 3, então a fatoração na prática fica muito fácil
      A chave privada pode ser recuperada trivialmente a partir da chave pública, então na verdade não havia nada específico para ser tornado público ou vazado
      Basicamente, era um pequeno CTF criptográfico escondido dentro do hack de save de 007: Agent Under Fire, e o próprio hack do save também era praticamente um CTF bem ofuscado. Parece que havia tanto a intenção de sacanear usuários de pirataria quanto um desafio para outros engenheiros de reversão
  • Muito legal. Já mexi um pouco com decompilação de PSX, e lá também há várias coisas parecidas
    Curiosamente, algo como memmove é linkado da biblioteca do SDK[0], mas strcpy é uma função fornecida pela BIOS
    Em versões posteriores do SDK isso podia ser corrigido para a versão de biblioteca, mas até 1997 isso ainda não tinha sido feito
    0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...

    • Eu gostaria de ver versões reimplementadas de jogos antigos de console em C+SDL2 e OpenGL 2.1
      Agora que jogos de N64 estão sendo portados para PC por meio de decompiladores, isso dá esperança
      Dá para responder “mas esses jogos já têm versão para PC”, só que, se você recompilar um jogo de N64 e trocar os efeitos por texturas puras ou efeitos mais simples em vez de shaders, ele pode rodar praticamente em qualquer lugar, até em máquinas lentas como netbooks baratos de 2009
      Também houve um caso de portar Super Mario 64 para a API 3DFX. Jogos que acessam o framebuffer do N64 de forma complexa provavelmente exigiriam OpenGL 3.3 para emular esse microcódigo, mas se o motor roda muito rápido em hardware desde a época do Pentium III, então não seria tão difícil deixar o restante acelerado em GL 2.1 e emular só algumas partes via software
  • Já li muitas análises desse tipo de exploit em várias formas, e ficaria feliz em ler mais 100 no futuro

  • Isso parece um bom exemplo de mentalidade de segurança equivocada no desenvolvimento para consoles
    A ideia de que “os dados de save só podem ser usados por nós, então basta fazer parse apenas do que nós mesmos escrevemos” é comum em consoles, mas está fundamentalmente errada, porque as pessoas podem preparar saves artificialmente
    Separadamente disso, consoles não deveriam tratar o usuário como inimigo, mas, se de qualquer forma fazem isso, então os jogos também precisam ter uma mentalidade de segurança compatível com essa posição

    • Hoje isso se tornou realidade até certo ponto. Os consoles atuais todos criptografam e assinam os arquivos de save, vinculando-os à conta, e a maioria deles — não sei no caso do Xbox — impede copiar saves para qualquer lugar além do próprio console e do armazenamento em nuvem pago
    • Em um computador comum, eu concordaria 100% com a ideia de que “consoles não deveriam tratar o usuário como inimigo”, mas com consoles a sensação é um pouco diferente
      Se você não limitar o que o usuário pode fazer, não sei como seria possível impedir trapaça em jogos online
  • Em defesa de Tony Hawk, ele é um skatista profissional, não um analista de segurança
    O tempo limitado que ele passou na frente de um teclado no fim dos anos 90 e começo dos anos 2000 provavelmente foi usado não para auditar buffer overruns, mas para fazer com que um 900 McTwist parecesse natural em um jogo que se tornaria uma série icônica

  • Tive a chance de confirmar uma lenda que ouvi quando era criança. Foi Tony Hawk quem acertou um 720 pela primeira vez?

    • Segundo https://en.wikipedia.org/wiki/Aerial_(skateboarding), “o 720, isto é, uma manobra com duas rotações completas no ar, é uma das manobras mais raras do skate, e foi completada pela primeira vez por Tony Hawk em 1985, sem ter sido planejada”
      Provavelmente isso quer dizer “a primeira vez registrada”, mas, se outra pessoa já tivesse feito, é bem provável que tivesse saído contando por aí, e alguém capaz de fazer isso provavelmente seria um skatista profissional de qualquer maneira