
HTTP/2 Server Push 允许服务器在客户端明确请求前主动提供额外资源。多数代理数据采集任务并不需要此功能;如果应用主动启用推送,就必须把父传输、接受的推送句柄、共享连接缓存和清理顺序视为同一个生命周期。
本指南提供一套受控审计流程,事实依据包括 curl 项目于 2026 年 9 月 2 日发布的 CVE-2026-18924。该低危问题在特定 HTTP/2 推送与共享连接组合下,可能在清理阶段触发释放后使用。curl 8.22.0 已修复该问题。
目标不是向公共网站发送异常流量,而是在授权测试环境中确认应用是否能进入相关路径,准确升级并保存足够的回归证据。
核对全部触发条件
官方公告要求同时满足:
- libcurl 应用通过
CURLMOPT_PUSHFUNCTION启用 HTTP/2 推送; - 应用通过
CURL_LOCK_DATA_CONNECT共享连接; - 使用 HTTPS 并协商为 HTTP/2;
- 服务器发送 HTTP/2 推送;
- 应用的回调接受该推送。
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、响应正文或原始内存内容。
执行生命周期矩阵
每种模式依次执行:
- 启动新测试进程,创建 share 与 multi handle;
- 在共享连接数据前安装所需锁回调;
- 发起父 HTTPS 请求;
- 记录协商后的 HTTP 版本和连接标识;
- 收到推送时记录回调决策;
- 让父传输和接受的推送正常完成;
- 按文档化顺序移除完成句柄;
- 按应用所有权销毁 easy、multi 和 share handle;
- 确认进程正常退出,每个析构事件只发生一次;
- 在隔离 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 仅保存在内部运营记录中,公开文章不含外部链接。
只在拥有或获授权的应用、端点、代理账号和网络上测试,并遵守目标站条款、服务商限制、隐私要求和组织变更流程。