一个用于 CVE-2014-0160 (Heartbleed) 的小型、自包含实验环境 —— 即 OpenSSL 1.0.1–1.0.1f 中的 TLS 心跳 越界读取漏洞。它在一个一次性容器中,从固定校验和的上游源码构建真正存在漏洞的 OpenSSL, 将其作为服务运行,并包含一个概念验证客户端,可从其中泄露实时进程内存。
仅限授权实验环境使用。 此处所有内容均针对
localhost/ 你自己运行的容器。 不要将 PoC 指向任何你不拥有且未获得明确测试许可的主机 —— 在大多数司法管辖区, 未经授权对在线系统使用 Heartbleed 属于犯罪行为。Heartbleed 已在 OpenSSL 1.0.1g (2014 年 4 月)中修复;本实验环境的存在是为了理解该漏洞,而非攻击任何人。
| 路径 | 说明 |
|---|---|
Dockerfile | 从校验和固定的上游源码构建启用了心跳功能的 OpenSSL 1.0.1f,生成一次性证书,并运行 openssl s_server —— 即真正存在漏洞的服务器。 |
exploit/heartbleed.py | Python 3 PoC。发送畸形心跳包,并对服务器泄露回来的内存进行十六进制转储。若目标存在漏洞则退出码为 0,若已修补则为 1。 |
demo/server.py | 纯 Python 的简单模拟 —— 不涉及 OpenSSL。它盲目回显 64 KB 数据,不会泄露任何真实内容;仅用于展示越界读取回复的形态。 |
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
存在漏洞的服务器会打印泄露内存的十六进制转储。多次重新运行 PoC —— 每次请求都会返回堆内存的不同片段,这正是 Heartbleed 如此危险的原因: 会话 cookie、表单数据以及私钥材料都存放在那里。
cd demo
./gen-cert.sh
python3 server.py
这不是该 CVE —— 它只是一个教学用的桩程序,始终回复 64 KB 的 A。
TLS 心跳请求携带一个有效载荷以及一个长度字段。存在漏洞的 OpenSSL
信任攻击者提供的长度,并从请求缓冲区中 memcpy 相应数量的字节到响应中 ——
但请求中从未包含那么多数据,因此复制操作会越过请求边界,读取到相邻进程内存中的任意内容。
1.0.1g 中的修复是一个边界检查:if (1 + 2 + payload + 16 > s->s3->rrec.length) return 0; ——
静默丢弃任何声称的数据量超过实际发送量的心跳包。
-DOPENSSL_NO_HEARTBEATS 进行构建。