Docker Engine 29.8.2 修掉恶意 DNS 导致的 registry TLS 跳过,29.9.0-rc.1 补 containerd 丢层
29.8.2:两个优先处理的问题
CVE-2026-92543:恶意 DNS 响应让 registry 连接降级
漏洞落在 daemon 连接 registry 的路径上。当攻击者能影响 Docker daemon 收到的 DNS 响应时,可以让 registry 连接直接跳过 TLS 证书校验,或者回退到明文 HTTP。触发面是 DNS 这一层,比如同一网段内的劫持、被控的上游解析器。
后果有两个方向:
- 凭据暴露。连接一旦走 HTTP 或跳过证书校验,
docker login期间以及后续请求携带的 registry 凭据、token 对中间人就是可见的。 - 镜像替换。拉取到的 manifest 与 layer 来自攻击者控制的 endpoint,daemon 把来源当作可信来源处理,落到本地的就是被替换过的内容。
对使用私有 registry 的环境,这个漏洞的实际影响比一个普通的 TLS 配置错误更大:它绕过的不是本地的一次配置疏漏,而是运行时的判断本身。
GHSA-7cfq-22r6-qp73。
CVE-2026-53493:深层嵌套、宽扇出的 OCI image index
拉取一个构造出来的 OCI image index,其描述符可以深层嵌套,也可以宽扇出。daemon 在展开这类结构时,CPU 和内存消耗没有上限,结果是资源被吃满,同一节点上的容器和 daemon 自身都受牵连。
正常镜像的描述符嵌套层次是很浅的,单层描述符数量也有限。异常点就出现在深度和单层数量上:一次 pull 就能触发,不需要镜像事先被信任。
GHSA-pg57-6jwg-q645。
同一版本里的另外两处
- CVE-2026-92542:Swarm 模式下,未授权方可能向对等节点注入伪造以太网帧。GHSA-6m9p-4h64-m6vh。
- BuildKit:修复 CVE-2026-93315,构建步骤可以把 proxy CA 清理重定向到构建根文件系统之外等。
29.9.0-rc.1:containerd image store 的丢层
使用 containerd image store 时,如果本地已存在某个解包后的层,拉取过程会跳过必需的 layer blob。表现比较别扭:镜像能正常运行,因为本地缺的那一层已经解包可用,但导出或推送出来的镜像是不完整的,blob 缺失。
只要把镜像当交付物往外传,这条就会踩到:docker save 的归档、推送到私有仓库、镜像归档与同步。运行正常和产物完整在这套逻辑里是两件事。
同版本还包含:
- 修复 rootless 模式下每次
GET /version打到 RootlessKit API socket 的连接泄漏。 - BuildKit 更新至 v0.34.0-rc1,containerd 静态二进制更新至 v2.4.1,RootlessKit 更新至 3.2.0。
- 允许 ICC 关闭的 bridge 网络容器之间进行 IPv6 邻居发现,与 IPv4 行为保持一致。
升级与自查
升级到 29.8.2 或更高版本。29.9.0-rc.1 已包含 29.8.2 的修复。
升级前,先看 daemon 配置里的 insecure-registries,非必要不保留——它对应的正是本次漏洞的降级落点。内网 registry 用自签证书时,把 CA 放到 /etc/docker/certs.d//ca.crt,让校验正常通过,而不是靠跳过校验换可用性。
升级后做两件事:
- 抓一次
docker pull过程中的 DNS 解析结果与实际连接目标,确认走的是 443 且证书校验正常,没有静默降级。 - 对启用了 containerd image store 的节点,如果近期出现过导出或推送产物异常,升到 29.9.0-rc.1 后重新导出并推送一次,核对层集合完整。
参考
- Docker Engine 29 release notes:https://docs.docker.com/engine/release-notes/29/
- docker-v29.8.2 release:https://github.com/moby/moby/releases/tag/docker-v29.8.2