CVE-2025-31133、CVE-2025-52565和CVE-2025-52881修复方案

runc社区披露了三个高危漏洞:CVE-2025-31133、CVE-2025-52565CVE-2025-52881。这些漏洞虽然利用方式不同,但最终均可通过绕过runc对/proc目录下文件的写入限制,实现完整的容器逃逸。

漏洞描述

  • CVE-2025-31133:该漏洞利用 runc 中 maskedPaths(路径掩码)实现机制的一个缺陷。攻击者可在特定条件下,将容器内的 /dev/null 替换为一个指向宿主机 /proc 目录下敏感文件的符号链接(symlink)。这可能导致关键系统文件被意外挂载为可写,从而被攻击者利用实现容器逃逸。此外,如果攻击者删除 /dev/null,runc 的错误处理逻辑可能导致敏感内核信息泄露。

  • CVE-2025-52565:该漏洞与 CVE-2025-31133 的原理相似。runc 在为容器设置 /dev/console 的 bind-mount 时未充分校验目标路径。攻击者可通过路径操控(Path Traversal)将宿主机上的任意文件挂载到容器的 /dev/console,从而实现对宿主机文件的任意写,导致容器逃逸。

  • CVE-2025-52881:runc 在设置 LSM(Linux Security Module,如 AppArmor、SELinux)安全标签时存在逻辑缺陷。这可能导致为容器配置的安全策略未能正确应用,削弱了容器的隔离能力,并可能与其他漏洞组合利用以提升攻击效果。

关于社区披露的更多信息,请参见runc社区安全公告

影响范围

下列runc版本均在漏洞影响范围内:

  • runc v1.2.7 及更早版本

  • runc v1.3.2 及更早版本

  • runc v1.4.0-rc.2 及更早版本

社区在下列版本中修复了该问题:

  • runc v1.2.8

  • runc v1.3.3

  • runc v1.4.0-rc.3

解决方案

ACK Edgecontainerd 1.6.39版本对此漏洞进行了修复,请尽快升级到该版本。

云端节点池

参见containerd运行时发布记录,尽快升级集群运行时至已修复版本。具体操作及注意事项,请参见升级节点池

边缘节点池

重要
  • 为确保系统稳定性,建议将节点分批次修复,避免一次性同时处理全部节点。

  • 本操作只针对运行时为Containerd的边缘节点池,如果边缘节点池的运行时为Docker,则需要新建运行时为Containerd的边缘节点池,并将节点迁移到新的节点池。

步骤一:修改节点池的运行时配置

修改边缘节点池配置后,新建节点都将使用更高版本的containerd运行时,避免相关漏洞。

  1. 打开修改节点池配置API。

  2. 填写如下参数,其他参数保持默认:

    1. ClusterId:集群ID。

    2. NodepoolId:需要修改配置的边缘节点池ID。

    3. runtime_version:容器运行时版本,设置为1.6.39。

  3. 发起API调用。

步骤二:手动升级现有节点的containerd版本

节点排水

在需要升级的目标边缘节点上执行节点排水,把该节点上的Pod迁移到其他可用节点:

  1. 将下方命令中的<NODE_NAME>替换为节点名称后,执行命令,将目标节点设置为不可调度状态:

    kubectl cordon <NODE_NAME>
  2. 进行节点排水:

    kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true
在目标节点执行修复
  1. 登录目标边缘节点,在节点上执行下列修复操作。

    1. 配置REGIONINTERCONNECT_MODE环境变量:

      export REGION="cn-hangzhou"  INTERCONNECT_MODE="basic";  # 将 “cn-hangzhou” 和 “basic” 替换为真实配置。

      参数

      说明

      REGION

      集群所在地域的Region ID。ACK Edge集群支持的地域及其Region ID,请参见开服地域

      INTERCONNECT_MODE

      节点的接入网络类型

      • basic:公网接入。

      • private:私网接入。

    2. 执行下方脚本修复漏洞。

      #!/bin/bash
      set -e -x
      			# parameter 
      if [[ $REGION == "" ]];then
          echo "Error: REGION is null"
          exit 1
      fi
      
      if [[ $INTERCONNECT_MODE == "" ]]; then
         echo "Error: INTERCONNECT_MODE is null"
         exit 1
      fi
      
      if containerd --version | grep -q "1.6.39"; then
         echo "No need to upgrade current containerd(1.6.39)"
         exit 0
      fi
      
      export OS_ARCH=amd64
      case $(uname -m) in
      "sw_64")
          export OS_ARCH=sw64
          ;;
      "x86_64")
          export OS_ARCH=amd64
          ;;
      "arm64")
          export OS_ARCH=arm64
          ;;
      "aarch64")
          export OS_ARCH=arm64
          ;;
      *)
          echo "unknown arch $(uname -a), default to amd64 "
          ;;
      esac
      
      INTERNAL=$( [ "$INTERCONNECT_MODE" = "private" ] && echo "-internal" || echo "" )
      SERVER="http://aliacs-k8s-${REGION}.oss-${REGION}${INTERNAL}.aliyuncs.com"
      
      grep -q "Ubuntu" /etc/os-release && export PKG_MGR="-deb"
      grep -q "Debian" /etc/os-release && export PKG_MGR="-deb"
      
      CONTAINERD_VERSION="1.6.39"
      CONTAINERD_PACKAGE_URL="$SERVER/public/pkg/containerd${PKG_MGR}/containerd${PKG_MGR}-${CONTAINERD_VERSION}-linux-${OS_ARCH}.tar.gz"
      wget $CONTAINERD_PACKAGE_URL -O /tmp/containerd.tar.gz
      mkdir -p /tmp/containerd
      tar xf /tmp/containerd.tar.gz -C /tmp/containerd
      
      
      if [[ $PKG_MGR == "-deb" ]]; then
          apt install -y /tmp/containerd/pkg/containerd-deb/$CONTAINERD_VERSION/deb/*.deb
      else
          yum localinstall -y /tmp/containerd/pkg/containerd/$CONTAINERD_VERSION/rpm/* 
      fi
      
      service containerd restart
      
      echo "succeeded to upgrade containerd"
    3. 如果输出如下内容,表明当前节点环境不存在CVE漏洞,机器上未执行任何变更,无需进行后续操作:

      No need to upgrade current containerd(1.6.39)

      输出如下内容,表示该节点环境存在漏洞且已被修复:

      succeeded to upgrade containerd
节点上线

将下方命令中的<NODE_NAME>替换为节点名称后,执行命令,将节点设置为可调度状态:

kubectl uncordon <NODE_NAME>

无法升级时的临时方案

如果暂时无法执行升级操作,可采用以下措施来降低风险:

  • 使用 rootless 容器:

    rootless 模式下,runc 将以非 root 的低权限身份运行,可有效阻止大多数针对宿主机 procfs 文件的恶意写入攻击。

  • 限制使用可信镜像:

  • 加固 LSM 策略:

    若正在使用 AppArmor 或 SELinux,请确保安全策略已覆盖关键系统路径,限制不必要的访问。但 CVE-2025-52881 仍可能绕过部分 LSM 保护,建议及时升级运行时版本。