curl 8.22 修复 Negotiate 连接复用问题:代理自动化审计指南

curl 项目于 2026 年 9 月 2 日随 curl 8.22.0 披露 CVE-2026-19931。问题涉及使用 Negotiate 认证建立的 HTTP 连接:空凭据代表由操作系统提供的“环境用户”时,如果该身份在 libcurl 不知情的情况下变化,后续请求可能复用仍以先前用户认证的连接。
curl 公告将其评级为中等,受影响版本为 7.64.1 至 8.21.0,curl 8.22.0 已修复。项目首选建议是升级;无法立即升级时,官方缓解方式是禁止使用空凭据的传输复用连接。
对运行代理数据采集、市场研究、广告验证或内部自动化的团队,结论应当准确:凡是进程、用户或任务会共享连接状态,都应盘点 libcurl。不要声称所有代理密码或住宅代理会话都受影响;触发条件必须符合 curl 描述的 Negotiate 与环境凭据组合。
明确问题边界
Negotiate 认证可以从 Windows 的 SSPI 或其他系统的 GSSAPI 获取凭据。在受影响的空凭据模式中,认证提供方背后的环境用户可能变化,而 libcurl 无法感知。
风险来自跨身份复用连接,不是 DNS 或代理出口轮换。持久连接可以保留认证上下文,即使应用认为下一次请求属于另一用户。
它也不同于普通 HTTP 407 排错。认证成功不能证明连接属于当前预期主体。
判断触发条件是否存在
对每个嵌入 libcurl 的应用回答:
- 运行中的 libcurl 是否为 7.64.1 至 8.21.0?
- 是否有请求使用 HTTP Negotiate 认证?
- 是否使用空凭据,由认证提供方取得环境身份?
- 可复用连接仍在池中时,环境身份是否可能变化?
任一答案为否,应记录为什么不可触达;全部为是或未知,则应纳入修复与验证。
盘点不能只看 curl 命令行。许多桌面代理、SDK、数据工具和内部服务会嵌入 libcurl。应同时记录应用版本与实际加载的运行时库版本。
优先升级
干净的修复方式是通过应用支持的更新渠道部署 curl 或 libcurl 8.22.0 及以上版本,并确认容器或软件包在运行时确实加载了已修复库。
安全上线顺序:
- 建立受影响与未知组件清单;
- 优先处理共享进程、服务账号与多用户主机;
- 更新金丝雀环境;
- 重启或排空可能保留旧连接的进程;
- 执行身份隔离测试;
- 按工作负载与地区扩展;
- 设定回滚标准,但不得回滚到有问题的库。
无法立即升级时,针对准确受影响流程采用 curl 项目给出的缓解:禁止空凭据连接复用。同时评估性能影响,避免临时方案造成无上限建连风暴。
建立身份隔离测试
仅使用已授权测试服务与合成主体,不得使用真实客户会话。
每次请求记录:
client_build
loaded_libcurl_version
auth_scheme
credential_mode
synthetic_principal_alias
connection_reused
connection_alias
server_observed_principal_alias
request_result
别名不能包含用户名、票据、Cookie 或认证材料。
测试顺序:
- 在受影响配置下,以合成主体 A 发出请求;
- 保持客户端进程与连接池存活;
- 通过受支持测试机制切换环境身份到主体 B;
- 向同一授权主机发送第二个请求;
- 比较预期主体与服务端观察主体;
- 升级后以及关闭复用时分别重复。
修复后的结果必须让每次请求对应预期主体,或创建正确隔离的连接。最终 HTTP 成功码本身不够。
让代理连接池显式分区
即使不涉及该 CVE,连接池也应有明确隔离键。根据客户端和协议,可能包括:
- 代理网关主机与端口;
- 认证方案;
- 凭据或服务账号身份;
- 租户或工作负载边界;
- TLS 策略与客户端证书;
- 目标 authority;
- 必需地区或路由策略。
不了解客户端复用规则时,不要自行在库外包装连接池。优先使用受维护版本和官方隔离控制。
监控运维回归
禁止复用或排空连接池会增加建连、TLS 握手与认证次数。修复期间监控:
- 每秒新连接数;
- 代理认证延迟与失败;
- 首试成功率;
- 文件描述符与临时端口压力;
- p95 建连与请求延迟;
- 有上限的重试量;
- 每个有效结果的成本。
安全正确性是验收门槛,性能优化不能重新引入跨身份复用。
审计清单
- [ ] 已知实际运行的 libcurl 版本。
- [ ] 已定位 7.64.1 至 8.21.0。
- [ ] 已识别 Negotiate 认证流程。
- [ ] 空凭据与显式凭据模式已分开。
- [ ] 优先处理多用户与共享进程客户端。
- [ ] 已部署 8.22.0 或更高版本。
- [ ] 升级后旧连接池已排空。
- [ ] 合成 A 到 B 身份测试通过。
- [ ] 复用遥测不包含秘密。
- [ ] 临时禁用复用有容量限制。
- [ ] 代理 407 与 TLS 仍正常。
- [ ] 测试不使用真实用户身份数据。
相关内容可参考 98IP 的代理凭据轮换、curl 代理认证 407 排错和住宅代理会话粘性测试。
常见问题
所有 curl 代理请求都受影响吗?
不是。公告描述的是使用空凭据代表环境用户的 Negotiate 认证,并在环境身份变化后复用连接。应核对实际条件,而不是把所有 curl 使用都判定为受影响。
只升级 curl 命令行够吗?
如果应用嵌入或动态加载另一版本 libcurl,就不够。必须确认运行中进程使用的库。
清空连接池能代替升级吗?
不能。清空连接只能降低短期暴露,无法修复受影响版本的复用判断。应升级到修复版本,或升级前采用项目公布的缓解方法。
轮换代理出口可以缓解吗?
不可以。问题涉及认证连接身份。轮换出口 IP 不会纠正错误认证连接,反而可能让证据更难解释。
合规说明
只在已授权系统和身份上验证。不得对第三方服务或真实用户会话复现问题。保护认证材料、最小化日志、遵守事件响应要求,并仅将代理用于合法任务。
来源说明:curl 项目,《Negotiate ambient user conn reuse》,CVE-2026-19931,发布于 2026 年 9 月 2 日。