NVIDIA Container Toolkit 1.16.1及以下版本在使用默认配置时存在一个TOCTOU竞态条件攻击漏洞。该漏洞不会影响容器设备接口(CDI)的使用,但若被成功利用,可能导致容器逃逸,使攻击者能够在宿主机上执行任意命令或获取敏感信息。已知的攻击场景需要受害者使用恶意镜像,并在容器内通过NVIDIA Container Toolkit操作GPU资源。关于漏洞的详细信息,请参见NVIDIA Container Toolkit,建议您及时修复。
影响范围
集群中的GPU节点安装了NVIDIA Container Toolkit组件,且组件版本为1.16.1及以下。
防范措施
在漏洞未修复之前,建议避免在集群中运行不可信的容器镜像,以确保系统的安全性和稳定性。可参见以下两种方案。
解决方案
本解决方案仅适用于ACK集群Pro版、ACK集群基础版、ACK专有集群、ACK灵骏集群的托管节点池、ACK Edge集群的云端节点池。
前置条件
如果您的集群中安装了cGPU模块,请确保其版本为1.1.0及以上。如未安装cGPU模块,请跳过。确认集群是否安装cGPU模块及升级方式如下。
展开查看如何升级cGPU模块
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
在Helm详情页面,查看组件版本。
如果您的集群同时存在ack-ai-installer和ack-cgpu,请提交工单处理。
如果您的集群安装了ack-ai-installer组件,且版本为1.7.5以下,请升级ack-ai-installer组件。相关操作,请参见升级共享GPU调度组件。
如果您的集群安装了ack-cgpu组件,且版本为1.5.1以下,请单击组件右侧更新,按照页面指引完成组件的升级。
相关组件升级完成后,针对集群中存量cGPU节点,请参见升级节点cGPU版本。
修复方案
新建GPU节点:针对2024年10月27日及之后新建的GPU节点,ACK已在1.20及以上版本的集群中发布了NVIDIA Container Toolkit v1.16.2,可自动完成修复。
若您的集群版本较低,建议您及时升级版本,请参见升级集群。
存量GPU节点:针对2024年10月27日之前创建的存量GPU节点,均需通过执行CVE修复脚本进行手动修复。您可以展开下方折叠面板查看手动修复方案。
展开查看手动修复方案
步骤1:节点排水
控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
在节点页面中勾选目标节点并单击最下方节点排水,在弹出框中单击确定。
kubectl
执行以下命令,设置指定的节点为不可调度状态。
kubectl cordon <NODE_NAME>
执行以下命令,进行节点排水操作。
kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true
步骤2:节点上执行修复脚本
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
在节点页面中勾选目标节点并单击最下方批量运维,在弹出框中选中执行 Shell 命令后,单击确定。
在弹出系统运维管理(OOS)的基本信息页签中,参见如下表格进行配置,然后单击下一步:设置参数。
配置项 | 参数 |
执行描述 | 修复NVIDIA Container Toolkit CVE |
模板类别 | 公共任务模板 |
模板选择 | ACS-ECS-BulkyRunCommand |
执行模式 | 失败暂停 |
在设置参数页签中单击运行Shell脚本,并将如下CVE修复脚本放入命令内容中,单击下一步:确定。
#!/bin/bash
set -e
# 设置节点所在的Region。
export REGION=$(curl 100.100.100.200/latest/meta-data/region-id 2>/dev/null)
if [[ $REGION == "" ]];then
echo "Error: failed to get region"
exit 1
fi
cd /tmp
curl -o upgrade_nvidia-container-toolkit.tar.gz https://aliacs-k8s-${REGION}.oss-${REGION}-internal.aliyuncs.com/public/pkg/nvidia-container-runtime/upgrade_nvidia-container-toolkit.tar.gz
tar -xf upgrade_nvidia-container-toolkit.tar.gz
cd pkg/nvidia-container-runtime/upgrade/common
bash upgrade-nvidia-container-toolkit.sh
在确定页签中核对创建信息,确认无误后单击创建。
任务执行完成后,在系统运维管理控制台左侧导航栏,选择,找到对应任务的执行输出,单击查看。
如果脚本输出如下内容,表明当前节点环境不存在CVE漏洞,机器上未执行任何变更,可忽略。
2024-10-22/xxxx INFO No need to upgrade current nvidia-container-toolkit(1.16.2)
如果脚本输出如下内容,那么表示该节点环境存在NVIDIA Container Toolkit漏洞且已被修复。
2024-10-10/xxxxx INFO succeed to upgrade nvidia container toolkit
步骤3:上线节点
控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
在节点页面中勾选目标节点并单击最下方设置调度状态,在弹出框选中设置为可调度,然后单击确定。
kubectl
执行以下命令,进行节点上线操作。
kubectl uncordon <NODE_NAME>
(可选)步骤4:验证GPU节点
完成上述操作以后,建议参考如下文档中的示例YAML部署一个GPU应用,验证节点是否能够正常工作。