跳转至

如何修复 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.14containerd 版本从 1.7.1 升级到 1.7.13runc 版本从 v1.1.7 升级到 v1.1.12 ,所以选择 release-2.22 的制品。

操作步骤

制作并导入 runc/containerd 相关离线包

  1. 定义环境变量: minio 地址及用户名密码

    MINIO_USER="rootuser"
    MINIO_PASS="rootpass123"
    MINIO_ADDR="http://172.30.**.***:9000"
    
  2. 定义环境变量:镜像 airgap-patch 地址

    AIRGAP_PATCH_IMG="ghcr.m.daocloud.io/kubean-io/airgap-patch:2.22-71b6fa1"
    
  3. 仅制作 x86 架构的组件包

    cat > "manifest.yml" <<EOF
    image_arch:
      - "amd64" ## "arm64"
    containerd_version:
      - "1.7.13"
    runc_version:
      - "v1.1.12"
    EOF
    
  4. 在线环境,制作离线包

    podman run -e ZONE=CN \
        -v "$(pwd)/data/":/data/ \
        -v "$(pwd)/manifest.yml":/manifest.yml \
        ${AIRGAP_PATCH_IMG}
    
  5. 导入二进制包及离线镜像

    # 导入二进制包
    
    cd ./data/amd64/files/
    MINIO_USER="${MINIO_USER}" MINIO_PASS="${MINIO_PASS}" ./import_files.sh "${MINIO_ADDR}"
    
  6. 将 localartifactset.cr.yaml 自定义资源部署到 kubean 所在的管理集群或者 Global 集群 当中,本例使用的是 Global 集群。

    kubectl apply -f data/localartifactset.cr.yaml
    

更新组件版本配置

  1. 获取集群的主机清单 configmap 的资源名称

    kubectl get clusters.kubean.io cluster-mini-1 -o=jsonpath="{.spec.varsConfRef}{'\n'}"
    {"name":"mini-1-vars-conf","namespace":"kubean-system"}
    
  2. 编辑名为 mini-1-vars-conf 的集群配置文件,添加需要更新的组件版本信息,这里将 containerd 更新到 1.7.13,及将 runc 更新到 v1.1.12

    kubectl -n kubean-system edit cm mini-1-vars-conf
    
    mini-1-vars-conf.yaml
    apiVersion: 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
        ...
    

下发组件升级任务

  1. 获取集群的名称

    # 比如 clusters.kubean.io 的资源名称为 cluster-mini-1
    # 则获取集群的名称
    CLUSTER_NAME=$(kubectl get clusters.kubean.io cluster-mini-1 -o=jsonpath="{.metadata.name}{'\n'}")
    
  2. 获取集群配置参数 configmap 的资源名称

    kubectl get clusters.kubean.io cluster-mini-1 -o=jsonpath="{.spec.hostsConfRef}{'\n'}"
    {"name":"mini-1-hosts-conf","namespace":"kubean-system"}
    
  3. 镜像 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}
    
  4. 创建对应的升级任务

    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
    
  5. 查看组件升级结果

    # runc 版本
    runc --version
    
    # containerd 版本
    containerd --version
    

评论