Pular para o conteúdo
Todos os conceitos

Ler além do que chegou

Confiar num tamanho informado, em vez de medir o dado, faz o programa devolver memória vizinha.

Um programa guarda dados em blocos de memória (buffers). Quando ele precisa copiar ou devolver um pedaço, usa um tamanho. Se esse tamanho vem de fora e não é conferido contra o que realmente chegou, o programa lê além do dado e pega o que estava ao lado na memória: isso é uma leitura além do limite (buffer over-read).

No Heartbleed (CVE-2014-0160), o heartbeat do TLS mandava um texto e o tamanho dele. O servidor devolvia tamanho bytes sem checar quantos bytes de texto chegaram. Mandando 3 bytes e dizendo 500, o cliente recebia 500: os 3 reais e 497 de memória vizinha, que podiam conter chaves, sessões e senhas de outros usuários. Nada de código rodava; só vazava memória (divulgação de informação).

O conserto foi conferir que o tamanho informado cabe no que chegou, e descartar o heartbeat se não couber. A regra: não confie num tamanho que veio junto com o dado; meça o dado.

payload_length = 500: tudo isto e devolvido ao cliente cat enviado: 3 bytes session=9f2a... memoria vizinha (497 bytes) um segredo de outro usuario vaza para o cliente
O cliente envia payload de 3 bytes mas diz 500; o servidor devolve 500 bytes, 3 reais e 497 de memória vizinha, onde está um segredo.

Aparece nestes desafios