彩色玻璃互联网数据流进入隔离生命周期存储区

HTTP/2 Server Push 允许服务器在客户端明确请求前主动提供额外资源。多数代理数据采集任务并不需要此功能;如果应用主动启用推送,就必须把父传输、接受的推送句柄、共享连接缓存和清理顺序视为同一个生命周期。

本指南提供一套受控审计流程,事实依据包括 curl 项目于 2026 年 9 月 2 日发布的 CVE-2026-18924。该低危问题在特定 HTTP/2 推送与共享连接组合下,可能在清理阶段触发释放后使用。curl 8.22.0 已修复该问题。

目标不是向公共网站发送异常流量,而是在授权测试环境中确认应用是否能进入相关路径,准确升级并保存足够的回归证据。

核对全部触发条件

官方公告要求同时满足:

  1. libcurl 应用通过 CURLMOPT_PUSHFUNCTION 启用 HTTP/2 推送;
  2. 应用通过 CURL_LOCK_DATA_CONNECT 共享连接;
  3. 使用 HTTPS 并协商为 HTTP/2;
  4. 服务器发送 HTTP/2 推送;
  5. 应用的回调接受该推送。

curl 命令行工具不受影响。没有启用推送回调、始终拒绝推送、从不共享连接或只使用 HTTP/1.1 的客户端,都不满足完整触发组合。

受影响版本为 curl 7.44.0 至 8.21.0,curl 8.22.0 及以上已修复。应盘点运行时行为,不能仅凭 HTTP/2 库、代理套餐或软件包名称推断。

代理团队为何仍需测试

代理增加了路由和连接池层,可能掩盖真实协商协议。请求可能通过 HTTP CONNECT 隧道与源站使用 HTTP/2,也可能在客户端到代理和代理到源站之间使用不同协议。Server Push 属于提供推送的 HTTP/2 对端,不属于住宅代理出口身份。

审计必须区分:

  • 客户端到代理的协议;
  • 隧道后的源站 HTTP 版本;
  • 父 easy handle 与被接受的推送句柄;
  • 共享连接缓存标识;
  • 回调决策和清理结果。

更换代理出口不能修复客户端本地的内存生命周期问题。应升级客户端并验证准确代码路径。

构建隔离测试夹具

使用一次性测试进程、组织拥有的 HTTPS 端点和无害静态资源。让服务器在请求父页面时只提供一个小型推送资源,并给每次运行分配唯一编号。

准备四种基线模式:

  • HTTP/1.1,不启用推送;
  • HTTP/2,不设置推送回调;
  • HTTP/2,回调拒绝推送;
  • HTTP/2,回调接受推送。

先在不共享连接时执行,再使用带正确锁回调的 share handle 和 CURL_LOCK_DATA_CONNECT 执行。这样可以定位引入相关生命周期的功能切换。

不得在无关公共服务器上测试,也不要在生产环境诱发崩溃。测试内容应无敏感数据、有限速,并与下游摄取系统隔离。

测试前补齐所有权遥测

为以下对象分配稳定内部标识:multi handle、每个 easy handle、share handle、父传输、每个推送、接受的推送句柄、连接缓存条目与清理阶段。

日志应记录状态变化,而不是秘密。可用字段包括时间戳、案例编号、父编号、推送编号、回调决策、HTTP 版本、代理路线类别、新建或复用连接、结果码与清理完成状态。

禁止记录代理密码、授权头、Cookie、私密 URL、响应正文或原始内存内容。

执行生命周期矩阵

每种模式依次执行:

  1. 启动新测试进程,创建 share 与 multi handle;
  2. 在共享连接数据前安装所需锁回调;
  3. 发起父 HTTPS 请求;
  4. 记录协商后的 HTTP 版本和连接标识;
  5. 收到推送时记录回调决策;
  6. 让父传输和接受的推送正常完成;
  7. 按文档化顺序移除完成句柄;
  8. 按应用所有权销毁 easy、multi 和 share handle;
  9. 确认进程正常退出,每个析构事件只发生一次;
  10. 在隔离 CI 中使用调试或内存安全构建重复测试。

公告指出调试构建可在相关序列中提供明显提示和断言。调试器与 sanitizer 只能用于受控环境,也不能替代生产升级。

增加并发与失败用例

单推送基线通过后,每次只增加一个有界场景:父传输先结束、推送先结束、一个推送拒绝另一个接受、响应期间取消、代理隧道正常关闭、清理前网络超时、连接可被其他句柄复用、multi 循环暂停恢复、无活动传输时关闭应用。

保持低并发与确定性。这里测试的是生命周期,不是压测。过高请求率既不利于归因,也可能违反端点或代理限制。

对比直连与代理路线

使用相同夹具分别覆盖授权直连控制组、HTTP 代理、HTTPS CONNECT 代理,以及应用明确支持的 HTTP/2 代理模式。

回调与清理结果应保持一致。如果某条路线没有出现 Server Push,应把它记录为协议行为,而不能据此宣称代码安全;仍需通过真正满足全部条件的路线覆盖触发路径。

可以结合HTTP/2 代理连接复用审计核对连接池边界,并用代理延迟归因指南拆分握手、隧道、源站和应用耗时。

升级与发布

首选方案是升级到 curl 8.22.0 或以上。暂时无法升级时,官方建议避免 HTTP/2 Server Push,或避免受影响的连接共享组合。对于没有业务用途的推送,直接禁用通常是更简单的临时控制。

升级后应确认运行进程实际加载目标版本,重启长期工作节点,清空旧共享连接池,重复全部验收矩阵,再以小流量 canary 推广。

验收清单

  • [ ] 已记录运行时 curl/libcurl 版本。
  • [ ] 已确认是否使用推送回调和共享连接数据。
  • [ ] 夹具中真实观察到 HTTPS 与 HTTP/2。
  • [ ] 已覆盖接受和拒绝推送路径。
  • [ ] 父子句柄所有权明确。
  • [ ] 每个句柄和缓存对象只清理一次。
  • [ ] 调试或 sanitizer 测试没有相关发现。
  • [ ] 已比较直连与批准的代理路线。
  • [ ] 生产进程加载 curl 8.22.0 或已验证补丁版本。
  • [ ] 日志不含凭据与敏感内容。

FAQ

所有 HTTP/2 客户端都会受影响吗?

不会。必须满足 libcurl 推送回调、接受推送、共享连接、HTTPS 与 HTTP/2 的特定组合。

curl 命令行工具是否受影响?

不受影响。官方公告明确说明问题只影响 libcurl 应用。

轮换代理 IP 能否避免问题?

不能。出口轮换改变网络路线,不会修正客户端进程中的句柄所有权和清理逻辑。

采集器应启用 Server Push 吗?

只有在存在明确业务需求、所有权模型、测试和遥测时才应启用。若应用不用推送资源,拒绝或禁用可减少复杂度。

来源与合规说明

内部研究依据:curl 项目《HTTP/2 server push UAF》安全公告,CVE-2026-18924,发布于 2026 年 9 月 2 日;curl 8.22.0 发布资料。外部资料 URL 仅保存在内部运营记录中,公开文章不含外部链接。

只在拥有或获授权的应用、端点、代理账号和网络上测试,并遵守目标站条款、服务商限制、隐私要求和组织变更流程。