Istio 1.28.8:修补 Envoy 内存耗尽漏洞与三项关键 Bug

2026-06-04 19 预计阅读时间:1 分钟
来源:istio.io AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:8 分钟

Istio 1.28.8 是一个聚焦安全与稳定性的补丁版本,核心变化只有一个:堵住 Envoy 在 HTTP/2 场景下的内存耗尽漏洞(CVE-2026-47774,CVSS 7.5),同时修复了 ListenerSet 证书丢失、Route 过滤器静默丢弃、以及 Ambient 模式下拓扑感知路由与健康策略联动异常三个问题。如果你的集群正在跑 1.28.x,这次升级不应拖延。

CVE-2026-47774:HTTP/2 请求可以让 Envoy 吃满内存

漏洞的根因是两道防线各有缺口:

  1. Cookie 头字节未被计入请求头大小校验——Envoy 在校验请求头总大小时漏掉了 Cookie 字段的字节数,攻击者可以在 Cookie 里塞入超长内容绕过限制。
  2. HPACK 编码限制不等于解码限制——Envoy 对 HPACK 压缩后的编码字节有上限约束,但解码后的原始头大小没有对应限制。攻击者构造高压缩比的 HTTP/2 头块,解码后体积远超编码体积,直接撑爆内存。

两处缺陷叠加,一个无需认证的远程攻击者就能用精心构造的 HTTP/2 请求让 Envoy 进程 OOM,网关侧的 Sidecar 或 Ingress Gateway 都受影响。

影响面判断:任何暴露 HTTP/2 端口的 Istio Gateway 或 Sidecar 均在攻击范围内。纯 HTTP/1.1 场景不受此漏洞影响,但生产环境极少只跑 HTTP/1.1。

ListenerSet 证书丢失:手动 TLS 部署的 Gateway 配了 HTTPS 却拿不到证书

Issue #59535 修复的场景是:你在 Gateway 上用 manual 方式部署 TLS 证书(即自己写 Secret 引用,不走自动 SDS 推送),同时通过 ListenerSet 定义 HTTPS 监听器。结果 ListenerSet 里的监听器虽然声明了 TLS,Envoy 却没有拿到证书——连接握手直接失败。

这个问题在多端口、多协议的 Gateway 场景下容易踩到,尤其是同一个 Gateway 同时挂 TCP 和 HTTPS ListenerSet 时。

Route 过滤器静默丢弃:无效头值不报错,流量策略悄悄失效

Issue #59933 修复的是 HTTPRoute 和 GRPCRoute 的过滤器校验逻辑。当过滤器中配置了非法的 header 值(比如包含不可见字符或超长字符串),旧版本的做法是静默丢弃整个过滤器——Envoy 配置里这条过滤器直接消失,但 API 状态不报 Invalid。

后果是:你写了流量拆分、重试、或头变换策略,控制面显示 Accepted,数据面却根本没生效。排查时只能去 Envoy config dump 逐条比对才能发现差异。

1.28.8 之后,这类过滤器会被标记为 InvalidFilter 状态,状态条件里能看到具体报错,不再"悄悄消失"。

Ambient 模式拓扑感知路由的连锁反应

Issue #60422 是最隐蔽的一个。场景如下:

  • 你有一个 Service 同时设置了 publishNotReadyAddresses: truetrafficDistribution: PreferSameZone(或 PreferSameNode)。
  • 这个组合导致 ztunnel 在处理拓扑感知路由时,把 healthPolicy: AllowAll 错误地扩散到了所有使用相同 trafficDistribution 预设的 Service——不仅仅是当前这个 Service。

也就是说,集群里其他正常 Service 的端点健康检查被绕过,流量可能被路由到尚未 Ready 的 Pod,而且是全局性的。

下面是一个会触发此问题的 Service 配置示例,升级前你可以用它自查集群中是否存在类似组合:

apiVersion: v1
kind: Service
metadata:
  name: my-app
  namespace: production
spec:
  selector:
    app: my-app
  ports:
    - port: 8080
      targetPort: 8080
  # ⚠ 升级前重点排查:publishNotReadyAddresses + trafficDistribution 的组合
  publishNotReadyAddresses: true
  trafficDistribution: PreferSameZone

用以下命令快速扫描集群中所有存在此组合的 Service:

kubectl get svc -A -o json | jq -r '.items[] |
  select(.spec.publishNotReadyAddresses == true and
         .spec.trafficDistribution != null) |
  "\(.metadata.namespace)/\(.metadata.name) trafficDistribution=\(.spec.trafficDistribution)"'

如果输出非空,说明你的集群在 1.28.7 及更早版本下已经存在 AllowAll 扩散风险,应尽快升级到 1.28.8。

升级实操与检查清单

Istio 补丁版本升级是原地替换,控制面和数据面 Sidecar 均需滚动更新。以下命令覆盖典型升级流程:

# 1. 下载 1.28.8
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.28.8 sh -
cd istio-1.28.8
export PATH=$PWD/bin:$PATH

# 2. 升级控制面(原地替换,不改变配置)
istioctl upgrade

# 3. 确认控制面版本
istioctl version

# 4. 滚动重启数据面 Sidecar,让新 Envoy 生效
kubectl rollout restart deployment -n production

# 5. 验证 Envoy 版本已更新(任意一个 Pod 即可)
kubectl exec -n production my-app-xxxx -c istio-proxy \
  -- pilot-agent request GET server_info | grep "Istio Version"

升级前检查清单

检查项 命令/方法 关注点
当前版本 istioctl version 确认是 1.28.x 系列
Gateway 是否暴露 HTTP/2 kubectl get gateway -A -o yaml | grep -i h2 有 HTTP/2 的优先升级
Service 组合风险 上文 jq 命令 publishNotReadyAddresses + trafficDistribution
Route 过滤器状态 kubectl get httproute -A -o yaml | grep -A5 filters 检查是否有被静默丢弃的策略
ListenerSet + 手动 TLS kubectl get listenerset -A -o yaml | grep -i tls 确认 HTTPS 监听器证书是否正常

升级后验证

  • 对暴露 HTTP/2 的 Gateway,用 h2loadcurl --http2 发送超长头请求,确认不再触发内存飙升。
  • 对使用了 trafficDistribution 的 Service,检查 ztunnel 日志中 healthPolicy 字段是否恢复为正常值(而非 AllowAll)。
  • 对 HTTPRoute 过滤器,故意配置一个非法 header 值,确认状态变为 InvalidFilter 而非静默消失。

这次补丁没有新功能,但 CVE-2026-47774 的攻击门槛低、影响面广,加上 Ambient 模式的全局性健康策略扩散问题,升级优先级应判为高。


相关推荐