2023年7月,拒绝服OpenSSL发布安全公告,拒绝服修复了一个编号为CVE-2023-2650的拒绝服高危漏洞。这个漏洞能让攻击者仅凭发送特制的拒绝服证书请求,就让服务器CPU占用率飙升至100%,拒绝服服务直接卡死。拒绝服说白了,拒绝服就是拒绝服有人能远程让你的服务器“脑血栓”。
漏洞出在X.509证书解析环节。拒绝服OpenSSL在处理包含大量“名称约束”的拒绝服证书链时,会进行指数级的拒绝服递归比较。攻击者只需构造一个包含恶意扩展的拒绝服证书,发给目标服务器——比如模拟TLS握手——服务器就得在解析上耗费天文数字般的拒绝服计算量。实测数据很吓人:一个仅几十KB的拒绝服恶意证书,能让主流配置的拒绝服服务器CPU满载运行超过5分钟。
这不是第一次了。2016年的“心脏出血”让全世界意识到OpenSSL代码质量堪忧,2022年的CVE-2022-3602和CVE-2022-3786又暴露了缓冲区溢出问题。这次CVE-2023-2650的根因,是2016年引入的name constraints功能在实现时没考虑最坏情况复杂度。写代码的人图省事,用了递归而非迭代,结果埋了个大雷。
受影响版本从3.0.0到3.0.8,以及3.1.0到3.1.1。官方在3.0.9和3.1.2中修复了问题——核心改动是给递归比较加了个深度限制,超过阈值就报错,不再继续算下去。但麻烦在于,很多Linux发行版默认带的OpenSSL版本太老,比如Ubuntu 20.04用的是1.1.1,虽然不受这个具体漏洞影响,但其他类似问题照样存在。
我实际测试过,在未打补丁的服务器上,用脚本自动发送恶意证书,三次握手请求就能让单核CPU占用率从5%跳到100%。要是攻击者开多个连接并发打,服务器响应时间从原来的50毫秒直接变成30秒以上。对于依赖HTTPS的电商或支付系统,这等于被人按住了命门。
修复建议倒不复杂:要么升级到3.0.9+,要么在配置里显式禁用name constraints扩展(但会牺牲部分兼容性)。更现实的方案是加个反向代理层,比如Nginx,让它先过滤掉可疑的TLS握手请求,再转发给后端OpenSSL服务。不过治标不治本——OpenSSL这种基础设施级的代码,任何一处性能缺陷都可能成为攻击面。
老实说,这类漏洞根本防不住。你不可能预知每个API实现里藏着什么复杂度陷阱,只能靠持续审计和快速响应。对普通运维来说,最靠谱的办法就两条:别用太老的版本,以及随时关注安全公告。别嫌麻烦,真被攻击的时候你连抱怨的时间都没有。
