Heap Overflow e o destravamento do PS3

- por Sergio Prado

Categorias: Hacking, Linguagem C Tags: , , ,

Todos os con­soles mod­er­nos de videogame pos­suem uma arquite­tura bem pare­cida com os com­puta­dores pes­soais. E pode­riam exe­cu­tar qual­quer tipo de apli­cação, mas são trava­dos. Só per­mitem que você coloque o disco no leitor e exe­cute o jogo. E isso motiva hack­ers de plan­tão a des­blo­quearem os con­soles, pos­si­bil­i­tando rodar apli­cações especí­fi­cas, chamadas de home­brews. Per­mite tam­bém que você faça backup de seus jogos em disco e con­siga executá-los a par­tir deste backup, o que acaba criando uma tremenda dor de cabeça para os fab­ri­cantes, pois ele torna pos­sível a pirataria.

Não quero entrar aqui em questões legais ou filosó­fi­cas sobre a pirataria. Meu obje­tivo é pura­mente edu­ca­cional. Enten­der fal­has de segu­rança e como evitá-las são pon­tos cru­ci­ais para o desen­volvi­mento de qual­quer pro­duto com software/hardware embarcado.

Então, para evi­tar a pirataria, os fab­ri­cantes desen­volvem esque­mas “mirabolantes” de segu­rança. Até que alguém des­cubra uma brecha (e elas sem­pre vão exi­s­tir). O Xbox360 da Microsoft e o Wii da Nin­tendo duraram pouco. Já o PS3 ficou quase 4 anos no mer­cado sem que alguém con­seguisse destravá-lo. Até que no final de agosto foi anun­ci­ado seu des­blo­queio. A solução: um pen­drive com um hard­ware especi­fico conec­tado à USB do PS3, e um soft­ware embar­cado para fazer o tra­balho 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 com­prado por menos $35, e um soft­ware open-source disponi­bi­lizado aqui.

USBKeyAtmel Heap Overflow e o destravamento do PS3

 O papel do hard­ware é ape­nas disponi­bi­lizar uma porta USB para conexão com o PS3. Toda a mág­ica é feita pelo soft­ware, e para enten­der como ele fun­ciona, pre­cisamos con­hecer o esquema de segu­rança do PS3.

SEGURANÇA no PS3

A segu­rança do PS3 está basi­ca­mente em dois ele­men­tos, o Hyper­vi­sor e a encrip­tação do disco Blu-ray.

O Hyper­vi­sor é o sis­tema opera­cional do PS3 com per­mis­são de acesso total ao hard­ware (nível 1 ou lvl1). No boot, ele exe­cuta um código que roda em nível 2 ou lvl2 (appldr), respon­sável pela leitura, descrip­tografia e exe­cução dos dis­cos Blu-ray. Por­tanto, se quer­e­mos rodar um jogo a par­tir de um backup em disco, pre­cisamos de priv­ilé­gios no mín­imo em nível 2.

Além disso, existe a crip­tografia dos dis­cos Blu-ray. Todo o con­teúdo do disco é crip­tografado, e a chave usada na crip­tografia fica numa região especí­fica do disco chamada ROM Mark. Os dri­vers Blu-ray de mer­cado não con­seguem ler esta região. Você pre­cis­aria de um drive Blu-ray especi­fico com um firmware hack­eado. Isso explica porque você não con­segue fazer cópias de dis­cos Blu-ray.

Mas vamos supor que você con­siga este hard­ware especí­fico, e con­siga um dump do ROM Mark. Esta região esta crip­tografada, e ape­nas o firmware do drive de Blu-ray do PS3 con­segue lê-la. Então você con­segue fazer um dump deste firmware, mas acaba desco­brindo que o mesmo tam­bém encontra-se crip­tografado, e é descrip­tografado pelo Hyper­vi­sor do PS3 no boot através de uma chave na NAND. Para com­plicar ainda mais, o próprio Hyper­vi­sor é crip­tografado, sendo descrip­tografado no boot por hardware.

Não é à toa que esse sis­tema demorou quase 4 anos para ser hack­eado. Até que…

EXPLORANDO HEAP OVERFLOW

Em janeiro o Hyper­vi­sor foi hack­eado por George Hotz, hacker do iPhone. Ele usou um mecan­ismo de ataque por hard­ware chamado de “glitch­ing attack”. Abriu-se o cam­inho então para uma alter­na­tiva mais “amigável”, que veio meses mais tarde através do pro­jeto PSGroove.

Este exploit usa uma téc­nica de Heap Over­flow para a exe­cução de códi­gos arbi­trários com os mes­mos priv­ilé­gios do Hyper­vi­sor. O heap é uma região de memória usada para alo­cação dinâmica, e car­ac­ter­i­zamos um Heap Over­flow quando aces­samos fora dos lim­ites da região de memória pre­vi­a­mente alo­cada. Ex:

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

Alo­camos ape­nas 15 bytes, mas ultra­pas­samos este lim­ite copiando uma string de 19 car­ac­teres. As con­se­quên­cias são impre­visíveis, podendo por exem­plo cor­romper dados de out­ros proces­sos. Mas um exploit bem plane­jado pode se aproveitar desta falha para car­regar em memória um código para ser executado.

PSGROOVE

É o que o PSGroove faz. Basi­ca­mente ele emula um hub USB de 6 por­tas, conectando e desconectando “dis­pos­i­tivos vir­tu­ais” e manip­u­lando os descritores destes dis­pos­i­tivos USB, que são salvos em regiões de memória alo­cadas dinami­ca­mente. Ou seja, ele tem o con­t­role sobre as chamadas a mal­loc() e free() exe­cu­tadas em cada conexão/desconexão de um dis­pos­i­tivo USB virtual.

Após algu­mas ten­ta­ti­vas, ele con­segue fazer o heap apon­tar para o código do Hyper­vi­sor na RAM, sobrescrevendo-a com um código especí­fico, e pas­sando o con­t­role para este. Tudo isso é pos­sível porque o código do Hyper­vi­sor que faz a alocação/desalocação dos dis­pos­i­tivos USB não faz a checagem dos lim­ites de cada buffer alocado. 

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

Um abraço!

Ser­gio Prado.

  • caio átila

    parabéns pelas posta­gens do blog Sér­gio, acom­panho sem­pre que possível!

  • Pingback: Tweets that mention Heap Overflow e o destravamento do PS3 -- Topsy.com()

  • Sér­gio MacGyver

    Só uma cor­reção: é blu-ray
    :-)

  • http://sergioprado.org ser­gio­prado

    Olá Xará!

    É ver­dade! Pesqui­sei e acabei desco­brindo que eles removeram a letra “e” porque em alguns países não se pode reg­is­trar, para um nome com­er­cial, uma palavra comum.

    Valeu pela dica!

    Abraços!

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