漏洞CVE-2024-0132和CVE-2024-0133公告

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模块

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

  3. Helm详情页面,查看组件版本。

    • 如果您的集群同时存在ack-ai-installerack-cgpu,请提交工单处理。

    • 如果您的集群安装了ack-ai-installer组件,且版本为1.7.5以下,请升级ack-ai-installer组件。相关操作,请参见升级共享GPU调度组件

    • 如果您的集群安装了ack-cgpu组件,且版本为1.5.1以下,请单击组件右侧更新,按照页面指引完成组件的升级。

  4. 相关组件升级完成后,针对集群中存量cGPU节点,请参见升级节点cGPU版本

修复方案

  • 新建GPU节点:针对2024年10月27日及之后新建的GPU节点,ACK已在1.20及以上版本的集群中发布了NVIDIA Container Toolkit v1.16.2,可自动完成修复。

    若您的集群版本较低,建议您及时升级版本,请参见升级集群

  • 存量GPU节点:针对2024年10月27日之前创建的存量GPU节点,均需通过执行CVE修复脚本进行手动修复。您可以展开下方折叠面板查看手动修复方案。

    说明
    • 在修复过程中,请分批进行节点修复操作,避免同时修复所有节点,以确保系统稳定性。

    • 修复过程中会重启节点上正在运行的业务Pod。请在业务低谷期进行。

    展开查看手动修复方案

    步骤1:节点排水

    控制台

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

    3. 节点页面中勾选目标节点并单击最下方节点排水,在弹出框中单击确定

    kubectl

    1. 执行以下命令,设置指定的节点为不可调度状态。

      kubectl cordon <NODE_NAME>
    2. 执行以下命令,进行节点排水操作。

      kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true

    步骤2:节点上执行修复脚本

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

    3. 节点页面中勾选目标节点并单击最下方批量运维,在弹出框中选中执行 Shell 命令单击确定

    4. 在弹出系统运维管理(OOS)基本信息页签中,参见如下表格进行配置,然后单击下一步:设置参数

      配置项

      参数

      执行描述

      修复NVIDIA Container Toolkit CVE

      模板类别

      公共任务模板

      模板选择

      ACS-ECS-BulkyRunCommand

      执行模式

      失败暂停

    5. 设置参数页签中单击运行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
    6. 确定页签中核对创建信息,确认无误后单击创建

    7. 任务执行完成后,在系统运维管理控制台左侧导航栏,选择自动化任务 > 任务执行管理,找到对应任务的执行输出,单击查看

      • 如果脚本输出如下内容,表明当前节点环境不存在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:上线节点

    控制台

    1. 登录容器服务管理控制台,在左侧导航栏选择集群

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点

    3. 节点页面中勾选目标节点并单击最下方设置调度状态,在弹出框选中设置为可调度,然后单击确定

    kubectl

    执行以下命令,进行节点上线操作。

    kubectl uncordon <NODE_NAME>

    (可选)步骤4:验证GPU节点

    完成上述操作以后,建议参考如下文档中的示例YAML部署一个GPU应用,验证节点是否能够正常工作。