在持续集成(CI)流水线和容器交付链路中,基础镜像通常预装了 curl 命令行工具,许多构建脚本、发布工具和内部运维 CLI 也会直接调用或链接 libcurl。根据官方安全公告,CVE-2026-92392 揭示了一个存在于 libcurl 中的高危释放后使用(Use-After-Free, UAF)漏洞。该缺陷在 HTTP/2 上传场景下,由于错误处理服务端返回的特定重置帧而引发,并在特定条件下具备转化为远程代码执行(RCE)的风险。

很多工程团队常假定 CI 节点仅作为客户端向受信私有源推送产物,因而风险较低。然而,CI 任务经常需要向外部制品库、第三方对象存储或 Webhook 上传包和日志。如果远端服务端被挟持,或在特定网络代理下交互,客户端组件便会直接暴露在攻击面中。要彻底消除该隐患,需要从交付物定位、可达性验证、版本升级与临时缓解四个阶段逐步落实。
漏洞机理与 CI 暴露面评估
根据 curl 官方安全公告,CVE-2026-92392 的触发条件具有严格的协议上下文:
- 传输模式:客户端必须正在执行数据上传(Upload / POST / PUT 操作)。
- 协议协商:连接必须协商并启用了 HTTP/2(
nghttp2支撑)。 - 异常处理:服务端在接收数据期间向客户端发送了带有
HTTP_1_1_REQUIRED或REFUSED_STREAM错误码的RST_STREAM帧。 - 内存失效:libcurl 内部在此流重置逻辑中过早释放了对应的
struct Curl_easy结构体,而后续连接复用或清理流程继续引用了该已释放指针,导致释放后使用(UAF)。
在典型的 CI/CD 与构建镜像中,以下场景容易满足上述条件:
- 制品上传与发布:CI 任务通过
curl -T、curl --upload-file或内部自研发布工具(基于 C/C++、Go cgo、Python PycURL 链接动态库)向支持 HTTP/2 的远端存储上传 Docker 镜像层、产物压缩包。 - 动态 Webhook 推送:调用外部服务上报大体积构建日志或测试报告。
如果客户端连接的远端节点返回了畸形或恶意的 HTTP/2 流重置指令,且客户端 libcurl 处于受影响版本区间(curl 8.23.0 之前版本),就会触发非预期内存解引用。
定位交付物与构建环境中的 libcurl 来源
在复杂的多阶段构建与流水线环境中,仅仅在宿主机执行 curl --version 往往无法反映实际风险。构建镜像中的 curl 和 libcurl 通常存在三种来源,需分别进行排查:
1. 系统包管理器引入的动态库与二进制
这是最常见的形式。Debian、Ubuntu、Alpine 或 Red Hat 衍生的基础镜像中通常包含发行版维护的共享库。可在镜像内通过包管理器和动态链接检查工具确认版本:
# 检查二进制路径与动态链接情况
which curl
ldd $(which curl) | grep libcurl
# 针对 Debian/Ubuntu 系统
dpkg -l | grep -E "curl|libcurl"
# 针对 Alpine Linux
apk info -v | grep -E "curl|libcurl"
# 针对 RHEL/CentOS/Rocky
rpm -qa | grep -E "curl|libcurl"2. 多阶段构建遗留的中间层与构建缓存
许多 Dockerfile 在 builder 阶段安装了 curl 用于拉取依赖,但随后误将工具链或开发头文件复制到了最终运行时镜像;或者基础镜像层直接依赖了未更新的基础层缓存。 可通过生成软件物料清单(SBOM)工具(例如 Syft、Trivy)扫描最终导出的镜像产物:
# 使用 Syft 提取镜像中的 curl 组件版本
syft packages docker:internal-registry.example.com/ci-runner:latest | grep -iE "curl"
# 使用 Trivy 定位指定 CVE 的命中情况
trivy image --severity HIGH,CRITICAL --vuln-type os,library internal-registry.example.com/ci-runner:latest | grep CVE-2026-923923. 静态链接或独立分发的内部 CLI
部分内部工具链使用 Go(通过 cgo 静态包含 libcurl)或 C/C++ 静态编译,系统包管理器无法直接索引。此时需要通过二进制符号和特征字符串来辨别:
# 扫描自研 CLI 二进制中是否存在 libcurl 版本指纹
strings /usr/local/bin/internal-uploader | grep -E "^libcurl/[0-9]+.[0-9]+"如果字符串显示版本低于 8.23.0,则表明静态包含的底层库同样需要重新编译更新。
可达性与最小场景核查
为判断流水线实际作业是否真正处于风险链路中,需要验证是否满足“HTTP/2 + 数据上传”的组合条件。
可以通过开启 curl 详细网络追踪日志,核查实际请求的协议协商结果:
# 模拟执行发布上传并观察 ALPN 协商
curl -v --upload-file test_payload.bin https://artifacts.internal.net/upload 2>&1 | grep -E "ALPN|HTTP/2"如果输出中包含 ALPN: offers h2 且成功建立 Using HTTP2, server supports multiplexing,同时业务行为是上传,则该工作流具备直接可达性。
在测试环境中,可利用构造脚本或测试桩向上传链路注入携带 HTTP_1_1_REQUIRED (0xd) 的 RST_STREAM 帧。若客户端进程异常退出并产生 SIGSEGV 或 AddressSanitizer 报告 heap-use-after-free,则说明当前版本未受补丁保护。

处置策略:从临时缓解到升级回归
处置过程需按照“止血缓解、版本升级、兼容验证、回滚准备”的严格顺序推进。
阶段一:临时缓解策略(不可作为长期方案)
若由于第三方基础镜像更新滞后,无法立即在 CI 基础环境中部署更新版本,必须通过限制协议版本避免触发该缺陷。
注意:禁用 HTTP/2 会导致连接多路复用失效,在高并发或大批量小文件上传时会增加握手开销和延迟,不可作为永久防护手段。
- CLI 任务强制降级为 HTTP/1.1:
在调用 curl 上传的脚本中显式追加 --http1.1 参数:
# 临时规避 h2 协商
curl --http1.1 --upload-file release.tar.gz https://target-server/api/v1/artifacts- 代码级配置 libcurl 属性:
在自研客户端工具的初始化代码中,明确约束 CURLOPT_HTTP_VERSION 参数:
// C/C++ libcurl 示例:强制使用 HTTP 1.1
curl_easy_setopt(curl_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);- 构建节点全局环境变量:
对于大量分散的构建脚本,若脚本支持解析 ~/.curlrc,可通过 CI 初始化注入:
echo "--http1.1" >> ~/.curlrc阶段二:升级到 curl 8.23.0 或应用分发补丁
根据官方 curl Releases Changelog,该漏洞在 curl 8.23.0 中已获得完整修复。各 linux 发行版(如 Debian、Ubuntu)也已推出针对各自维护分支的反向移植(backport)安全补丁。
Dockerfile 更新示例:
对于基于 Debian/Ubuntu 的基础镜像,更新构建指令并清理缓存:
RUN apt-get update &&
apt-get install -y --no-install-recommends curl libcurl4 &&
rm -rf /var/lib/apt/lists/*对于自行编译的基础镜像,拉取 8.23.0 源码并重新打包:
ARG CURL_VERSION=8.23.0
RUN wget https://curl.se/download/curl-${CURL_VERSION}.tar.gz &&
tar -xzf curl-${CURL_VERSION}.tar.gz &&
cd curl-${CURL_VERSION} &&
./configure --with-openssl --with-nghttp2 &&
make -j$(nproc) && make install &&
ldconfig阶段三:升级后的兼容性与安全回归验证
版本升级完成后,需执行以下清单进行回归确认:
- 库版本与特性回归:
执行 curl --version,确认输出版本号为 8.23.0(或包含发行版安全修订版本后缀),同时确认 Features 列表中包含 HTTP2,保证 nghttp2 依赖链路正常链接。
- 协议自适应与重试回归:
当服务端返回 HTTP_1_1_REQUIRED 时,升级后的 libcurl 应能正确释放资源并依照规范平滑降级或返回清晰的传输错误码,不再出现崩溃中断。
- 性能基线比对:
验证恢复 HTTP/2 后,CI 产物上传的并发吞吐量与连接池复用指标恢复正常,无内存泄漏与持续增长。
阶段四:流水线阻断与回滚预案
在 CI 门禁中加入针对该漏洞的 SBOM 扫描,设定如果检测到版本低于 8.23.0 且基础镜像未打补丁时直接阻断构建。如果新引入的 8.23.0 与现存老旧私有源的自签名证书或特定 SSL/TLS 选项发生行为冲突,应立即回退至已打补丁的发行版维护包版本(Backport),或者在重构镜像时重新启用阶段一中的 --http1.1 约束配置,确保产线稳定交付的同时控制安全风险。
- CI/CD
- it2021
- it2021.com
- test
- Webhook
- 代码执行
- 命令行工具
- 远程代码执行





1F
之前没注意上传也会踩坑