如何修复 CVE-2024-21626 漏洞¶
2024 年 2 月 1 日,runc 社区公开了一个 runc 容器逃逸的公告, 编号为 CVE-2024-21626 ,其根因是由于 runc 存在内部文件描述泄露漏洞,攻击者可以利用该漏洞,越权访问容器所在主机的整个文件系统。
DCE 5.0 安装器特此发布了 v0.15.2 版本,将 containerd 版本升级到了 1.7.13 ,runc 版本升级到 v1.1.12 。 也就是说,基于 v0.15.2 版本的 DCE 5.0 环境创建的集群不受该漏洞影响。
Note
安装器升级到 v0.15.2 版本后,支持的集群版本从 v1.26.0 ~ v1.29.0 更新为 v1.27.0 ~ v0.29.1。
解决方案¶
前提条件¶
确认集群范围,目前有以下两种方式:
- 如果是 v1.27.0 ~ v0.29.1,按照升级 DCE 5.0 组件进行升级,升级成功后参考下文操作步骤的 更新组件版本配置、下发组件升级任务即可。
-
前往 kubean 查看发布的制品, 并根据实际情况选择具体的制品版本。目前支持的制品版本及对应的集群版本范围如下:
制品包版本 支持集群范围 DCE 5.0 支持情况 备注 release-2.21 v1.23.0 ~ v1.25.6 安装器 v0.14.0+ 目前社区暂未支持该制品包的 runc 组件的升级 release-2.22 v1.24.0 ~ v1.26.9 安装器 v0.15.0+ 支持最新的 runc、containerd release-2.23 v1.25.0 ~ v1.27.7 预计安装器 v0.16.0+ 预计 4 月支持 所以目前仅有 release-2.22 制品包支持 containerd、runc 的升级 ,因此 v1.24.0 ~ v1.26 的集群版本直接参照下文的所有操作步骤即可。
本文演示离线部署 K8s 集群版本 v1.24.14
,containerd 版本从 1.7.1 升级到 1.7.13 ,
runc 版本从 v1.1.7 升级到 v1.1.12 ,所以选择 release-2.22
的制品。
操作步骤¶
制作并导入 runc/containerd 相关离线包¶
-
定义环境变量: minio 地址及用户名密码
-
定义环境变量:镜像 airgap-patch 地址
-
仅制作 x86 架构的组件包
-
在线环境,制作离线包
-
导入二进制包及离线镜像
-
将
localartifactset.cr.yaml
自定义资源部署到 kubean 所在的管理集群或者 Global 集群 当中,本例使用的是 Global 集群。
更新组件版本配置¶
-
获取集群的主机清单 configmap 的资源名称
-
编辑名为
mini-1-vars-conf
的集群配置文件,添加需要更新的组件版本信息,这里将 containerd 更新到1.7.13
,及将 runc 更新到v1.1.12
mini-1-vars-conf.yamlapiVersion: v1 kind: ConfigMap metadata: name: mini-1-vars-conf namespace: kubean-system data: group_vars.yml: |- unsafe_show_logs: true container_manager: containerd kube_version: v1.24.14 # kube 版本维持当前集群版本不变,如果没有需要添加 containerd_version: 1.7.13 # containerd 从原 1.7.1 更新到 1.7.13 runc_version: v1.1.12 # runc 从原 v1.1.7 更新到 v1.1.12 kube_network_plugin: calico kube_network_plugin_multus: false kube_proxy_mode: iptables etcd_deployment_type: kubeadm override_system_hostname: true ntp_enabled: true ...
下发组件升级任务¶
-
获取集群的名称
-
获取集群配置参数 configmap 的资源名称
-
镜像 spray-job 上传到离线镜像仓库
REGISTRY_ADDR="10.5.14.100" # 镜像 spray-job 这里可以采用加速器地址 SPRAY_IMG_ADDR="ghcr.io/kubean-io/spray-job:2.22-71b6fa1" # skopeo 参数 SKOPEO_PARAMS=" --insecure-policy -a --dest-tls-verify=false --retry-times=3 " skopeo copy ${SKOPEO_PARAMS} docker-archive:spray-job.tar docker://${REGISTRY_ADDR}/${SPRAY_IMG_ADDR}
-
创建对应的升级任务
SPRAY_IMG_ADDR="10.5.14.100/ghcr.io/kubean-io/spray-job" SPRAY_TAG="2.22-71b6fa1" CLUSTER_NAME="fu-113-42-old" cat << EOF | kubectl apply -f - --- apiVersion: kubean.io/v1alpha1 kind: ClusterOperation metadata: name: cluster-mini-1-upgrades spec: cluster: ${CLUSTER_NAME} image: ${SPRAY_IMG_ADDR}:${SPRAY_TAG} actionType: playbook action: upgrade-cluster.yml postHook: - actionType: playbook action: cluster-info.yml EOF
-
查看组件升级结果