
Автономная лаборатория Heartbleed (CVE-2014-0160): собирает уязвимый OpenSSL 1.0.1f в Docker и включает Python PoC для утечки памяти, предназначенный для авторизованного тестирования.
Небольшая автономная лаборатория для CVE-2014-0160 (Heartbleed) — переполнение при чтении в heartbeat-расширении TLS в OpenSSL 1.0.1–1.0.1f. Она собирает действительно уязвимый OpenSSL из зафиксированного upstream-исходника в одноразовом контейнере, запускает его и включает клиент proof-of-concept, который утекает живую память процесса.
Только для авторизованного использования в лаборатории. Всё здесь нацелено на
localhost/ контейнер, который вы запускаете сами. Не направляйте PoC на любой хост, которым вы не владеете и на тестирование которого у вас нет явного разрешения — неавторизованное использование Heartbleed против живых систем является преступлением в большинстве юрисдикций. Heartbleed был исправлен в OpenSSL 1.0.1g (апрель 2014); эта лаборатория существует, чтобы понять баг, а не атаковать кого-либо.
| Путь | Что это |
|---|---|
Dockerfile | Собирает OpenSSL 1.0.1f из upstream-исходника с проверкой контрольной суммы и включёнными heartbeat, генерирует одноразовый сертификат и запускает openssl s_server — настоящий уязвимый сервер. |
exploit/heartbleed.py | PoC на Python 3. Отправляет некорректный heartbeat и выводит hexdump памяти, которую сервер утекает обратно. Завершается с кодом 0, если цель уязвима, 1 если пропатчена. |
demo/server.py | Наивная симуляция на чистом Python — OpenSSL не задействован. Она слепо возвращает 64 КБ и не утекает ничего реального; оставлена только чтобы показать форму ответа при переполнении чтения. |
demo/gen-cert.sh | Перегенерирует одноразовый сертификат localhost для демо. |
Приватные ключи не коммитятся — сертификаты генерируются локально (см. .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
Уязвимый сервер выводит hexdump утёкшей памяти. Запустите PoC несколько раз — каждый запрос возвращает другой срез кучи, и именно поэтому Heartbleed был настолько опасен: сессионные cookie, данные форм и материал приватного ключа — всё живёт там.
cd demo
./gen-cert.sh
python3 server.py
Это не CVE — это учебная заглушка, которая всегда отвечает 64 КБ символов A.
Запрос heartbeat в TLS несёт полезную нагрузку плюс поле длины. Уязвимый OpenSSL
доверяет длине, указанной атакующим, и выполняет memcpy такого количества байт из
буфера запроса в ответ — но запрос никогда не содержал столько данных, поэтому
копирование читает за его пределами в ту смежную память процесса, что там оказалась. Исправление в 1.0.1g —
это проверка границ: if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; — молча
отбрасывать любой heartbeat, который заявляет больше, чем было фактически отправлено.
-DOPENSSL_NO_HEARTBEATS.