{"schema_version":"1.0","service":"Publicasta","type":"article","id":890,"slug":"curl_http2_upload_use_after_free_cve_2026_92392_response","title":"curl 中的 CVE-2026-92392：为何 HTTP/2 上传需要依赖级别的补丁响应","excerpt":"CVE-2026-92392 影响 curl 与 libcurl 的 HTTP/2 上传流程。风险取决于系统如何使用这些组件，因此应优先盘点嵌入式依赖、上传路径和协议协商情况，再安排修复与临时缓解。","language":"zh","default_language":"en","canonical_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=zh","image":{"url":"https://publicasta.com/storage/projects/9/pages/890/2026/10/cf42bf44-8d6a-4849-9fdc-3b7455e89b6c.webp","alt":"网络安全编辑插图：HTTP/2 上传到达服务器，工程师正在跟踪 curl 修复程序和依赖项清单。"},"publisher":{"id":9,"slug":"cybersecurity","name":"Cybersecurity Without Panic","url":"https://publicasta.com/cybersecurity"},"author":{"name":"Anton R"},"published_at":"2026-10-15T13:39:59+00:00","updated_at":"2026-10-15T13:39:59+00:00","content_markdown":"curl 和 libcurl 中的一项高严重性漏洞，改变了人们通常理解客户端安全问题的方式。CVE-2026-92392 会在 HTTP/2 上传期间触发，但发送恶意响应的是接收上传内容的服务器。客户端传输数据时，恶意服务器可以发出特定的流重置响应，使 curl 保留一个已经释放对象的引用。结果是内存损坏。curl 项目表示，在构建方式、架构、内存分配器、时序和协议条件同时满足的情况下，这个缺陷已被证明可以转化为远程代码执行。\n\n ![网络安全编辑插图：HTTP/2 上传到达服务器，工程师正在跟踪 curl 修复程序和依赖项清单。](https://publicasta.com/storage/projects/9/pages/890/2026/10/cf42bf44-8d6a-4849-9fdc-3b7455e89b6c.webp)\n\n curl 和 libcurl 8.23.0 已包含修复，该版本于 2026 年 10 月 14 日发布。受影响范围为 8.12.0 至 8.22.0。这个范围之所以重要，是因为 libcurl 经常嵌入应用程序、操作系统组件、自动化工具、包管理器、安全产品和服务中，而这些软件未必会公开说明自己使用了 curl。因此，只更新某位管理员工作站上的命令行程序，可能会遗漏更重要的副本。\n\n 这是一项补丁工作，但并不是简单地“到处运行更新”。第一步是找出哪些地方通过 HTTP/2 使用 curl 进行上传，包括经由库调用或静态链接应用程序完成的上传。第二步是在永久修复经过供应商软件包和生产变更窗口之前，判断暂时降低协议能力是否可行。第三步是检查执行上传的系统是否只会连接到预期目标，并确认这些目标具备可信边界。\n\n ## CVE-2026-92392 实际影响什么\n\n curl 公告将其描述为 HTTP/2 上传路径中的释放后使用漏洞。上传期间，服务器可以发送 HTTP/2 `RST_STREAM`，原因可以是 `HTTP_1_1_REQUIRED` 或 `REFUSED_STREAM`。连接本身仍可能保持活动状态，而单次传输已经停止。在存在漏洞的状态机中，curl 随后清理传输和连接时的顺序，会留下指向传输对象的悬空引用。\n\n 释放后使用并不自动意味着每次调用都会变成代码执行。它表示软件在内存所有者释放内存后仍继续使用该内存。之后这块内存被什么内容占据，会影响直接结果：可能是崩溃、状态损坏、信息暴露，或者更可控的内存安全故障。在本案中，curl 项目将问题列为高严重性，并记录了从内存错误走向远程代码执行的路径。\n\n 受影响版本包括 curl 和 libcurl 8.12.0 至 8.22.0，含首尾版本。8.12.0 之前的版本不受这一具体缺陷影响，8.23.0 则包含修复。区分 curl 与 libcurl 对运营工作很重要：命令行工具只是其中一个使用者，而直接调用该库的应用数量要多得多。某台服务器即使从不运行 `curl` 可执行文件，只要应用链接了 libcurl，仍可能受到影响。\n\n 该漏洞需要 HTTP/2。这不表示每次 HTTPS 传输都会自动存在风险，但团队不能仅因用户没有显式传入 HTTP/2 选项，就推断系统安全。连接到提供 HTTP/2 的 HTTPS 服务时，只要本地构建包含相关支持，curl 就可能协商使用 HTTP/2。应用也可能通过 libcurl 选项或更高层网络框架主动选择 HTTP/2。\n\n 存在漏洞的操作是客户端向服务器上传内容。公告描述的场景不是普通下载。这会缩小暴露面，却不意味着问题罕见。备份代理、构件发布器、遥测客户端、文档接收服务、CI 系统、云连接器、客户支持工具、同步软件和内部 API 都经常向外发送数据。有些系统只在较大工作流中的一个小环节使用 curl，这正是仅凭软件包清单可能漏掉实际暴露原因。\n\n ## 攻击者位于接收端\n\n 许多防御手册默认危险服务器是提供下载内容的服务器。CVE-2026-92392 恰好反转了这种思维模型：客户端向一个自认为可信的服务器发起上传，而服务器可能是提供恶意协议行为的组件。\n\n 这并不意味着攻击者只要在互联网上放置恶意页面，就能利用任意 curl 进程。受害进程必须连接到攻击者控制或影响的服务器，执行上传，协商使用 HTTP/2，并满足进入易受攻击清理序列所需的实现条件。在真实环境中，入口可能是专门构造的恶意端点、被入侵的服务、被重定向的工作流、用户选择的上传目标，或接受远程配置的应用。具体路径取决于外围产品。\n\n curl 项目列出了将该缺陷转化为代码执行所需的具体条件。攻击者需要知道确切的 curl 版本和对象布局，掌握目标架构细节，使用兼容的 libc 分配器和堆布局，预测 nghttp2 与 TLS 1.3 的影响，并在并行传输之间精确控制时序。公开利用还受到短命令约束。这些要求使可靠利用变得困难，但不是把问题视为无害的理由。现代攻击链经常从崩溃或部分内存损坏开始，随后随着目标细节增加而改进。\n\n 目前公开记录区分了可利用性与已知在野利用。公告记录了概念验证，以及在精确条件下通向代码执行的路径。NVD 条目没有提供自己的 CVSS 评估，也没有表示该漏洞正在野外被利用。公开概念验证仍是防御者应重视的信号，尤其是在 curl 嵌入长期运行服务或更新缓慢的系统中。但它并不证明每个易受攻击的安装都已被入侵。\n\n ## 为什么 8.23.0 需要谨慎处理\n\n 这次修复随一次协调发布进入 curl，同时处理了另外 23 个已公开的安全问题，其中大多数被项目评为低严重性。CVE-2026-92392 是该版本唯一的高严重性问题。这样的集中发布会带来两种相反的运营风险：有些团队看到公告数量较多，认为升级复杂而暂缓；另一些团队更新了可见的命令行软件包，就以为整个依赖图都已覆盖。\n\n 正确做法是把紧迫性与统一性分开。紧迫任务是找出执行上传的易受攻击构建，并将这些系统迁移到包含修复的供应商软件包或 curl、libcurl 8.23.0。具体实施路径可能因操作系统、容器基础镜像、语言运行时、设备或商业应用而不同。发行版维护的 libcurl 可能回移修复，却不会以简单版本检查所期待的方式改变上游版本号。因此，安全团队应确认供应商公告和软件包变更日志，而不是只依赖一次字符串比较。\n\n 这次发布不只改变了安全代码。项目移除了 SMB 和 SMBS 支持，也引入了其他行为变化与错误修复。这并不意味着升级本身不安全，但说明依赖少见协议、特殊认证流程、自定义 TLS 后端或严格文件处理行为的应用需要测试。安全修复不应为了等待完美的全量测试套件而无限延期；分阶段发布则可以避免补救过程本身中断关键上传服务。\n\n curl 为标准版本和 Rock-solid 分支维护了分开的发布信息。使用受支持长期分支的组织，应检查适用的分支版本是否为 8.14.3、8.16.2 或 8.20.2，而不是直接用最新标准分支替换。真正的问题不是“上游命令行下载页面显示了哪个数字”，而是“哪个受支持软件包包含 CVE-2026-92392 的修复，以及如何证明该软件包已经部署”。\n\n ## 针对该漏洞的实用清单\n\n 先检查显而易见的安装位置，但不要止步于此。搜索端点和服务器镜像中的 `curl` 可执行文件，查询操作系统包管理器，检查容器层，审阅软件物料清单，并查看 libcurl 的构建清单。软件包名称可能不同：主机可能显示 `curl`、`libcurl`、开发包或供应商专用运行时包。静态链接可能让库从主机普通软件包数据库中消失，因此应用发布清单和 SBOM 是重要证据。\n\n 接着把行为纳入清单。最高优先级的记录通常同时满足以下条件：\n\n - 运行易受影响的 curl 或 libcurl 构建；\n- 向远程服务上传文件或请求体；\n- 允许协商 HTTP/2，或显式启用 HTTP/2；\n- 处理丢失后会造成实际影响的数据或凭据。\n\n 仅用于本地元数据解析的易受影响库，不应与向公共服务上传凭据、构建构件、客户文档或备份的自动化服务接受同样的即时处置。风险排序还应考虑目标控制方式。固定的供应商端点白名单，与接受用户、作业参数、Webhook 或远程配置文件提供任意 URL 的工具，暴露情况不同。\n\n 对于静态链接或不透明产品，应向供应商提出三个具体问题：产品是否在受影响范围内包含 curl 或 libcurl；是否可能执行 HTTP/2 上传；哪个构建包含修复。把答案保存在资产记录中。“产品使用 HTTPS”不足以完成评估，“产品界面没有显示 curl”也不是关于嵌入式依赖的答案。\n\n 容器环境还需要额外检查。更新主机不会更新旧镜像，重建应用镜像也不一定会替换复制到最终阶段的 curl 库。应同时扫描正在运行的镜像和下一步准备推广的镜像。如果编排器在滚动部署期间保留旧副本，应确认每个活动副本都已离开受影响范围，再关闭事件或漏洞工单。\n\n ## 补丁推进期间的临时缓解\n\n curl 公告列出避免 HTTP/2 这一后备措施，适用于无法立即升级或打补丁的情况。这是缓解措施，不是修复替代品。对于命令行工作流，操作员可能可以为限定的传输强制使用 HTTP/1.1。对于应用，等效设置可能是库选项、代理策略、服务网格规则或供应商配置。必须验证控制确实生效：如果底层应用通过另一条代码路径打开独立连接，在某个包装脚本中禁用 HTTP/2 并没有帮助。\n\n 临时协议限制也可能产生副作用。有些服务要求 HTTP/2，依靠连接多路复用提升吞吐量，或者按协议采用不同的认证和超时行为。记录例外情况，明确负责人，并设置到期日期。若没有人知道缓解措施是否仍在启用，导致它长期存在，就会变成另一项清单问题。\n\n 在可能的情况下，临时限制上传目标。为自动化作业执行出站白名单；除非工作流确实需要，否则拒绝用户提供的目标；并验证重定向，而不是静默地沿着重定向链访问意外主机。这些措施可以降低易受攻击客户端连接恶意接收服务器的机会，却不能替代补丁：合法目标也可能被入侵，宽泛白名单仍可能包含攻击者控制的基础设施。\n\n 不要通过关闭证书验证或削弱 TLS 来应对。公告中的利用条件包括服务器能够通过客户端证书检查，这提醒我们：普通传输认证并不能完全防御已被入侵或由恶意方运营的端点。取消证书验证只会扩大攻击面，并不能解决内存安全缺陷。\n\n ## 如果易受攻击的客户端曾暴露，应检查什么\n\n 存在易受攻击版本不等于已经被攻陷，崩溃也不等于已经发生利用。不过，曾暴露的上传客户端值得进行符合比例的审查。确认相关时期访问过哪些目标、发送了哪些文件或请求体、使用了哪个确切的 curl 或 libcurl 构建，以及是否协商了 HTTP/2。即使 curl 自身只记录了笼统的传输错误，应用日志、代理日志、TLS 遥测和端点进程记录也可能回答这些问题。\n\n 寻找异常终止、反复重试某个不寻常端点、上传器启动的子进程发生变化、出现意外文件，以及失败传输后立即开始的异常出站连接。这些是分诊信号，不是 CVE-2026-92392 独有的特征。正常上传失败也可能触发重试，崩溃也可能触发重启，因此解释必须结合主机预期行为。\n\n 如果进程能够访问凭据、令牌、签名密钥或敏感本地文件，应单独评估这些访问权限。已公开的漏洞是客户端内存安全问题，并未被描述为直接的凭据泄露漏洞。然而，如果上传器成功执行代码，攻击者可能取得该进程原本拥有的权限和数据。当调查无法证明进程始终处于预期边界内时，应轮换秘密，并在日常保留策略删除相关记录前保存日志。\n\n 对于高价值系统，应比较易受影响构建与修复构建，并保留更新证据。记录软件包校验和或镜像摘要、正在运行的进程版本以及部署时间。如果产品供应商提供的是热修复而非上游版本，应记录供应商公告和软件包构建标识。同一主机上存在多个库副本时，这类证据比写着“curl 已打补丁”的工单备注更有用。\n\n ## 开发团队应作出的改变\n\n 开发者应把 libcurl 视为应用安全边界的一部分，而不是藏在业务逻辑下方、可以随意替换的工具。如果运行时镜像提供了不同的共享库、基础镜像过期，或者重建时包管理器解析出易受影响版本，那么在构建文件中固定版本仍然不够。应在 SBOM 中明确依赖，并使更新路径可重复执行。\n\n 审查上传代码中的目标控制、重定向行为、重试逻辑和协议选择。只向固定端点上传的服务，与接受任意 URL 的服务拥有不同威胁模型。重试库可能使用与第一次不同的选项建立第二次连接。即使应用没有显式声明，代理也可能协商 HTTP/2。安全审查应沿着真实连接路径进行，而不是只看最方便的配置文件。\n\n 限制上传工作进程的权限。让它只拥有任务需要的最小文件系统、网络和凭据访问权限。读取本地文件与发布文件应使用不同身份，避免为通用传输工作进程授予云管理员凭据、签名密钥或主机容器套接字访问权。最小权限不能消除漏洞，却能把代码执行事件限制为服务事故，而不是扩大为主机失陷。\n\n 围绕中断的 HTTP/2 传输、服务器重置、重试和清理增加负向路径测试。目标不是在生产环境复现利用，也不是构建攻击能力，而是验证应用能安全处理失败传输、实际加载了修复后的依赖，并确认重启与重试行为不会绕过更新形成第二条路径。\n\n ## 运营团队应如何沟通\n\n 最有用的内部通知应当精确：CVE-2026-92392 影响 curl 和 libcurl 8.12.0 至 8.22.0；易受攻击场景涉及 HTTP/2 上传；上游修复版本是 8.23.0；嵌入式库副本同样计入范围。不要通知所有员工更新浏览器或停止使用互联网。大多数人并不运行受影响的上传工作流，而无差别警告会让下一次严重告警更难被重视。\n\n 要求服务负责人回答：系统是否上传数据，连接哪些目标，是否启用 HTTP/2，以及哪个软件包或镜像提供 curl。为他们提供可验证的临时缓解措施，并指定永久更新负责人。这样可以把宽泛的依赖告警转化为一组可以回答的问题。\n\n curl 项目的披露还带来更广泛的启示。一个成熟且受到大量审查的组件，仍然可能发布严重的内存安全缺陷。这不应引发恐慌式替换，让团队用未经验证的替代品换掉可靠软件；它应推动更清晰的依赖可见性、更快的补丁传播、更安全的进程权限，以及对网络协议协商方式更明确的证据。\n\n ## 结论\n\n CVE-2026-92392 值得优先处理，因为它同时具备广泛的依赖覆盖面，以及在客户端上传期间由服务器触发的特性。它不是对每个 curl 安装的普遍远程接管，公开的利用条件也相当苛刻。但当前没有已知在野利用标记，并不意味着可以长期保留未打补丁的上传服务。\n\n 找出每一个 curl 和 libcurl 副本，确认哪些副本通过 HTTP/2 上传，把易受影响构建更新到供应商支持的修复版本，并仅将 HTTP/1.1 或目标限制作为临时控制。随后保留证据，证明实际运行的进程——而不只是构建文件或基础镜像——已经包含修复。这正是该漏洞需要的响应：具体、理解依赖关系，而且足够冷静，能够找到那些没人记得还存在的副本。\n\n ## 来源\n\n 本文事实依据包括 curl 项目发布的《HTTP/2 upload Use-After-Free — CVE-2026-92392》、美国国家标准与技术研究院 NVD 条目、Daniel Stenberg 对“从 UAF 到 RCE”的背景说明、《The Hacker News》相关讨论、curl 8.23.0 变更记录，以及 curl 发布表。相关来源分别为：\n\n - [curl 项目：CVE-2026-92392](https://curl.se/docs/CVE-2026-92392.html)\n- [NVD：CVE-2026-92392](https://nvd.nist.gov/vuln/detail/cve-2026-92392)\n- [Daniel Stenberg：A UAF turned RCE](https://daniel.haxx.se/blog/2026/10/14/)\n- [The Hacker News：curl Patches HTTP/2 Upload Flaw After PoC Demonstrates Client-Side Code Execution](https://thehackernews.com/2026/10/curl-patches-http2-upload-flaw-after.html?hl=en_US)\n- [curl 8.23.0 变更记录](https://curl.se/ch/)\n- [curl 发布表](https://curl.se/docs/releases.html)","available_translations":[{"language":"ar","title":"CVE-2026-92392 في curl: لماذا تحتاج عمليات الرفع عبر HTTP/2 إلى استجابة على مستوى التبعية","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=ar","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=ar","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=ar","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=ar"},{"language":"de","title":"CVE-2026-92392 in curl: Warum HTTP/2-Uploads eine Reaktion auf Abhängigkeitsebene erfordern","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=de","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=de","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=de","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=de"},{"language":"en","title":"CVE-2026-92392 in curl: Why HTTP/2 Uploads Need a Dependency-Level Patch Response","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=en","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=en","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=en","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=en"},{"language":"es","title":"CVE-2026-92392 en curl: por qué las cargas HTTP/2 requieren una respuesta a nivel de dependencia","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=es","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=es","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=es","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=es"},{"language":"fr","title":"CVE-2026-92392 dans curl : pourquoi les téléversements HTTP/2 exigent une réponse au niveau des dépendances","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=fr","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=fr","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=fr","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=fr"},{"language":"pl","title":"CVE-2026-92392 w curl: dlaczego przesyłanie przez HTTP/2 wymaga reakcji na poziomie zależności","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=pl","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=pl","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=pl","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=pl"},{"language":"ru","title":"CVE-2026-92392 в curl: почему для загрузок HTTP/2 нужен патч на уровне зависимости","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=ru","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=ru","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=ru","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=ru"},{"language":"zh","title":"curl 中的 CVE-2026-92392：为何 HTTP/2 上传需要依赖级别的补丁响应","html_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=zh","markdown_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=zh","json_url":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=zh","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=zh"}],"_links":{"self":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=zh","api":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=zh","html":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=zh","canonical":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response?lang=zh","markdown":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.md?lang=zh","json":"https://publicasta.com/cybersecurity/curl_http2_upload_use_after_free_cve_2026_92392_response.json?lang=zh","channel":"https://publicasta.com/api/public/v1/channels/cybersecurity","channel_articles":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles","search":"https://publicasta.com/api/public/v1/search","documentation":"https://publicasta.com/api-docs#reading-publicasta","openapi":"https://publicasta.com/api-docs/openapi.json","llms":"https://publicasta.com/llms.txt"}}