Heap Overflow e o destravamento do PS3

- por Sergio Prado

Categorias: Hacking, Linguagem C Tags: , , ,

Todos os consoles modernos de videogame possuem uma arquitetura bem parecida com os computadores pessoais. E poderiam executar qualquer tipo de aplicação, mas são travados. Só permitem que você coloque o disco no leitor e execute o jogo. E isso motiva hackers de plantão a desbloquearem os consoles, possibilitando rodar aplicações específicas, chamadas de homebrews. Permite também que você faça backup de seus jogos em disco e consiga executá-los a partir deste backup, o que acaba criando uma tremenda dor de cabeça para os fabricantes, pois ele torna possível a pirataria.

Não quero entrar aqui em questões legais ou filosóficas sobre a pirataria. Meu objetivo é puramente educacional. Entender falhas de segurança e como evitá-las são pontos cruciais para o desenvolvimento de qualquer produto com software/hardware embarcado.

Então, para evitar a pirataria, os fabricantes desenvolvem esquemas “mirabolantes” de segurança. Até que alguém descubra uma brecha (e elas sempre vão existir). O Xbox360 da Microsoft e o Wii da Nintendo duraram pouco. Já o PS3 ficou quase 4 anos no mercado sem que alguém conseguisse destravá-lo. Até que no final de agosto foi anunciado seu desbloqueio. A solução: um pendrive com um hardware especifico conectado à USB do PS3, e um software embarcado para fazer o trabalho sujo.

Não demorou muito para esta solução se tornar open-source, chamada de PSGroove, usando um USBKey da Atmel (AT90USB162, AT90USB646, etc) que pode ser comprado por menos $35, e um software open-source disponibilizado aqui.


 O papel do hardware é apenas disponibilizar uma porta USB para conexão com o PS3. Toda a mágica é feita pelo software, e para entender como ele funciona, precisamos conhecer o esquema de segurança do PS3.

SEGURANÇA no PS3

A segurança do PS3 está basicamente em dois elementos, o Hypervisor e a encriptação do disco Blu-ray.

O Hypervisor é o sistema operacional do PS3 com permissão de acesso total ao hardware (nível 1 ou lvl1). No boot, ele executa um código que roda em nível 2 ou lvl2 (appldr), responsável pela leitura, descriptografia e execução dos discos Blu-ray. Portanto, se queremos rodar um jogo a partir de um backup em disco, precisamos de privilégios no mínimo em nível 2.

Além disso, existe a criptografia dos discos Blu-ray. Todo o conteúdo do disco é criptografado, e a chave usada na criptografia fica numa região específica do disco chamada ROM Mark. Os drivers Blu-ray de mercado não conseguem ler esta região. Você precisaria de um drive Blu-ray especifico com um firmware hackeado. Isso explica porque você não consegue fazer cópias de discos Blu-ray.

Mas vamos supor que você consiga este hardware específico, e consiga um dump do ROM Mark. Esta região esta criptografada, e apenas o firmware do drive de Blu-ray do PS3 consegue lê-la. Então você consegue fazer um dump deste firmware, mas acaba descobrindo que o mesmo também encontra-se criptografado, e é descriptografado pelo Hypervisor do PS3 no boot através de uma chave na NAND. Para complicar ainda mais, o próprio Hypervisor é criptografado, sendo descriptografado no boot por hardware.

Não é à toa que esse sistema demorou quase 4 anos para ser hackeado. Até que…

EXPLORANDO HEAP OVERFLOW

Em janeiro o Hypervisor foi hackeado por George Hotz, hacker do iPhone. Ele usou um mecanismo de ataque por hardware chamado de “glitching attack“. Abriu-se o caminho então para uma alternativa mais “amigável”, que veio meses mais tarde através do projeto PSGroove.

Este exploit usa uma técnica de Heap Overflow para a execução de códigos arbitrários com os mesmos privilégios do Hypervisor. O heap é uma região de memória usada para alocação dinâmica, e caracterizamos um Heap Overflow quando acessamos fora dos limites da região de memória previamente alocada. Ex:

1
2
3
4
5
6
void main()
{
    char *ptr = (char *)malloc(15);
 
    strcpy(ptr, "www.sergioprado.org");
}

Alocamos apenas 15 bytes, mas ultrapassamos este limite copiando uma string de 19 caracteres. As consequências são imprevisíveis, podendo por exemplo corromper dados de outros processos. Mas um exploit bem planejado pode se aproveitar desta falha para carregar em memória um código para ser executado.

PSGROOVE

É o que o PSGroove faz. Basicamente ele emula um hub USB de 6 portas, conectando e desconectando “dispositivos virtuais” e manipulando os descritores destes dispositivos USB, que são salvos em regiões de memória alocadas dinamicamente. Ou seja, ele tem o controle sobre as chamadas a malloc() e free() executadas em cada conexão/desconexão de um dispositivo USB virtual.

Após algumas tentativas, ele consegue fazer o heap apontar para o código do Hypervisor na RAM, sobrescrevendo-a com um código específico, e passando o controle para este. Tudo isso é possível porque o código do Hypervisor que faz a alocação/desalocação dos dispositivos USB não faz a checagem dos limites de cada buffer alocado. 

Uma descrição mais detalhada do que faz o PSGroove pode ser encontrada aqui, e o código-fonte deste exploit está disponível aqui.

Um abraço!

Sergio Prado.

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.