K8S 生态周报| runc 修复多个漏洞,影响 Docker、containerd 和 Kubernetes

2022-12-07 14:35:17 浏览数 (1)

“「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息。欢迎订阅知乎专栏「k8s生态」[1]。 ”

大家好,我是张晋涛。

runc v1.1.4 发布

runc 是一个底层容器运行时,我在之前已经写过很多篇文章介绍它了,感兴趣的小伙伴可以翻翻历史文章。上周它发布了 v1.1.4 版本, 这是 v1.1 系列的第 4 个 patch 版本。当前该项目正在积极的进行 v1.2 版本的开发。

大多数人都不会直接操作 runc 来启动容器,但是 runc 却是 Docker, containerd 等主流容器工具的底层依赖。本次 runc 新版本中修复的问题, 同样的也都会出现在 Docker 和 containerd 环境中。

具体包含如下内容:

  • libct: fix mounting via wrong proc fd by kolyshkin · Pull Request #3510 · opencontainers/runc

这个 bug 确实存在挺长时间了,但由于触发的条件比较严格,所以一直未发现。究其原因是 mountFd 未被清理,并且它可能被用于后续的挂载操作所使用。

这里介绍下它的触发条件:

  • userns 和 mountns 都被使用;
  • cgroupns 未被使用;
  • 使用 cgroup v1 ;
  • /sys/fs/cgroup 的挂载在 bind mount 之后;

本身这些条件要同时都满足就概率比较小,加上现在 containerd,Docker,Kubernetes,runc 等都已经支持了 cgroup v2 ,并且在逐步完成往 cgroup v2 的迁移,所以被这个 bug 影响的可能性相对较小。

  • Fix error from runc run on noexec fs by kolyshkin · Pull Request #3522 · opencontainers/runc

这个 PR 修正了 runc run 命令在 noexec fs 上的权限问题。本质上来说它替换了 exec.LookPath 函数, 使用了如下函数进行替代。

代码语言:javascript复制
func Eaccess(path string) error {
 err := unix.Faccessat2(unix.AT_FDCWD, path, unix.X_OK, unix.AT_EACCESS)
 if err != unix.ENOSYS && err != unix.EPERM { //nolint:errorlint // unix errors are bare
  return err
 }

 // Faccessat2() not available; check if we are a set[ug]id binary.
 if os.Getuid() == os.Geteuid() && os.Getgid() == os.Getegid() {
  // For a non-set[ug]id binary, use access(2).
  return unix.Access(path, unix.X_OK)
 }

 // For a setuid/setgid binary, there is no fallback way
 // so assume we can execute the binary.
 return nil
}

这里值得注意的一点是 faccessat2 使用 AT_EACCESS 是从 Linux v5.8 才开始提供支持的,不过这里通过 Go 的封装进行解决了。

  • [1.1] Fix failed exec after systemctl daemon-reload (regression in 1.1.3) by kolyshkin · Pull Request #3554 · opencontainers/runc

此处修正了一处自 v1.1.3 起存在的一个 bug,可能导致在 systemctl daemon-reload 后,runc exec 失败的情况。

代码语言:javascript复制
exec failed: unable to start container process: open /dev/pts/0: operation not permitted: unknown

这是由于 runc v1.1.3 中不再添加 DeviceAllow=char-pts rwm 规则了,当执行 systemctl daemon-reload 后, 会导致重新应用 systemd 的规则,进而导致这条规则的缺失。

该问题不仅仅会影响 runc,包括 containerd 和 Docker 都受到了影响,以及一些使用它们作为容器运行时的 Kubernetes 集群也受到了影响。解决办法是升级到 runc 的 v1.1.4 或者 containerd v1.6.8 版本即可。

以上就是 runc 新版本中值得关注的变更。建议仔细检查,尽早进行修复

Linkerd 2.12 正式发布

Linkerd 是 Service Mesh 领域中很重要的组成部分,近期发布了 v2.12 版本,其中有两个很重要的特性:

  • 支持了 Gateway API (中的 HTTPRoute) ,具体信息可参考:https://buoyant.io/blog/linkerd-and-the-gateway-api
  • 支持更细粒度的单路由策略,详情可参考:https://linkerd.io/2.12/tasks/configuring-per-route-policy/

我觉得上面的文章写的挺好的,我想聊的事情,在那篇文章中基本都聊到了,就不再重复了。

额外一点,Gateway API 被越来越多的厂商支持,整体而言是个好事情,可以促进 Gateway API 逐步达到毕业标准。

上游进展

  • Fix rollout history bug by brianpursley · Pull Request #111093 · kubernetes/kubernetes

在执行 kubectl rollout history 的时候可以传递 --revision=3 拿到指定版本的信息。但是如果指定了 output format ,则 --revision 可能会失效。通过此 PR 便可解决此问题,但要到 v1.26 才会携带。

  • Expose a pending pods summary in scheudler's dummper output by Huang-Wei · Pull Request #111726 · kubernetes/kubernetes

调度程序可以 dump 出更多信息。

  • Revert "promote LocalStorageCapacityIsolationFSQuotaMonitoring to beta" by rphillips · Pull Request #112076 · kubernetes/kubernetes

由于 OpenShift 团队发现在使用它的时候存在一些问题, 将 LocalStorageCapacityIsolationFSQuotaMonitoring 重新回退到 Alpha 阶段。

以上就是本期的全部内容, 好了,我们下期再见!


参考资料

[1]k8s生态: https://zhuanlan.zhihu.com/container

0 人点赞