ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Envoy HTTP/3 空指针崩溃排查:CVE-2026-48521 修复与 auto_config 上游正确配法指南

Envoy HTTP/3 空指针崩溃排查:CVE-2026-48521 修复与 auto_config 上游正确配法指南 Envoy HTTP/3 空指针崩溃排查CVE-2026-48521 修复与 auto_config 上游正确配法指南【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoyEnvoy 在使用 auto_config 按 ALPN 自动协商上游协议、且上游通告 HTTP/3 时会因空指针解引用触发进程崩溃对应 CVE-2026-48521。本文带你看崩溃现场、协议协商机制、源码风险点以及修复与验证的正确路径。一、先看这张事实卡项目内容漏洞编号CVE-2026-48521安全公告GHSA-5vff-j9p4-38j3触发组合上游集群使用auto_configALPN 自动协商 上游以 HTTP/3 响应直接影响进程异常终止abnormal process termination非优雅退出根因空指针解引用null dereference处置优先级高——使用 auto_config 且上游可能通告 HTTP/3 的实例应立即升级原始修复记录在 changelogs/current/bug_fixes/http3__fixed-crash-due-to-null-deref.rst目前挂在current未发布变更集里属于 bug_fixes 类别。二、网关进程崩溃为什么值得半夜爬起来Envoy 是边缘/中间/服务型代理一个 worker 进程没了不只是少了一个进程——它持有的每一条 TCP 和 QUIC 连接在途请求瞬间被切断上游侧表现为超时或 5xx下游侧表现为 503。对网关层来说这就是全量流量受影响。上面这张截图就是典型的上游集群端点视图一个网关实例背后挂着若干个upstream集群和端点。任何一个实例崩掉这些在途请求就没有宿主了。排查时你会发现崩溃栈指向空指针解引用而不是断言失败或异常退出——说明是某个指针在特定时序下根本没被赋值就被解引用了。这正是配置合法、流量正常、偶发崩溃这类问题的典型特征它只在某条罕见的回调时序上命中。三、Envoy 连上游时到底怎么选协议ALPN 自动协商三个分支一个回退规则上游协议选择有三种配置分支定义在 api/envoy/extensions/upstreams/http/v3/http_protocol_options.protoexplicit_http_config固定协议写死 HTTP/1 或 HTTP/2不参与协商use_downstream_protocol_config跟随下游连接使用的协议auto_config即AutoHttpConfig消息靠 ALPN——应用层协议协商Application-Layer Protocol NegotiationTLS 握手里双方交换支持的协议清单——在 HTTP/1 与 HTTP/2 之间动态选择。auto_config的回退规则很明确上游不支持 ALPN 时直接落回 HTTP/1传输层可以自定义 ALPN但集群默认或自定义失败时用的是h2,http/1.1。⚠️ 这一分支只能用支持 ALPN 的传输套接字一般是 TLS否则配置加载直接失败。HTTP/3 是个条件参与者HTTP/1、HTTP/2 是配置即生效HTTP/3 不是。它要同时满足两个条件才上场auto_config里写了http3_protocol_options注意这个字段只表示允许不等于启用上游明确通告了 HTTP/3 支持通告来源是 HTTP Alt-SvcRFC 7838 的替代服务协议头或 HTTPS DNS 资源记录。没有通告就老老实实用 HTTP/2 或 HTTP/1。这套设计的动机在 source/docs/http3_upstream.md 里讲得很直白HTTP/3 跑在 QUIC 上QUIC 基于 UDP而 UDP 流量经常被中间网络设备拦截。所以 Envoy 必须做到两件事——在 UDP 被拦的死网络上记住HTTP/3 连不通避免反复徒劳重试在 UDP 正常的网络上又别浪费一次 HTTP/2 握手。回退与失败记忆状态追踪器怎么记这笔账记忆 HTTP/3 可用性的对象是Http3StatusTracker现代实现见 source/common/http/http3_status_tracker_impl.cc。它维护四个状态Pending待定、Broken已损坏进入退避、FailedRecently最近失败、Confirmed已确认可用。退避参数以源码为准初始损坏期 1 秒DefaultExpirationTime{1}每次再次被标记损坏按1 consecutive_broken_count_指数翻倍连续损坏计数上限 17也就是最长退避约 2^17 秒约 36 小时一旦走到Confirmed计数归零、下次重新从 1 秒起。⚠️ 这里有个对照值得记住架构文档 source/docs/http3_upstream.md 写的是首次损坏 5 分钟、再次翻倍、上限 1 天但源码实现是首次 1 秒、翻倍、上限 2^17 秒。两者不一致以源码为准——test/common/http/http3_status_tracker_impl_test.cc 的MarkBrokenWithBackoff与MarkBrokenWithBackoffMax用例验证的就是 1s→2s→4s→8s 的指数序列和 2^17 秒封顶。四、空指针最可能藏在哪三个位置changelog 只说修了空指针解引用没给补丁细节以下是结合代码结构的推断不是官方修复说明。1.ConnectivityGrid双池的惰性创建与时序回调。source/common/http/conn_pool_grid.cc 里的ConnectivityGrid同时包着一个 QUIC 池Http3ConnPoolImpl和一个 TCP 混合池HttpConnPoolImplMixed两个池都是惰性创建的。请求分派时 HTTP/3 可用就走 QUIC 池已标记 broken 则 TCP 立即并行发起未通告 HTTP/3 直接进混合池已通告且工作正常时300mskDefaultTimeoutMs 300内没成功就向混合池再发一次谁先成谁胜出。回调链onPoolFailure、onPoolReady、竞速超时定时器里任何一处解引用了尚未创建的池成员就是崩溃。2. 状态追踪器依赖的缓存未就绪。追踪器挂在HttpServerPropertiesCache的 origin 上实现见 source/common/http/http_server_properties_cache_impl.cc。这个缓存记录哪些服务器通告了 HTTP/3目前只存与请求同主机名、同端口的通告。缓存未建、origin 解析失败时追踪器访问路径上的指针就是悬空的。3. 配置层的兜底校验。source/extensions/upstreams/http/config.cc 里有一道硬闸auto_config带http3_protocol_options却没带alternate_protocols_cache_options时配置加载直接报alternate protocols cache must be configured when HTTP/3 is enabled with auto_config。它堵住了HTTP/3 开着但缓存缺失这种静态错配但运行时时序问题仍要靠代码判空来防。五、怎么修升级、配法、过滤器坑位与回归测试第一优先级永远是升级——把跑在受影响集群上的实例升到包含 CVE-2026-48521 修复的版本。下面是配置侧要做的事。一份能完整加载的集群 YAML。auto_config下三种协议选项缺一不可alternate_protocols_cache_options是 HTTP/3 场景的必填项static_resources: clusters: - name: upstream_with_h3 connect_timeout: 5s type: STRICT_DNS load_assignment: cluster_name: upstream_with_h3 endpoints: - lb_endpoints: - endpoint: address: socket_address: address: upstream.example.com port_value: 443 transport_socket: name: envoy.transport_sockets.tls typed_config: type: type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext sni: upstream.example.com typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: type: type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions auto_config: http_protocol_options: {} http2_protocol_options: {} http3_protocol_options: {} alternate_protocols_cache_options: name: default_alternate_protocols_cache max_entries: 1024几个注意点transport_socket必须是支持 ALPN 的 TLS 套接字否则配置加载失败缓存name用于标识缓存实例跨配置组件引用同名缓存时各字段必须一致max_entries默认 1024实际条目数是近似值每个 worker 独立执行key_value_store_config持久化目前只在并发度为 1 时支持。过滤器侧启用 alternate_protocols_cache 过滤器。Alt-Svc 头要有人解析写进缓存这个活由envoy.filters.http.alternate_protocols_cache干挂在 HttpConnectionManager 的http_filters链里typed_config指向envoy.extensions.filters.http.alternate_protocols_cache.v3.FilterConfig即可不需要再填别的字段。这里有个废弃字段的坑api/envoy/extensions/filters/http/alternate_protocols_cache/v3/alternate_protocols_cache.proto 里的alternate_protocols_cache_options已标记deprecated计划 3.0 移除proto 注释明说该字段被忽略——过滤器直接使用请求所路由到的集群上声明的缓存。老配置里如果还在过滤器里填这个字段删掉改到集群auto_config上。回归测试基线。两个目标要跑bazel test //test/common/http:conn_pool_grid_test覆盖双池竞速与回退链和bazel test //test/common/http:http3_status_tracker_impl_test覆盖状态迁移与退避。test/common/http/conn_pool_grid_test.cc 里的Success用例验证通告存在→QUIC 池→握手成功→ConfirmedDoubleFailureThenSuccessSerial验证QUIC 池失败→交替池失败→HTTP/2 池成功→最终标 broken后者正是修复所保护的那条不崩溃路径。六、防复发检查清单检查项为什么重要怎么查auto_config 配置完整性三协议选项缺一个、缓存选项缺失都会导致行为异常或加载失败拉config_dump比对三种协议选项齐全、alternate_protocols_cache_options存在且name与过滤器一致UDP 可达性HTTP/3 依赖 UDP被拦则回退链路长期承压空指针修复前这条链路上最容易炸抓包看 QUIC 连接是否被丢看集群 HTTP/3 连接成功/失败计数与 broken 退避行为版本是否含修复进程崩溃不可接受升级是唯一根治手段核对实例版本号 ≥ 发布含 CVE-2026-48521 修复的版本对照 changelog 条目回归测试基线升级后要保证回退与退避行为没退化CI 里跑//test/common/http:conn_pool_grid_test与//test/common/http:http3_status_tracker_impl_test并确认通过附录文件索引changelog修复条目changelogs/current/bug_fixes/http3__fixed-crash-due-to-null-deref.rst架构文档上游 HTTP/3 架构说明含退避参数的文档口径source/docs/http3_upstream.mdproto 定义上游协议选项与AutoHttpConfigapi/envoy/extensions/upstreams/http/v3/http_protocol_options.protoAlternateProtocolsCacheOptionsapi/envoy/config/core/v3/protocol.proto过滤器配置含废弃字段api/envoy/extensions/filters/http/alternate_protocols_cache/v3/alternate_protocols_cache.proto核心实现双池路由与 300ms 竞速source/common/http/conn_pool_grid.ccHTTP/3 状态追踪器source/common/http/http3_status_tracker_impl.cc通告缓存source/common/http/http_server_properties_cache_impl.cc配置校验HTTP/3 auto_config 缓存必填source/extensions/upstreams/http/config.cc测试用例双池与回退链test/common/http/conn_pool_grid_test.cc状态追踪与指数退避test/common/http/http3_status_tracker_impl_test.cc通告缓存行为test/common/http/http_server_properties_cache_impl_test.cc【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表