Docker Engine 19.03 发行说明

19.03.15

2021-02-01

安全

  • CVE-2021-21285 防止无效镜像导致 Docker 守护进程崩溃
  • CVE-2021-21284 锁定文件权限以防止重映射的 root 用户访问 Docker 状态
  • 在使用 BuildKit 构建时,请确保应用 AppArmor 和 SELinux 配置文件

客户端

  • 在导入上下文之前进行检查,以降低提取的文件逃逸上下文存储的风险

19.03.14

2020-12-01

安全

构建器

  • AppArmor 的测试版本现在可以正确解析,从而防止构建失败 moby/moby#41542

网络

  • 修复当 swarmkit 服务持续启动失败时的 panic 问题 moby/moby#41635

运行时

无根模式

  • 锁定状态目录以防止 systemd-tmpfiles 自动清理 moby/moby#41635
  • dockerd-rootless.sh:支持新的 containerd shim socket 路径约定 moby/moby#41557

日志记录

19.03.13

2020-09-16

构建器

  • buildkit: 修复缓存逻辑中的空指针解引用问题 moby/moby#41279
  • buildkit: 在 COPY/ADD 期间将 Unix socket 视为普通文件 moby/moby#41269
  • buildkit:在计算中忽略系统和安全扩展属性(xattrs),以确保无论 SELinux 环境如何,COPY 缓存保持一致 moby/moby#41222
  • buildkit: 使 --cache-from 的行为更可靠 moby/moby#41222
  • buildkit:修复导出缓存时导致 CPU 无限循环占用的问题 moby/moby#41185

客户端

网络

无根模式

运行时

Windows

  • 修复使用 servercore 镜像时 Windows 容器启动缓慢的问题 moby/moby#41192

19.03.12

2020-06-18

客户端

  • 修复了在使用多个配置文件时(例如在 Docker Desktop 中同时使用 Windows 和 WSL2)无法从注册表注销的 bug docker/cli#2592
  • 修复阻止读取上下文元数据的回归问题 docker/cli#2586
  • 升级 Golang 1.13.12 docker/cli#2575

网络

运行时

19.03.11

2020-06-01

网络

禁用 IPv6 路由器通告以防止地址欺骗。 CVE-2020-13401

描述

在 Docker 默认配置中,容器网络接口是一个连接到主机的虚拟以太网链路(veth 接口)。 在此配置下,能够以 root 身份在容器中运行进程的攻击者可以利用 CAP_NET_RAW 能力(存在于默认配置中),向主机发送和接收任意数据包。

如果主机上未完全禁用 IPv6(即内核命令行中未设置 ipv6.disable=1),那么它要么在某些接口上未配置,要么已配置,但 IPv6 转发很可能是禁用的,即设置为 /proc/sys/net/ipv6/conf//forwarding == 0。此外,默认情况下,/proc/sys/net/ipv6/conf//accept_ra == 1。这两个 sysctl 参数的组合意味着主机会接收路由器通告,并利用它们来配置 IPv6 协议栈。

通过从容器发送“流氓”路由器广告,攻击者可以重新配置主机,将主机的部分或全部 IPv6 流量重定向到由攻击者控制的容器。

即使此前没有 IPv6 流量,如果 DNS 返回了 A(IPv4)和 AAAA(IPv6)记录,许多 HTTP 库会尝试优先通过 IPv6 连接,失败后再回退到 IPv4,这便给了攻击者响应并介入的机会。 如果主机恰好存在类似去年 apt 中的远程代码执行漏洞(CVE-2019-3462),攻击者现在便可利用该漏洞提升至主机权限。

由于 Docker 容器默认不包含 CAP_NET_ADMIN,攻击者无法配置他们想要的中间人(MitM)IP 地址,无法使用 iptables 对流量进行 NAT 或重定向,也无法使用 IP_TRANSPARENT。 不过,攻击者仍然可以使用 CAP_NET_RAW 并在用户态实现 tcp/ip 协议栈。

查看 kubernetes/kubernetes#91507 以了解相关问题。

19.03.10

2020-05-29

客户端

网络

运行时

  • 通过升级 Go 至 1.13.11 以避免在 s390x 上出现潜在的恐慌。 moby/moby#40978

打包

19.03.9

2020-05-14

构建器

  • buildkit:修复在并行构建多个镜像时发生的并发 map 写入 panic 问题。 moby/moby#40780
  • buildkit:修复了在启用 userns 时,无法在不同阶段之间更改非 root 用户拥有的文件所有权的问题。 moby/moby#40955
  • 避免在 Windows 上创建无关的临时文件。

客户端

日志记录

  • 避免由于关闭已关闭的日志文件而导致容器日志无法轮转的情况。 moby/moby#40921

网络

运行时

无根模式

  • 现在 rootlesskit-docker-proxy 在暴露特权端口时会返回详细的错误消息。 moby/moby#40863
  • 支持 /etc/subuid 和 /etc/subgid 中的数字 ID。 moby/moby#40951

安全

Swarm

19.03.8

2020-03-10

运行时

19.03.7

2020-03-03

构建器

运行时

客户端

19.03.6

2020-02-12

构建器

网络

运行时

19.03.5

2019-11-14

构建器

  • builder-next:在构建器配置中添加了 entitlementsdocker/engine#412
  • 修复 builder-next:在使用 build secrets 或 ssh 转发配合 userns-remap 时出现的权限错误。 docker/engine#420
  • 修复 builder-next:在已复制的目录中复制符号链接。 docker/engine#420

打包

  • 支持 RHEL 8 软件包

运行时

19.03.4

2019-10-17

网络

  • 回滚 libnetwork 更改以修复 DOCKER-USER iptables 链问题。 docker/engine#404

已知问题

已存在

  • 在某些大规模集群的情况下,Docker 信息可能会在 Swarm 部分中显示错误 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304)。这并不表示用户端存在任何故障或配置错误,也无需采取任何操作。
  • 当重新部署所有服务为新实例时,可能会发生编排器端口冲突。由于在短时间内收到大量 Swarm 管理器请求,部分服务无法接收流量,导致部署后出现 404 错误。
    • 临时解决方案:通过 docker service update --force 重启所有任务。
  • CVE-2018-15664 带有目录遍历的符号链接交换攻击。在即将发布的补丁版本提供正式修复前的临时解决方案:在执行文件操作之前,先对 docker pause 容器进行处理。
    moby/moby#39252
  • docker cp 由于 CVE 修复导致的性能回退。当将 docker cp 的源设置为 / 时会产生错误。

19.03.3

2019-10-08

安全

构建器

  • 修复 builder-next:解析第三方注册表的摘要。 docker/engine#339

  • 修复 builder-next:当守护进程通过 socket 激活启动时的用户命名空间构建问题。 docker/engine#373

  • 修复 builder-next;会话:为每个连接转发 SSH 套接字连接。 docker/engine#373

  • 修复 build-next:llbsolver:多个缓存导入器出现错误。 docker/engine#373

客户端

  • 已添加对 Docker Template 0.1.6 的支持。

  • 减轻具有过多别名的 YAML 文件带来的风险。 docker/cli#2119

运行时

  • 将 Golang 升级到 1.12.10。 docker/engine#387

  • 将 containerd 升级至 1.2.10。 docker/engine#385

  • 发行版:拉取 v2 schema1 清单时修改警告逻辑。 docker/engine#368

  • 修复在提供不正确的平台选项时 POST /images/create 返回 500 状态码的问题。 docker/engine#365

  • 修复在提供不正确的平台选项时 POST /build 返回 500 状态码的问题。 docker/engine#365

  • 修复由结构体成员未对齐导致的 32 位 ARMv7 恐慌问题。 docker/engine#363

  • 修复了链接到不存在的容器时返回“无效参数”的问题。 docker/engine#352

  • 修复在使用内核 >= 5.2 时挂载 overlay2 出现的 busy 错误。 docker/engine#332

  • 修复在配置错误的系统(例如损坏的 NFS 共享)中卡住的 docker rmidocker/engine#335

  • 修复已启动进程的阻塞 I/O 处理问题。 docker/engine#296

  • 修复 jsonfile 日志记录器:当设置 max-sizemax-file=1 时,跟踪日志卡住的问题。 docker/engine#378

已知问题

  • DOCKER-USER iptables 链丢失: docker/for-linux#810.用户无法在此 iptables 链之上执行额外的容器网络流量过滤。如果您未在 DOCKER-USER 之上自定义 iptable 链,则不会受到此问题的影响。
    • 变通方案: 在 Docker 守护进程启动后插入 iptables 链。 例如:
      iptables -N DOCKER-USER
      iptables -I FORWARD -j DOCKER-USER
      iptables -A DOCKER-USER -j RETURN

已存在

  • 在某些大规模集群的情况下,Docker 信息可能会在 Swarm 部分中显示错误 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304)。这并不表示用户端存在任何故障或配置错误,也无需采取任何操作。
  • 当重新部署所有服务为新实例时,可能会发生编排器端口冲突。由于在短时间内收到大量 Swarm 管理器请求,部分服务无法接收流量,导致部署后出现 404 错误。
    • 临时解决方案:通过 docker service update --force 重启所有任务。
  • CVE-2018-15664 带有目录遍历的符号链接交换攻击。在即将发布的补丁版本提供正式修复前的临时解决方案:在执行文件操作之前,先对 docker pause 容器进行处理。
    moby/moby#39252
  • docker cp 由于 CVE 修复导致的性能回退。当将 docker cp 的源设置为 / 时会产生错误。

19.03.2

2019-09-03

构建器

客户端

  • 修复非Windows系统上Windows绝对路径的检测 docker/cli#1990

  • 修复 docker login --username 的 zsh 补全脚本。

  • 修复上下文:在 context create 上产生一致输出。 docker/cli#1985

  • 修复 HTTP 代理环境变量的支持。 docker/cli#2059

日志记录

网络

  • 防止在禁用网络的情况下向容器附加网络时发生恐慌。 moby/moby#39589

运行时

  • 将 Golang 升级至 1.12.8。

  • 修复使用 XFS 磁盘配额运行容器时可能出现的引擎崩溃问题。 moby/moby#39644

Swarm

已知问题

  • 在某些大规模集群的情况下,Docker 信息可能会在 Swarm 部分中显示错误 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304)。这并不表示用户端存在任何故障或配置错误,也无需采取任何操作。

  • 当重新部署所有服务为新实例时,可能会发生编排器端口冲突。由于在短时间内有大量 Swarm 管理器的请求,部分服务无法接收流量,导致部署后出现 404 错误。

    • 变通方案:通过 docker service update --force 重启所有任务。
  • 由于 FORWARD 链中缺少 Iptables 规则,流量无法从 HOST 流出 缺少的规则为:

    /sbin/iptables --wait -C FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    /sbin/iptables --wait -C FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    • 临时解决方案:使用脚本和 cron 定义重新添加这些规则。该脚本必须包含用于检查规则是否存在“-C”命令以及用于重新添加规则的“-A”命令。以固定间隔在 cron 中运行此脚本,例如每 分钟
    • 受影响的版本:18.09.1, 19.03.0
  • CVE-2018-15664 带有目录遍历的符号链接交换攻击。在即将发布的补丁版本提供正式修复前的临时解决方案:在执行文件操作之前,先对 docker pause 容器进行处理。
    moby/moby#39252

  • docker cp 由于 CVE 修复导致的性能回退。当将 docker cp 的源设置为 / 时会产生错误。

19.03.1

2019-07-25

安全

  • 修复了 Glibc 下 chroot 环境中基于 nsswitch 的配置加载问题。 CVE-2019-14271

已知问题

  • 在某些情况下,在大型集群中,Docker 信息作为 Swarm 部分的一部分, 可能包含错误 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304)。这并不表示用户有任何故障或配置错误, 也无需采取任何响应。

  • 当重新部署所有服务为新实例时,可能会发生编排器端口冲突。由于在短时间内有大量 Swarm 管理器的请求,部分服务无法接收流量,导致部署后出现 404 错误。

    • 变通方案:通过 docker service update --force 重启所有任务。
  • 由于 FORWARD 链中缺少 Iptables 规则,流量无法从 HOST 流出 缺少的规则为:

    /sbin/iptables --wait -C FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    /sbin/iptables --wait -C FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    • 临时解决方案:使用脚本和 cron 定义重新添加这些规则。该脚本必须包含用于检查规则是否存在“-C”命令以及用于重新添加规则的“-A”命令。以固定间隔在 cron 中运行此脚本,例如每 分钟
    • 受影响的版本:18.09.1, 19.03.0
  • CVE-2018-15664 带有目录遍历的符号链接交换攻击。在即将发布的补丁版本提供正式修复前的临时解决方案:在执行文件操作之前,先对 docker pause 容器进行处理。
    moby/moby#39252

  • docker cp 由于 CVE 修复导致的性能回退。当将 docker cp 的源设置为 / 时会产生错误。

19.03.0

2019-07-22

构建器

客户端

API

  • 已将 API 版本更新至 v1.40。 moby/moby#38089
  • /info 端点添加了警告,并将检测移至守护进程。 moby/moby#37502
  • /_ping 端点添加了 HEAD 方法支持。 moby/moby#38570
  • 已添加 Cache-Control 个请求头以禁用缓存,指向 /_ping 端点。 moby/moby#38569
  • containerdruncdocker-init 版本添加到了 /versionmoby/moby#37974
  • 添加了未记录的 /grpc 端点并注册了 BuildKit 的控制器。\nmoby/moby#38990\n

实验性

安全

运行时

  • 现在允许以非 root 用户身份运行 dockerd(Rootless 模式)。 moby/moby#380050
  • Rootless:为 lxc-user-nic SUID Binaries提供可选支持。 docker/engine#208
  • 向 HostConfig 添加了 DeviceRequests 以支持 NVIDIA GPU。 moby/moby#38828
  • 为 Windows 添加了 --device 支持。 moby/moby#37638
  • 为 Linux 添加了 memory.kernelTCP 支持。 moby/moby#37043
  • Windows 凭据规范现在可以直接传递给引擎。 moby/moby#38777
  • 在 docker update 中添加了 pids-limit 支持。 moby/moby#32519
  • 新增对确切功能列表的支持。 moby/moby#38380
  • demon:现在默认使用 'private' ipc 模式。 moby/moby#35621
  • demon: 已切换为使用信号量门控的 WaitGroup 来处理启动任务。 moby/moby#38301
  • 现在使用 idtools.LookupGroup 代替解析 /etc/group 文件以修复 docker.sock 所有权问题:api.go doesn't respect nsswitch.confmoby/moby#38126
  • cli:修复了在使用多引用过滤器时镜像过滤器的显示问题。 moby/moby#38171
  • 将 Golang 升级至 1.12.5。 docker/engine#209
  • containerd 提升至 1.2.6。 moby/moby#39016
  • runc 提升至 1.0.0-rc8,opencontainers/selinux v1.2.2。 docker/engine#210
  • google.golang.org/grpc 提升至 v1.20.1。 docker/engine#215
  • 针对 aufs 和 layer store 进行了性能优化,以支持大规模并发的容器创建/删除。 moby/moby#39135 moby/moby#39209
  • Root 现在已传递给 chroot 用于 chroot Tar/Untar (CVE-2018-15664) moby/moby#39292
  • 修复了与 /dev 绑定挂载相关的 docker --init 问题。 moby/moby#37665
  • 当设备号大于 255 且使用 --device-read-bps 选项时,现在可以正确获取到正确的设备号。 moby/moby#39212
  • 修复了当路径确实存在时的 Path does not exist 错误。 moby/moby#39251

网络

Swarm

日志记录

已弃用

  • 弃用镜像清单 v2 schema1,转而支持 v2 schema2。Docker 的未来版本将完全移除对 v2 schema1 的支持。 moby/moby#39365
  • 已移除 v1.10 迁移工具。 moby/moby#38265
  • 现在跳过自动选择中已弃用的存储驱动。 moby/moby#38019
  • 已弃用 aufs 存储驱动程序并添加了警告。 moby/moby#38090
  • 已移除对 17.09 的支持。

有关已弃用标志和API的更多信息,请参阅 弃用信息以获取计划移除日期。

已知问题

  • 在某些大规模集群的情况下,Docker 信息可能会在 Swarm 部分中显示错误 code = ResourceExhausted desc = grpc: received message larger than max (5351376 vs. 4194304)。这并不表示用户端存在任何故障或配置错误,也无需采取任何操作。

  • 当重新部署所有服务为新实例时,可能会发生编排器端口冲突。由于在短时间内有大量 Swarm 管理器的请求,部分服务无法接收流量,导致部署后出现 404 错误。

    • 变通方案:通过 docker service update --force 重启所有任务。
  • 由于 FORWARD 链中缺少 Iptables 规则,流量无法从 HOST 流出 缺少的规则为:

    /sbin/iptables --wait -C FORWARD -o docker_gwbridge -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    /sbin/iptables --wait -C FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    • 临时解决方案:使用脚本和 cron 定义重新添加这些规则。该脚本必须包含用于检查规则是否存在“-C”命令以及用于重新添加规则的“-A”命令。以固定间隔在 cron 中运行此脚本,例如每 分钟
    • 受影响的版本:18.09.1, 19.03.0
  • CVE-2018-15664 带有目录遍历的符号链接交换攻击。在即将发布的补丁版本提供正式修复前的临时解决方案:在执行文件操作之前,先对 docker pause 容器进行处理。
    moby/moby#39252

  • docker cp 由于 CVE 修复导致的性能回退。当将 docker cp 的源设置为 / 时会产生错误。