心脏滴血漏洞原理

 人参与 | 时间:2026-10-17 07:25:11

2014年4月7日,心脏安全研究员Neel Mehta在OpenSSL的滴血代码里发现了一个极其愚蠢的漏洞。这个漏洞后来被命名为Heartbleed,漏洞中文叫心脏滴血。原理它让全球三分之二的心脏网站服务器,在长达两年的滴血时间里,如同裸奔。漏洞

漏洞的原理根源,在于OpenSSL实现TLS心跳扩展时的心脏一个低级失误。心跳扩展,滴血就是漏洞让通信双方定期发送一个数据包,确认对方还活着。原理这个机制本身很平常,心脏就像两个人打电话时,滴血每隔几秒说一句"喂,漏洞你还在吗"。

问题出在实现细节上。服务器收到心跳请求后,需要原样返回请求中的数据。开发者用了一个变量记录请求数据的长度,但真正读取数据时,却用了另一个变量。两个变量数值不一致——前者是攻击者声明的长度,后者是实际数据的长度。

攻击者可以声明:"我要发送一段长达65535字节的数据",但实际只发送1字节。服务器信以为真,按照声明长度去内存中读取数据,然后原样返回。内存中那些不属于这次请求的数据——其他用户的密码、会话令牌、私钥——就被打包发送给了攻击者。

这就像你去银行取钱,填单子写"取100万",柜员不核对你的实际存款,直接打开金库,把里面所有现金都塞给你。而且这个动作可以重复执行,每次都能带出不同位置的内存数据。

更可怕的是,这个漏洞不影响服务器正常运行,不会留下任何痕迹。攻击者可以反复利用,每次窃取16KB内存数据。多试几次,就能拼凑出服务器的私钥。有了私钥,就能解密所有历史通信记录,还能冒充服务器发起中间人攻击。

我印象最深的是,当时有个安全团队做了个实验:他们用这个漏洞攻击自己的测试服务器,成功拿到了服务器的私钥,然后伪造了一个完全相同的网站,用户根本分辨不出来。

修复方案倒是简单,一行代码的事——检查请求长度是否与实际数据长度一致。但影响范围太大了,光是系统管理员升级OpenSSL就花了数月时间。有些小型网站甚至永远没有修复,至今仍暴露在风险中。

心脏滴血给我们的教训不是"开源软件不安全",而是"再优秀的程序员也会犯低级错误"。OpenSSL是全世界最重要的加密库,但它的代码长期由两三个兼职维护者管理,每年经费只有几千美元。这大概是网络安全史上性价比最高的攻击——花几小时写个脚本,就能攻破半个互联网的防线。

顶: 5819踩: 1