拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Envoy safe_regex 字符集修复深度解析:CVE-2026-73552 与 RE2 Latin1 模式切换

Envoy safe_regex 字符集修复深度解析CVE-2026-73552 与 RE2 Latin1 模式切换【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy本文基于 changelogs/current/bug_fixes/safe_regex__switch_charset_to_latin1.rst 展开围绕 Envoy 针对安全通告 CVE-2026-73552 的修复将safe_regexRE2 正则引擎的字符集模式从 UTF-8 切换为 Latin1。文章结合 source/common/common/regex.cc、source/common/runtime/runtime_features.cc 等源码与 api/envoy/type/matcher/v3/regex.proto 配置定义说明修复动机、实现原理、运行时回退开关及对现有配置的升级影响帮助读者理解为何 HTTP 报文上的正则匹配必须使用 Latin1 字符集。一、背景CVE-2026-73552 是什么问题本仓库的 安全修复变更记录 记录了针对安全通告CVE-2026-73552GitHub 安全公告编号 GHSA-23xh-2qxr-3xv8的修复内容核心变更一句话概括将safe_regex的字符集模式从 UTF-8 切换到 Latin1ISO-8859-1。HTTP 头并非 UTF-8 编码因此用于正则表达式匹配时必须以 Latin1 字符集处理。这里的关键概念是 Envoy 中的safe_regex字段它广泛用于路由匹配RouteMatch、字符串匹配StringMatcher如 header 匹配等场景底层默认由 Google 的RE2正则引擎驱动。RE2 引擎的设计目标是「线性时间完成匹配、限制内存使用」避免经典回溯型正则引擎如 PCRE遭遇灾难性回溯catastrophic backtracking导致的 ReDoS 攻击这也是它被命名为 safe_regex 的原因——即使面对不可信输入也能保证执行效率可控。而本次 CVE 暴露的问题恰恰与「安全」的另一面有关当被匹配的输入不是 UTF-8 编码时以 UTF-8 模式解析字节序列可能导致匹配结果与预期不符甚至被利用绕过安全校验逻辑。HTTP 协议栈中的 header 值本质上是字节序列HTTP/1.x 时代定义为 ISO-8859-1 / Latin1 字节流实践中允许任意字节 0x00-0xFF并不是规范的 UTF-8 文本。此前 Envoy 的 RE2 引擎默认按 UTF-8 模式编译和匹配正则二者之间的错位就是漏洞的根源。二、修复内容字符集从 UTF-8 切换为 Latin1修复的核心动作非常明确safe_regex使用的 RE2 引擎在编译正则时将字符编码模式由默认的 UTF-8 切换为Latin1RE2::Options::EncodingLatin1。这一改动意味着正则中的.、字符类如[a-z]、\w、\d等元字符与字符类不再按 UTF-8 码点语义解释而是按单字节Latin1即 ISO-8859-1 编码空间 0x00-0xFF逐个字节匹配正则模式本身与被匹配的 HTTP header 字节流处于同一编码空间匹配语义与 RFC 7230 等 HTTP 规范中 header 字段值的字节语义保持一致由于 Latin1 是单字节编码每个字节就是一个字符正则匹配不会因输入中出现非法 UTF-8 序列如孤立的高位字节 0x80-0xFF、截断的多字节序列而产生歧义或异常行为。为什么 HTTP 头必须是 Latin1 而不是 UTF-8在 HTTP/1.1 协议语义中header 字段值的规范定义基于 ISO-8859-1Latin1字符集且通过字节传输。而现代 Web 环境中客户端、上游服务可能发送任意原始字节例如 URL 编码之外的 0x80-0xFF 字节或非 UTF-8 的遗留编码内容。如果正则引擎按 UTF-8 模式解析一个字节 0xC3 0xA9UTF-8 编码的é会被解析为一个字符而 0xC3 单独出现则构成非法序列^/$锚点、长度限制类校验如 header 长度检测、路径规范化检测可能因字节/字符换算不一致而出现绕过窗口不同代理对同一字节序列的「字符」理解不一致导致 Envoy 与后端之间对请求的解析出现分歧语义分裂。修复后Envoy 的safe_regex对 header 字节流与正则统一按 Latin1 逐字节匹配从底层消除了这类因编码错位引发的安全与一致性问题。三、源码级实现runtime guard 与 RE2 编码选项3.1 核心实现initRe2Options()在 source/common/common/regex.cc 中RE2 引擎的编译选项由initRe2Options()统一构造RE2::Options initRe2Options() { RE2::Options options(RE2::CannedOptions::Quiet); if (Runtime::runtimeFeatureEnabled(envoy.reloadable_features.re2_use_latin1_mode)) { options.set_encoding(RE2::Options::EncodingLatin1); } return options; }实现要点所有CompiledGoogleReMatcher的构造create/createAndSizeCheck见 regex.cc最终都会经过该选项构造即仓库内所有基于 RE2 的 safe_regex 匹配统一受此开关控制当运行时特性envoy.reloadable_features.re2_use_latin1_mode处于默认开启状态时调用 RE2 的set_encoding(RE2::Options::EncodingLatin1)将编译选项切换为 Latin1 单字节模式当该特性被显式关闭设为false时set_encoding不会被调用RE2 保持默认的 UTF-8 编码模式即回归修复前的旧行为。3.2 Runtime guard 的注册envoy.reloadable_features.re2_use_latin1_mode是 Envoy 标准的可重载运行时特性reloadable feature / runtime guard在 source/common/runtime/runtime_features.cc 中以RUNTIME_GUARD宏注册RUNTIME_GUARD(envoy_reloadable_features_re2_use_latin1_mode);这意味着该开关默认启用true随版本发布即生效可通过 runtime 配置在不重新编译、不重启的情况下动态切换Envoy 会热加载新的运行时值该 guard 与其它数百个envoy.reloadable_features.*开关一样遵循 Envoy 的 runtime 分层配置体系bootstrap runtime、磁盘 runtime 目录、admin 接口等来源。3.3 匹配与替换的完整链路safe_regex匹配最终由CompiledGoogleReMatcher::match完成source/common/common/regex.hbool match(absl::string_view value) const override { return re2::RE2::FullMatch(value, regex_); }注意这里使用的是FullMatch——正则与整个输入字符串做全量匹配而非部分匹配这也符合 regex.proto 中对regex字段「matched against the full string」的语义定义。此外还有replaceAll用于基于正则的字符串替换如 header 值改写、路径重写中的捕获组引用见 regex.h同样基于这份 Latin1 编码的编译结果。四、运行时回退临时恢复旧行为官方变更记录明确给出了临时回退方案如果该行为变更对现有部署造成影响可将运行时 guardenvoy.reloadable_features.re2_use_latin1_mode设置为false即可暂时恢复到修复前的 UTF-8 模式。配置方式示例在 bootstrap 配置的 runtime layer 中设置例如使用磁盘 runtime 目录中的envoy.yamllayered_runtime: layers: - name: static_layer_0 static_layer: envoy: reloadable_features: re2_use_latin1_mode: false或通过 admin 接口/runtime动态修改运行时值需要开启 admin 端口。设置后无需重启 Envoy 即可生效验证可通过 admin 的 runtime 查询接口确认当前值。何时需要回退需要关注的行为差异集中在对非 ASCII 字节序列的匹配语义上如果你的安全规则如 RBAC header 校验、路由路径匹配、header 正则校验过滤器此前依赖 UTF-8 模式下的多字节字符语义例如^/[\p{L}]这类按码点匹配的正则切换 Latin1 后匹配粒度变为逐字节模式可能需要改写若你的正则中直接内嵌了 UTF-8 多字节字面量如中文字符串在 Latin1 模式下需要确保模式按 UTF-8 字节序列书写或在必要时先回退开关官方将回退定位为「temporary」临时性建议在验证并调整正则后尽快重新启用 Latin1 模式因为 UTF-8 模式下的编码歧义正是 CVE 的根源长期保留旧行为意味着安全风险敞口。五、safe_regex 的典型使用场景与配置示例safe_regex在 Envoy 中通过 RegexMatcher 消息表达典型嵌入位置包括路由匹配RouteMatch.safe_regex路径正则匹配见 docs/root/intro/arch_overview/http/http_routing.rst字符串匹配StringMatcher.safe_regexheader 值、query 参数等字符串匹配见 api/envoy/type/matcher/v3/string.proto正则替换RegexMatchAndSubstitute如 header 改写中的正则捕获组引用见 regex.proto。一个在路由中匹配 header 值的配置示例match: headers: - name: :path safe_regex_match: google_re2: {} regex: ^/api/v[0-9]/.*$在上述配置中正则^/api/v[0-9]/.*$会在 Latin1 模式下按字节编译.匹配任意单字节0x00-0xFF。由于修复后引擎对 HTTP header 的字节输入与正则使用同一编码语义这类匹配对含任意字节值的真实请求都是可预期、一致的。相关的程序大小program size防护safe_regex的「安全」还体现在编译期防护上。regex.proto 与 google_re2.proto 记录了相关的运行时阈值与统计运行时键re2.max_program_size.error_level编译后 RE2 程序大小超过该值默认 100则编译失败抛错运行时键re2.max_program_size.warn_level超过该值仅记录警告默认未设置即不检查统计指标re2.program_size直方图记录程序大小与re2.exceeded_warn_level计数器超过 warn 阈值时累加。对应实现见 regex.ccCompiledGoogleReMatcher构造时会读取上述运行时键对正则的程序复杂度做 error / warn 两级阈值校验进一步保证即使管理员配置了极端复杂的正则也不会拖垮数据面性能。测试用例可参考 test/common/common/regex_test.cc其中覆盖了非法正则、超长输入匹配等回归场景。六、升级影响与操作建议综合以上分析针对本次修复的落地建议如下确认 Envoy 版本包含本修复CVE-2026-73552 的修复已进入本仓库当前变更集升级到包含该changelogs/current/bug_fixes/safe_regex__switch_charset_to_latin1.rst的版本即默认启用 Latin1 模式审计现有正则重点排查 header 匹配、路径匹配、RBAC、路由重写等场景中依赖多字节非 ASCII字面量或 Unicode 属性类\p{L}、\p{N}等的正则模式确认它们在逐字节 Latin1 语义下行为符合预期借助运行时开关灰度在验证不充分的环境中可先通过 runtime 将envoy.reloadable_features.re2_use_latin1_mode置为false临时回退分批验证、逐步恢复同时留意 Envoy 官方后续版本中对旧开关的移除计划不要长期关闭该开关UTF-8 模式对非 UTF-8 HTTP 字节流的歧义解析正是 CVE-2026-73552 的成因长期回退会重新暴露安全风险回退仅作为短期过渡手段结合程序大小防护在正则变更时同步关注re2.max_program_size.error_level/warn_level运行时阈值与re2.program_size、re2.exceeded_warn_level指标确保正则复杂度仍在可控范围。七、小结本次针对 CVE-2026-73552 的修复虽然只有一行核心变更——将safe_regex的 RE2 字符集从 UTF-8 切换为 Latin1——但其安全意义深远它消除了 Envoy 与 HTTP 协议语义在字符编码认知上的错位确保所有基于正则的安全校验路由、RBAC、header 匹配等在字节层面与协议行为严格一致。配合envoy.reloadable_features.re2_use_latin1_mode运行时开关运维人员可以在保持安全的前提下平滑完成升级过渡。理解这一修复的实现细节regex.cc 中的initRe2Options与 runtime guard 注册有助于在升级后快速定位和修正任何因字符集语义变化而受影响的配置。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门