
자체 포함형 Heartbleed(CVE-2014-0160) 실습 환경: Docker에서 취약한 OpenSSL 1.0.1f를 빌드하고, 승인된 테스트를 위한 Python 메모리 누출 PoC를 포함합니다.
CVE-2014-0160 (Heartbleed) — OpenSSL 1.0.1–1.0.1f의 TLS heartbeat over-read 취약점을 위한 작고 자족적인 실습 환경입니다. 일회용 컨테이너 안에서 체크섬으로 고정된 업스트림 소스로부터 실제로 취약한 OpenSSL을 빌드하고, 이를 서비스하며, 살아있는 프로세스 메모리를 유출하는 개념 증명 클라이언트를 포함합니다.
승인된 실습 용도로만 사용하세요. 여기의 모든 것은
localhost또는 직접 실행하는 컨테이너를 대상으로 합니다. 소유하지 않았거나 명시적인 테스트 허가를 받지 않은 호스트에 PoC를 향하게 하지 마세요 — 실제 시스템에 대한 Heartbleed의 무단 사용은 대부분의 관할권에서 범죄입니다. Heartbleed는 OpenSSL 1.0.1g (2014년 4월)에서 수정되었습니다. 이 실습은 버그를 이해하기 위해 존재하며, 누군가를 공격하기 위한 것이 아닙니다.
| 경로 | 설명 |
|---|---|
Dockerfile | 체크섬으로 고정된 업스트림 소스로부터 heartbeat가 활성화된 OpenSSL 1.0.1f를 빌드하고, 일회용 인증서를 생성한 뒤 openssl s_server를 실행합니다 — 실제 취약한 서버입니다. |
exploit/heartbleed.py | Python 3 PoC. 잘못된 heartbeat를 전송하고 서버가 유출한 메모리를 hexdump로 출력합니다. 대상이 취약하면 0, 패치되었으면 1로 종료합니다. |
demo/server.py | 순수 Python으로 작성된 단순한 시뮬레이션 — OpenSSL이 관여하지 않습니다. 64 KB를 무조건 반사할 뿐 실제로는 아무것도 유출하지 않으며, over-read 응답의 형태를 보여주기 위해서만 유지됩니다. |
demo/gen-cert.sh | 데모용 일회용 localhost 인증서를 재생성합니다. |
커밋된 개인 키는 없습니다 — 인증서는 로컬에서 생성됩니다 (.gitignore 참조).
# 1. 취약한 서버 빌드 및 시작 (Docker 필요)
docker build -t heartbleed-lab .
docker run --rm -p 8443:8443 heartbleed-lab
# 2. 다른 터미널에서 유출 실행
python3 exploit/heartbleed.py 127.0.0.1 -p 8443
취약한 서버는 유출된 메모리의 hexdump를 출력합니다. PoC를 몇 번 다시 실행해 보세요 — 각 요청은 힙의 서로 다른 조각을 반환합니다. 이것이 바로 Heartbleed가 그토록 위험했던 이유입니다: 세션 쿠키, 폼 데이터, 개인 키 자료가 모두 그곳에 존재합니다.
cd demo
./gen-cert.sh
python3 server.py
이것은 CVE가 아닙니다 — 항상 64 KB의 A로 응답하는 교육용 스텁입니다.
TLS heartbeat 요청은 페이로드와 길이 필드를 함께 전달합니다. 취약한 OpenSSL은
공격자가 제공한 길이를 신뢰하고 요청 버퍼로부터 그만큼의 바이트를 응답으로
memcpy합니다 — 하지만 요청에는 그만큼의 데이터가 결코 포함되지 않았으므로,
복사는 그 너머의 인접한 프로세스 메모리로 읽혀 들어갑니다. 1.0.1g의 수정은
경계 검사입니다: if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; —
실제로 전송된 것보다 더 많은 양을 주장하는 모든 heartbeat를 조용히 버립니다.
-DOPENSSL_NO_HEARTBEATS로 빌드하세요.