Heartbleed:少一次边界检查,OpenSSL 就能被人一口口“吸”走服务器内存
目录
配图:AI 生成的概念示意图,非论文原图、真实现场或实验数据。
TL;DR:2014 年 4 月公开的 Heartbleed(CVE-2014-0160)是 OpenSSL 心跳扩展里的一个实现缺陷:服务器没有核对请求声称的数据长度,就按这个长度回传内存内容。攻击者每次最多拿到约 64KB,但可以反复请求。官方页面称,密钥、账号密码、会话 Cookie 都可能被读出,而且不留日志痕迹。本文不给“受影响服务器总数”,因为没有交叉确认到可靠数字。
这是一个 2014 年的旧事,不是今天的新闻,但它至今仍是“小失误如何放大成全球事件”的教科书案例。
一个心跳,一次没检查的长度
TLS 的心跳扩展很简单:一方发来一段数据并说明长度,另一方原样回传,用来确认连接还活着。
问题出在 OpenSSL 1.0.1 到 1.0.1f 的实现上:它信了请求里声明的长度,却没检查真实数据有多长。于是攻击者发一个只有几个字节、却声称有 64KB 的“心跳”,服务器就会把那段数据后面紧挨着的内存也一起送回去。这类缺陷在公开资料里被归为缺少边界检查的输入验证错误。
能拿到什么
heartbleed.com 列出的风险包括:证书的私钥、用户名和密码、会话 Cookie 与会话密钥,以及邮件、即时消息和业务文档。64KB 只是单次请求的上限,攻击者可以不断重复。
私钥泄露尤其麻烦:只升级软件不够,证书要重新签发,用户密码也得换。
时间线
据该页面,这个缺陷在 2011 年 12 月被引入,随 2012 年 3 月的 OpenSSL 1.0.1 发布,潜伏了两年多。Codenomicon 团队于 2014 年 4 月 3 日发现,Google 的 Neel Mehta 也独立发现并上报。2014 年 4 月 7 日漏洞公开,OpenSSL 1.0.1g 同日发布修复。无法升级的,可以用 -DOPENSSL_NO_HEARTBEATS 重新编译,关掉心跳功能。
真实的受害者
加拿大税务局(CRA)在 4 月 14 日确认,约 900 名纳税人的社会保险号被人利用 Heartbleed 从其系统中取走。据报道,加拿大皇家骑警当时请求税务局推迟公开,以便调查。时间窗口各家报道略有出入,较多说法是 4 月 8 日前后的几个小时。
为什么值得记住
一次长度校验,就让依赖 OpenSSL 的大量网站同时暴露。更让人不安的是,攻击不留痕迹,事后无法确认自己是否被偷过。
这也促使业界重新审视:全世界的加密基础设施,竟靠少数人维护的开源代码撑着。
- 交叉核对:US-CERT TA14-098A
- 加拿大税务局事件:Global News