连接复用没清干净:curl 8.17–8.20 修掉的 33 个凭据与状态泄漏 CVE
curl 官方漏洞汇总页()在 8.16.0 页面上列出 33 个已公布漏洞,其中相当一部分是连接复用(connection reuse)相关的凭据/状态泄漏,修复版本分布在 8.17.0 到 8.20.0 之间。对写 HTTP 客户端和做运维的人来说,这批问题的共同点是:连接池救回了握手开销,也顺手把上一个请求的身份、代理、TLS 要求和 Cookie 状态带到了下一个请求。
下面按影响区间上限分组,条目格式为「CVE 编号(严重级):问题,影响版本区间」。
影响至 8.20.0
- CVE-2026-12064(低):proto-default 跳过 SSH 校验,7.81.0–8.20.0
- CVE-2026-11856(中):跨源 Digest 认证状态泄漏,7.10.6–8.20.0
- CVE-2026-11586(低):WS Auto-PONG 内存耗尽,8.16.0–8.20.0
- CVE-2026-10536(低):HTTP/2 stream-dependency tree 释放后使用,7.88.0–8.20.0
- CVE-2026-9547(低):SSH 主机校验不当,7.69.0–8.20.0
- CVE-2026-9545(低):暴露 HTTP/3 early data,8.11.0–8.20.0
- CVE-2026-9080(低):socket 回调中 pause 之后释放后使用,8.13.0–8.20.0
- CVE-2026-9079(中):过期代理密码泄漏,8.8.0–8.20.0
- CVE-2026-8932(低):连接复用中 mTLS 配置匹配不完整,7.7–8.20.0
- CVE-2026-8927(中):环境变量设置的跨代理 Digest 认证状态泄漏,7.12.0–8.20.0
- CVE-2026-8926(低):netrc 与 URL 中用户名同时存在时密码泄漏,8.11.1–8.20.0
- CVE-2026-8925(中):SASL double-free,8.15.0–8.20.0
- CVE-2026-8924(低):结尾点域名导致的 super cookie,7.46.0–8.20.0
- CVE-2026-8458(低):不同服务之间错误复用连接,7.43.0–8.20.0
- CVE-2026-8286(低):STARTTLS 连接被错误复用,7.30.0–8.20.0
影响至 8.19.0
- CVE-2026-7168(中):跨代理 Digest 认证状态泄漏,7.12.0–8.19.0
- CVE-2026-6429(中):复用代理连接导致 netrc 凭据泄漏,7.14.0–8.19.0
- CVE-2026-6276(低):自定义 Cookie 主机过期导致 Cookie 泄漏,7.71.0–8.19.0
- CVE-2026-6253(中):重定向到代理时泄漏代理凭据,7.14.1–8.19.0
- CVE-2026-5773(低):SMB 连接错误复用,7.40.0–8.19.0
- CVE-2026-5545(中):HTTP Negotiate 连接错误复用,7.10.6–8.19.0
- CVE-2026-4873(低):连接复用忽略 TLS 要求,7.20.0–8.19.0
影响至 8.18.0
- CVE-2026-3805(中):SMB 连接复用中的释放后使用,8.13.0–8.18.0
- CVE-2026-3784(低):带凭据的代理连接错误复用,7.7–8.18.0
- CVE-2026-3783(中):重定向配合 netrc 导致 token 泄漏,7.33.0–8.18.0
- CVE-2026-1965(中):HTTP Negotiate 连接错误复用,7.10.6–8.18.0
影响至 8.17.0
- CVE-2025-15224(低):未设置 agent 时 libssh 密钥口令被绕过,7.58.0–8.17.0
- CVE-2025-15079(低):libssh 全局 known_hosts 被覆盖,7.58.0–8.17.0
- CVE-2025-14819(低):OpenSSL 部分链存储策略绕过,7.87.0–8.17.0
- CVE-2025-14524(低):跨协议重定向泄漏 bearer token,7.33.0–8.17.0
- CVE-2025-14017(中):线程化 LDAPS 的 TLS 选项失效,7.17.0–8.17.0
- CVE-2025-13034(中):GnuTLS 下 QUIC 证书固定未生效,8.8.0–8.17.0
- CVE-2025-10966(低):wolfSSH 缺少 SFTP 主机校验,7.69.0–8.16.0
根因
连接复用的凭据泄漏,根因是多协议、多代理共用连接池时,从池中取回连接前没有严格匹配认证状态、TLS 要求、代理和主机。协议切换(HTTP 到 SMB、SFTP、LDAPS)、代理切换、重定向跨源或跨协议这几类场景最容易踩中:连接键只看了部分维度,身份维度被漏掉,于是 Digest、Negotiate、netrc、bearer token、代理密码就跟着连接走到了下一个目标。
升级与自查
升级到 8.20.0+,最好直接上 8.21.0。curl releases 页()显示最新版本已到 8.21.0(2026-06-24),下一次发布计划为 2026-09-02。代码仓库在 。
自查顺序:
- 命令行侧
curl -V,看首行版本与 TLS/SSH 后端版本;发行版可能回移补丁,版本号不是唯一判断依据。 - 应用侧查 libcurl 版本:
pkg-config --modversion libcurl、curl_version_info(),或直接看静态链接产物。 - 容器镜像、CI 基础镜像、网关/代理组件里各自捆绑的 curl/libcurl 都要单独确认,容易只升级一处。
- 有 LDAPS、SMB、SFTP、HTTP/3、代理链使用的服务优先处理。
用 libcurl 时降低风险
CURLOPT_FRESH_CONNECT/CURLOPT_FORBID_REUSE:在身份切换、协议切换、代理切换的边界上强制新建连接,代价是握手开销。- 代理切换用独立的 easy handle,不要和直连请求共用同一个 handle 的连接池。
- 不要把不同身份目标(不同用户、不同 token、不同 mTLS 证书)的请求丢进同一个复用池。
- 使用 netrc 时收紧权限与范围,避免与 URL 内嵌用户名混用。
- 重定向跨协议、跨主机时显式校验,必要时禁用自动重定向或限制协议集合。
- 复用前把 TLS 要求、代理、主机作为连接键的一部分来考虑,而不是只按 host:port 判断。