runc社区披露了三个高危漏洞:CVE-2025-31133、CVE-2025-52565和CVE-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版本均在漏洞影响范围内:
| 社区在下列版本中修复了该问题:
|
解决方案
ACK Edge在containerd 1.6.39版本对此漏洞进行了修复,请尽快升级到该版本。
云端节点池
参见containerd运行时发布记录,尽快升级集群运行时至已修复版本。具体操作及注意事项,请参见升级节点池。
边缘节点池
为确保系统稳定性,建议将节点分批次修复,避免一次性同时处理全部节点。
本操作只针对运行时为Containerd的边缘节点池,如果边缘节点池的运行时为Docker,则需要新建运行时为Containerd的边缘节点池,并将节点迁移到新的节点池。
步骤一:修改节点池的运行时配置
修改边缘节点池配置后,新建节点都将使用更高版本的containerd运行时,避免相关漏洞。
打开修改节点池配置的API。
填写如下参数,其他参数保持默认:
ClusterId:集群ID。
NodepoolId:需要修改配置的边缘节点池ID。
runtime_version:容器运行时版本,设置为1.6.39。
发起API调用。
步骤二:手动升级现有节点的containerd版本
节点排水
在需要升级的目标边缘节点上执行节点排水,把该节点上的Pod迁移到其他可用节点:
将下方命令中的
<NODE_NAME>替换为节点名称后,执行命令,将目标节点设置为不可调度状态:kubectl cordon <NODE_NAME>进行节点排水:
kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true
在目标节点执行修复
登录目标边缘节点,在节点上执行下列修复操作。
配置
REGION和INTERCONNECT_MODE环境变量:export REGION="cn-hangzhou" INTERCONNECT_MODE="basic"; # 将 “cn-hangzhou” 和 “basic” 替换为真实配置。参数
说明
REGION集群所在地域的Region ID。ACK Edge集群支持的地域及其Region ID,请参见开服地域。
INTERCONNECT_MODE节点的接入网络类型
basic:公网接入。private:私网接入。
执行下方脚本修复漏洞。
#!/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"如果输出如下内容,表明当前节点环境不存在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 文件的恶意写入攻击。
限制使用可信镜像:
通过启用安全策略管理中的ACKAllowedRepos策略,限制集群只允许使用来自可信镜像仓库的镜像。同时,基于最小化权限原则确保仅可信人员拥有导入镜像的权限。
通过使用Notation和Ratify进行OCI制品的加签和验签,确保容器镜像的供应链安全。
加固 LSM 策略:
若正在使用 AppArmor 或 SELinux,请确保安全策略已覆盖关键系统路径,限制不必要的访问。但 CVE-2025-52881 仍可能绕过部分 LSM 保护,建议及时升级运行时版本。