当前位置:首页 > 时尚

漏洞对比

```html 漏洞对比

漏洞对比

2014年4月,OpenSSL的漏洞对比Heartbleed漏洞公开那天,我正蹲在机房调一个C语言写的漏洞对比网关服务。同事甩过来一条链接,漏洞对比说“出大事了”。漏洞对比我扫了一眼——读取内存越界,漏洞对比攻击者能直接拿到服务器进程里的漏洞对比私钥、会话Cookie、漏洞对比密码。漏洞对比当时我们那台破网关用的漏洞对比也是OpenSSL,版本刚好落在受影响区间。漏洞对比冷汗瞬间就下来了。漏洞对比

但真正让我记到现在的漏洞对比,是漏洞对比后来对比Heartbleed和三年后爆出的另一个大洞——EternalBlue(永恒之蓝)。这两个漏洞在技术层面完全是漏洞对比两码事,可它们对现实世界的冲击方式,却像照镜子一样映出安全圈最讽刺的规律。

Heartbleed的根子出在TLS心跳扩展的实现上。RFC 6520规定,客户端发一个“心跳请求”,里面带一个 payload 和它声称的长度。服务端该做的是:只回传 payload 里实际有的那些字节。但OpenSSL的代码里,长度字段被直接信任了——memcpy(bp, pl, payload); 这行里,payload来自攻击者,想写多大写多大。结果服务端把自己内存里相邻的64KB数据原封不动吐了回去。就这么简单,简单到让人想骂人。

/* 有漏洞的代码片段(简化) */
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
/* 把请求里的payload长度直接当成了拷贝长度 */
memcpy(bp, pl, payload);

EternalBlue呢?它是NSA武器库里的SMB协议漏洞,利用的是Windows内核里对SMBv1数据包长度校验的疏漏。攻击者构造一个特制数据包,就能让内核在非分页池里越界写数据,最终执行任意代码。一个读、一个写,破坏力方向不同。Heartbleed是往外漏,EternalBlue是往里灌。可它们都栽在同一个坑里:对输入长度的盲目信任。

有意思的是修复过程。OpenSSL团队在Heartbleed公开后48小时内就发了补丁,一行边界检查的事。但全球几十万台服务器、路由器、防火墙,花了几个月才陆续打上。有些嵌入式设备到今天都没修——因为厂商早就不维护了。EternalBlue更离谱,微软在2017年3月就发了MS17-010补丁,可两个月后WannaCry还是横扫了150个国家。那些没打补丁的机器,很多是医院、学校、政府机构的XP系统,它们不是不知道有补丁,是没人敢重启。

我后来在内部做分享时说过一个观点:漏洞的严重性从来不只取决于CVSS评分。Heartbleed的CVSS是7.5,EternalBlue是9.3,但真正决定破坏规模的,是修复的摩擦力。一个需要停机维护的补丁,和一个热更新就能解决的补丁,落地速度能差出几个数量级。安全圈总爱聊漏洞利用的优雅程度,可现实里,“能不能马上打上”比“漏洞有多精妙”重要得多。

还有个细节。Heartbleed泄露的数据里,最要命的是私钥。但私钥泄露后,攻击者还得去解密历史流量——如果服务器没开完美前向保密(PFS),那确实完蛋。EternalBlue就粗暴多了,直接拿系统权限,想干嘛干嘛。一个像小偷配了钥匙慢慢翻抽屉,一个像直接踹门进去搬保险柜。技术控们喜欢分析前者,因为精巧;但后者才是真正让运维半夜爬起来骂娘的那种。

我自己的判断是:未来十年,类似EternalBlue这种“协议层信任边界缺失”的漏洞会越来越少——因为大厂开始用Rust重写核心组件了。但Heartbleed式的“实现层手滑”永远不会消失。只要还有人写C,只要还有memcpy,就总有人忘了检查长度。区别只在于,下一个Heartbleed可能藏在一个你从没听说过的开源库里,而那个库的维护者,上个月刚因为没工资停更了。

漏洞对比到最后,比的不是技术,是人。写代码的人、打补丁的人、决定要不要重启服务器的人。技术控容易陷进细节里,但细节之外,那些拖延、侥幸、资源不足,才是漏洞真正活下来的土壤。

```

分享到: