
Eigenständiges Heartbleed-Labor (CVE-2014-0160): erstellt verwundbares OpenSSL 1.0.1f in Docker und enthält einen Python-Speicherleck-PoC für autorisierte Tests.
Ein kleines, in sich geschlossenes Lab für CVE-2014-0160 (Heartbleed) — den TLS-Heartbeat-Over-Read in OpenSSL 1.0.1–1.0.1f. Es baut das tatsächlich verwundbare OpenSSL aus festgeschriebenem Upstream-Quellcode in einem Wegwerf-Container, stellt es bereit und enthält einen Proof-of-Concept-Client, der Live-Prozessspeicher daraus leakt.
Nur für autorisierte Labornutzung. Alles hier zielt auf
localhost/ einen Container, den du selbst betreibst. Richte das PoC nicht auf einen Host, den du nicht besitzt und für den du keine ausdrückliche Testgenehmigung hast — die unbefugte Nutzung von Heartbleed gegen Live-Systeme ist in den meisten Rechtsordnungen eine Straftat. Heartbleed wurde in OpenSSL 1.0.1g (April 2014) behoben; dieses Lab existiert, um den Bug zu verstehen, nicht um jemanden anzugreifen.
| Pfad | Was es ist |
|---|---|
Dockerfile | Baut OpenSSL 1.0.1f aus checksummen-festgeschriebenem Upstream-Quellcode mit aktivierten Heartbeats, generiert ein Wegwerf-Zertifikat und führt openssl s_server aus — den echten verwundbaren Server. |
exploit/heartbleed.py | Python-3-PoC. Sendet einen fehlerhaften Heartbeat und gibt den Speicher, den der Server zurückleakt, als Hexdump aus. Beendet sich mit 0, wenn das Ziel verwundbar ist, mit 1, wenn gepatcht. |
demo/server.py | Eine naive Simulation in reinem Python — kein OpenSSL beteiligt. Sie spiegelt blind 64 KB zurück und leakt nichts Echtes; nur beibehalten, um die Form einer Over-Read-Antwort zu zeigen. |
demo/gen-cert.sh | Generiert das Wegwerf-localhost-Zertifikat für die Demo neu. |
Es werden keine privaten Schlüssel eingecheckt — Zertifikate werden lokal generiert (siehe .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
Ein verwundbarer Server gibt einen Hexdump des geleakten Speichers aus. Führe das PoC ein paar Mal erneut aus — jede Anfrage liefert einen anderen Ausschnitt des Heaps zurück, was genau der Grund ist, warum Heartbleed so gefährlich war: Session-Cookies, Formulardaten und privates Schlüsselmaterial liegen alle dort.
cd demo
./gen-cert.sh
python3 server.py
Dies ist nicht die CVE — es ist ein Lehr-Stub, der immer mit 64 KB As antwortet.
Die TLS-Heartbeat-Anfrage enthält eine Nutzlast plus ein Längenfeld. Verwundbares OpenSSL vertraut der vom Angreifer gelieferten Länge und memcpyt so viele Bytes aus dem Anfragepuffer in die Antwort — aber die Anfrage enthielt nie so viele Daten, sodass die Kopie darüber hinaus in den angrenzenden Prozessspeicher liest. Der Fix in 1.0.1g ist eine Grenzprüfung: if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; — jeder Heartbeat, der mehr behauptet, als tatsächlich gesendet wurde, wird stillschweigend verworfen.
-DOPENSSL_NO_HEARTBEATS.