)
Envoy 路径规范化安全修复剥离 dot/dotdot 段参数CVE-2026-73551【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy导读本文围绕 Envoy 针对 CVE-2026-73551 的安全修复展开核心内容是在启用normalize_path路径规范化时Envoy 会从 dot 段/.;与 dotdot 段/..;中剥离 URL 路径参数使 RFC 3986 路径规范化能够正确折叠这些段从而修复路径规范化绕过漏洞。读者读完本文后将掌握该漏洞的成因、修复实现原理、stripParametersFromDotSegments的源码级行为、normalize_path配置与 runtime guard 的回退机制以及如何通过测试用例验证修复效果。漏洞背景路径参数遮蔽 dotdot 段在 HTTP 请求路径中..dotdot段在 RFC 3986 语义下表示回退到上一级目录/a/../b规范化为/b。然而URL 路径参数以分号;开头的段后缀如/..;foobar会让 dotdot 段不再被路径规范化逻辑识别——因为..;foobar不再是严格的..规范器会把它当作普通段保留下来。这带来了一个严重的安全后果攻击者构造/..;foobar/之类的路径时规范器无法折叠 dotdot 段导致实际处理路径与规范路径不一致可能绕过基于路径的路由匹配、访问控制RBAC或鉴权规则形成路径规范化绕过Path Normalization Bypass。这正是 CVE-2026-73551 所修复的问题。该漏洞公告见 changelogs/current/bug_fixes/url_normalization__collapse_dotdot_segments_with_parameters.rst对应 Envoy 安全公告 GHSA-2w8w-rfw7-8gg4CVE-2026-73551。修复思路先剥离参数再折叠段修复策略很直接在路径规范化之前先把 dot/dotdot 段中携带的路径参数剥离掉让/..;foobar还原为/..、/.;foobar还原为/./这样后续的 RFC 3986 规范化就能正确识别并折叠它们。修复的触发条件根据变更日志的明确说明这一行为改变仅在启用normalize_path配置选项时才生效normalize_path未启用时路径不进行规范化剥离逻辑也不会触发行为与修复前一致normalize_path启用时stripParametersFromDotSegments作为规范化前的一个预处理步骤被执行。关键实现stripParametersFromDotSegments该修复的核心实现在 source/common/http/path_utility.cc 的PathUtil::stripParametersFromDotSegmentsvoid PathUtil::stripParametersFromDotSegments(RequestHeaderMap headers) { ASSERT(headers.Path()); const auto original_path headers.getPathValue(); const absl::string_view::size_type query_or_fragment original_path.find_first_of(?#); absl::string_view path original_path.substr(0, query_or_fragment); if (path.find(.;) absl::string_view::npos) { return; } const absl::string_view query_and_fragment query_or_fragment absl::string_view::npos ? absl::string_view{} : original_path.substr(query_or_fragment); // Remove parameters from dot and dotdot segments so the subsequent path canonicalization // can correctly collapse them. std::vectorabsl::string_view segments absl::StrSplit(path, /); for (auto segment : segments) { if (absl::StartsWith(segment, ..;)) { segment ..; } else if (absl::StartsWith(segment, .;)) { segment .; } } headers.setPath(absl::StrCat(absl::StrJoin(segments, /), query_and_fragment)); }从源码结构可以看出该实现的几个关键行为只处理路径部分先通过find_first_of(?#)切出 query 与 fragment仅对路径段做剥离查询字符串与片段原样保留例如/xyz?param/..;foo中 query 里的..;foo不会被误伤快速短路若路径中不存在.;同时覆盖.;与..;两种形态直接返回零开销精确匹配前缀仅当段以..;或.;开头时才剥离参数..foo、...;foo、.foo等不以分号紧跟的段不受影响测试见 test/common/http/path_utility_test.cc 第 149-179 行的StripDotSegmentWithParameters用例多参数段一并剥离..;param1;param2也会整体还原为..与规范化流程衔接canonicalPath在stripParametersFromDotSegments之后调用url::CanonicalizePath来自 Google URL 库此时/xyz/../abc可被正确折叠为/abc。调用链canonicalPath 中的门控在同一个文件中的PathUtil::canonicalPathsource/common/http/path_utility.cc 第 33-61 行展示了修复如何被接入/* static */ bool PathUtil::canonicalPath(RequestHeaderMap headers) { ASSERT(headers.Path()); if (Runtime::runtimeFeatureEnabled( envoy.reloadable_features.strip_dotdot_segments_with_parameters)) { stripParametersFromDotSegments(headers); } const auto original_path headers.getPathValue(); ... auto normalized_path_opt canonicalizePath(...); ... }关键点stripParametersFromDotSegments的调用被 runtime guard 包裹。也就是说即使normalize_path已启用也只有在 runtime guard 处于默认开启状态时才会执行剥离。而根据变更日志guard 关闭时envoy.reloadable_features.strip_dotdot_segments_with_parameters设为false可临时回退到修复前的行为。normalize_path本身在 api/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto字段normalize_path 30第 947-961 行注释中定义启用后HTTP filters 与路由处理请求前路径会按 RFC 3986 规范化影响上游:path头格式不合法的路径会返回 400。注意该字段当前默认false未来默认将变为true未显式指定时可由 runtime 变量http_connection_manager.normalize_path覆盖。运行时回退机制runtime guard为便于运维方在升级后观察影响、处理异常Envoy 提供了临时回退开关。变更日志明确说明该行为变更可通过将 runtime guardenvoy.reloadable_features.strip_dotdot_segments_with_parameters设置为false临时回退。该 guard 在 source/common/runtime/runtime_features.cc 中注册RUNTIME_GUARD(envoy_reloadable_features_strip_dotdot_segments_with_parameters);配置方式Bootstrap 的runtime_layerlayered_runtime: layers: - name: static_layer static_layer: envoy: reloadable_features: strip_dotdot_segments_with_parameters: false回退适用于以下场景生产环境升级到包含此修复的版本后发现依赖旧行为的请求如路径参数本身携带业务语义、且依赖 dotdot 折叠行为出现异常需要先在灰度环境验证修复对现有流量的影响再全量放开。需要强调的是关闭 guard 意味着路径规范化绕过漏洞重新暴露因此仅应作为短期应急手段问题解决后应尽快恢复默认guard 缺省即为true剥离逻辑默认生效。测试验证修复行为的证据修复的正确性由单元测试充分覆盖测试文件为 test/common/http/path_utility_test.cc。剥离逻辑测试StripDotSegmentWithParametersPathUtil::stripParametersFromDotSegments的剥离行为测试第 149-179 行覆盖了 dot 与 dotdot 两类段// dotdot 段 EXPECT_EQ(/xyz/../abc, stripDot(/xyz/..;foobar/abc)); EXPECT_EQ(/../abc, stripDot(/..;foobar/abc)); EXPECT_EQ(/xyz/.., stripDot(/xyz/..;foobar)); EXPECT_EQ(/a/../b, stripDot(/a/..;param1;param2/b)); // dot 段 EXPECT_EQ(/xyz/./abc, stripDot(/xyz/.;foobar/abc)); EXPECT_EQ(/./abc, stripDot(/.;foobar/abc)); EXPECT_EQ(/xyz/., stripDot(/xyz/.;foobar)); // 非分号后缀不受影响 EXPECT_EQ(/xyz/..foo, stripDot(/xyz/..foo)); EXPECT_EQ(/xyz/...;foo,stripDot(/xyz/...;foo)); // query/fragment 中的分号段不被误伤 EXPECT_EQ(/xyz?param/..;foo, stripDot(/xyz?param/..;foo)); EXPECT_EQ(/xyz#frag/..;foo, stripDot(/xyz#frag/..;foo));关闭 guard 后的回归测试NormalizeValidPathsDisabled对应 guard 关闭时的行为测试第 87-103 行通过TestScopedRuntime将envoy.reloadable_features.strip_dotdot_segments_with_parameters合并为false验证修复前行为被完整保留scoped_runtime.mergeValues( {{envoy.reloadable_features.strip_dotdot_segments_with_parameters, false}}); const std::vectorstd::pairstd::string, std::string non_normal_pairs{ {/xyz/..;foobar/abc, /xyz/..;foobar/abc}, {/..;foobar/abc, /..;foobar/abc}, {/xyz/..;foobar, /xyz/..;foobar}};即 guard 关闭时..;foobar段原样保留、不做折叠与修复前行为一致证明回退开关有效。相关集成层面也有同样验证见 test/common/http/conn_manager_utility_test.cc 第 2725 行附近的用例。完整效果示例结合以上实现与测试启用修复normalize_path: true guard 默认开启后请求路径规范化结果/a/../b/b/a/..;foobar/b/b/a/.;foo/b/a/b/a/..;param1;param2/b/b/a/..foo/b/a/..foo/b非 dotdot 段不剥离/a/..;foo/b?x/..;y/b?x/..;yquery 不受影响升级与运维建议确认版本升级到包含该修复的 Envoy 版本并核对发布说明中本变更的归属评估 normalize_path 状态该修复仅在normalize_path启用时生效。若你尚未启用normalize_path建议评估启用默认未来将变为true以获得路径规范化带来的路由一致性收益观察期回退若升级后出现依赖旧行为的异常流量可通过 runtime guardenvoy.reloadable_features.strip_dotdot_segments_with_parameters false临时回退同时排查并修正依赖路径参数的客户端随后恢复默认并再次验证安全回归回退期间应视为漏洞处于暴露状态密切监控相关路径的异常访问模式尽快恢复正常配置。小结CVE-2026-73551 的修复通过先剥离 dot/dotdot 段中的路径参数、再执行 RFC 3986 规范化的两步策略在normalize_path启用的前提下堵住了路径规范化绕过漏洞。修复由 runtime guardenvoy.reloadable_features.strip_dotdot_segments_with_parameters控制既保证了默认安全也保留了运维方临时回退的弹性。其核心实现位于 source/common/http/path_utility.cc并由 test/common/http/path_utility_test.cc 中的正反两组测试用例完整锁定行为。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考