
Laboratório autocontido do Heartbleed (CVE-2014-0160): compila o OpenSSL 1.0.1f vulnerável no Docker e inclui um PoC de vazamento de memória em Python para testes autorizados.
Um laboratório pequeno e autónomo para CVE-2014-0160 (Heartbleed) — a leitura excessiva (over-read) do heartbeat TLS no OpenSSL 1.0.1–1.0.1f. Compila o OpenSSL genuinamente vulnerável a partir do código-fonte upstream fixado (pinned) num contentor descartável, serve-o, e inclui um cliente proof-of-concept que extrai memória viva do processo a partir dele.
Apenas para uso autorizado em laboratório. Tudo aqui tem como alvo
localhost/ um contentor que executas tu próprio. Não apontes o PoC para qualquer host que não te pertença e para o qual não tenhas permissão explícita de teste — o uso não autorizado do Heartbleed contra sistemas em produção é um crime na maioria das jurisdições. O Heartbleed foi corrigido no OpenSSL 1.0.1g (abril de 2014); este laboratório existe para compreender o bug, não para atacar ninguém.
| Caminho | O que é |
|---|---|
Dockerfile | Compila o OpenSSL 1.0.1f a partir do código-fonte upstream com checksum fixado e heartbeats ativados, gera um certificado descartável e executa openssl s_server — o servidor vulnerável real. |
exploit/heartbleed.py | PoC em Python 3. Envia um heartbeat malformado e faz hexdump da memória que o servidor devolve. Termina com 0 se o alvo for vulnerável, 1 se estiver corrigido. |
demo/server.py | Uma simulação ingénua em Python puro — sem OpenSSL envolvido. Devolve cegamente 64 KB e não vaza nada real; mantido apenas para mostrar a forma de uma resposta de leitura excessiva. |
demo/gen-cert.sh | Regenera o certificado descartável de localhost para a demonstração. |
Nenhuma chave privada é incluída no repositório — os certificados são gerados localmente (ver .gitignore).
# 1. Build and start the vulnerable server (needs Docker)
docker build -t heartbleed-lab .
docker run --rm -p 8443:8443 heartbleed-lab
# 2. In another terminal, bleed it
python3 exploit/heartbleed.py 127.0.0.1 -p 8443
Um servidor vulnerável imprime um hexdump da memória vazada. Executa o PoC várias vezes — cada pedido devolve uma fatia diferente do heap, que é exatamente por isso que o Heartbleed era tão perigoso: cookies de sessão, dados de formulários e material de chaves privadas vivem todos lá.
cd demo
./gen-cert.sh
python3 server.py
Isto não é o CVE — é um stub didático que responde sempre com 64 KB de As.
O pedido de heartbeat TLS transporta um payload mais um campo de comprimento. O OpenSSL
vulnerável confia no comprimento fornecido pelo atacante e faz memcpy desse número de bytes
do buffer do pedido para a resposta — mas o pedido nunca continha tantos dados, pelo que a
cópia lê para além dele, para a memória adjacente do processo que ali esteja. A correção no 1.0.1g é
uma verificação de limites: if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; — descartar
silenciosamente qualquer heartbeat que declare mais do que foi efetivamente enviado.
-DOPENSSL_NO_HEARTBEATS.