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" if grep -q -E "Ubuntu|Debian" /etc/os-release; then export PKG_MGR="-deb" else export PKG_MGR="" fi 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 systemctl restart containerd 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 保護,建議及時升級運行時版本。