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 的应用回答:

  1. 运行中的 libcurl 是否为 7.64.1 至 8.21.0?
  2. 是否有请求使用 HTTP Negotiate 认证?
  3. 是否使用空凭据,由认证提供方取得环境身份?
  4. 可复用连接仍在池中时,环境身份是否可能变化?

任一答案为否,应记录为什么不可触达;全部为是或未知,则应纳入修复与验证。

盘点不能只看 curl 命令行。许多桌面代理、SDK、数据工具和内部服务会嵌入 libcurl。应同时记录应用版本与实际加载的运行时库版本。

优先升级

干净的修复方式是通过应用支持的更新渠道部署 curl 或 libcurl 8.22.0 及以上版本,并确认容器或软件包在运行时确实加载了已修复库。

安全上线顺序:

  1. 建立受影响与未知组件清单;
  2. 优先处理共享进程、服务账号与多用户主机;
  3. 更新金丝雀环境;
  4. 重启或排空可能保留旧连接的进程;
  5. 执行身份隔离测试;
  6. 按工作负载与地区扩展;
  7. 设定回滚标准,但不得回滚到有问题的库。

无法立即升级时,针对准确受影响流程采用 curl 项目给出的缓解:禁止空凭据连接复用。同时评估性能影响,避免临时方案造成无上限建连风暴。

建立身份隔离测试

仅使用已授权测试服务与合成主体,不得使用真实客户会话。

每次请求记录:

client_build
loaded_libcurl_version
auth_scheme
credential_mode
synthetic_principal_alias
connection_reused
connection_alias
server_observed_principal_alias
request_result

别名不能包含用户名、票据、Cookie 或认证材料。

测试顺序:

  1. 在受影响配置下,以合成主体 A 发出请求;
  2. 保持客户端进程与连接池存活;
  3. 通过受支持测试机制切换环境身份到主体 B;
  4. 向同一授权主机发送第二个请求;
  5. 比较预期主体与服务端观察主体;
  6. 升级后以及关闭复用时分别重复。

修复后的结果必须让每次请求对应预期主体,或创建正确隔离的连接。最终 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 日。