一、我们需要什么才能搭建一个AI服务?

为了训练并构建一个可用的AI,我们可能需要使用向量数据库,这些数据库专门用于存储和处理向量数据,对于AI模型尤其重要,特别是在相似度搜索等任务中。常见的向量数据库有Redis、PostgreSQL等。我们还需要训练框架来训练AI模型,帮助开发者高效地创建和训练深度学习模型,例如PyTorch、TensorFlow等。最后,推理服务器可以让我们开箱即用一些预训练的模型,例如Ollama、LLaMA等。

上述内容都是我们构建一个AI不可或缺的一部分。

但是,GPU才是AI中最重要的基石,GPU是所有AI服务提供商的共同基础。这意味着,无论是哪个AI平台,GPU都是执行深度学习任务(如训练和推理)不可或缺的硬件。而现代大部分用于AI训练的GPU都出自英伟达,如果英伟达GPU出现了安全漏洞,那大部分AI服务的安全性也无法得到保障。

二、NVIDIA Container Toolkit概览

先介绍NVIDIA Container Toolkit,这是NVIDIA开发的库,使得Linux容器能够访问NVIDIA GPU,包含主要组件如下:

Docker: Docker 是一个流行的容器化平台,负责启动容器,并调用 nvidia-container-runtime 来确保容器能够访问 NVIDIA GPU。Docker 是容器管理的核心,但它需要通过特定的运行时库来使容器具备 GPU 访问权限。

nvidia-container-runtime: 这是一个核心工具,负责执行容器的启动过程,并确保容器能够访问 GPU。nvidia-container-runtime 与 Docker 交互,启动容器时使 GPU 资源能够被容器内部的应用使用。

runc: runc 是 Docker 和其他容器系统使用的低级容器运行时。它负责初始化容器,确保容器环境的配置正确,容器内的应用能够正常运行。runc 还负责容器的生命周期管理,确保容器与主机系统隔离。

startContainer hook: 这个步骤涉及修改容器的启动行为。startContainer hook 确保容器在启动时,能够正确配置以使用 NVIDIA GPU,它会验证环境变量和配置文件,确保容器可以正确访问 GPU。

nvidia-container-runtime-hook: 这是 NVIDIA Container Toolkit 中的一个重要组成部分,负责在容器初始化过程中修改容器配置。它确保为 GPU 访问准备好所有必要的设置,如将正确的库和驱动传递给容器,确保容器能够使用 NVIDIA GPU。

如上图简要展示了工具链的调用过程,简要说明:

第一步:Docker 启动容器时,调用 nvidia-container-runtime 来确保容器能够访问 GPU。

第二步:nvidia-container-runtime 调用 runc,初始化容器并确保其配置正确,能够运行应用。

第三步:startContainer hook 确保容器启动时进行必要的修改,确保容器能够访问 NVIDIA GPU。

第四步:最终,nvidia-container-runtime-hook 会细化容器的配置,完成 GPU 访问配置的设置。

三、攻击方式

为了使容器能够访问宿主机器的共享库,我们通过使用挂载的方式。从攻击者的角度来看,如果我们需要访问共享库之外的文件,我们自然会想到利用符号链接,使容器直接访问宿主机上容器根目录之外的文件系统路径,如下图所示。

但是这种攻击方式其实是不可行的,因为在挂载过程中,存在事实检查(Fact-checking)机制,如果容器或宿主机中有符号链接,系统会确保这些链接被正确处理,避免通过不正确或恶意的符号链接影响挂载操作。这种方式能够确保容器之间的隔离性,防止容器越界访问宿主系统或其他容器的数据。

检查机制的图示如下:

do_path_resolve()会在挂载操作前对路径进行检查和验证。此时,路径检查确保了指定的文件和目录符合预期。

但是这种检查机制存在TOCTOU(Time of Check to Time of Use)漏洞的利用可能性,如果我们能够在路径检查后、挂载操作执行前修改符号链接,导致容器挂载到恶意文件或外部路径,就能实现逃逸容器或访问宿主系统的敏感文件。

因此,我们可以构建恶意的Dockerfile如下:

(1)创建/usr/local/cuda/compat/以及/usr/lib/x86_64-linux-gnu路径

(2)在/usr/local/cuda/compat/(这个是CUDA的默认目录)路径下创建libnvidia-ml.so.6目录和libnvidia-ml.so.7文件。

(3)设计指向../../../usr/local/cuda/compat/的符号链接,路径为/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.6。以及设计指向根目录的符号链接/usr/local/cuda/compat/libnvidia-ml.so.6/libnvidia-ml.so.7,这时就能从容器成功逃逸,并能够访问到宿主机的根文件。

四、原理分析

接下来本文会拆解攻击原理,首先我们需要明确在挂载之前,我们在Compat目录下创建了什么。

  • 一个libnvidia-ml.so.6的文件夹,里面包含了一个指向根目录的符号链接libnvidia-ml.so.7

  • 一个名为libnvidia-ml.so.7的空文件

在挂载之前,也就是在做mount操作之前,NVIDIA的安全机制会通过glob匹配(通配符搜索)在/usr/local/cuda/compat路径下搜寻所有形如lib*.so.*的文件。具体到本POC中,就是libnvidia-ml.so.6目录和libnvidia-ml.so.7文件。

然后通过do_path_resolve()这个函数进行安全检查,分析这些lib*.so.*文件是否会指向一些不符合共享库的路径。在本POC中,他会检查libnvidia-ml.so.7文件和libnvidia-ml.so.6目录,这两个的路径都是正常的,因此do_path_resolve()检查会通过。

此前我们已经通过RUN ln -s ../../../usr/local/cuda/compat/ /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.6进行符号链接的设置。

这里需要重点再说明一下,挂载通过mount()函数实现,而mount(源路径src, 目标路径dst)会实现访问dst路径时,看到的是src的内容。而在挂载libnvidia-ml.so.6时,由于/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.6已经被设置为符号链接,所以mount(../../../usr/local/cuda/compat/libnvidia-ml.so.6,/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.6)完成挂载之后,会使得访问/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.6/libnvidia-ml.so.7的内容指向/usr/local/cuda/compat/libnvidia-ml.so.7

此前我们设置/usr/local/cuda/compat/libnvidia-ml.so.6/libnvidia-ml.so.7为指向到根目录的符号链接,通过第一次mount操作,即对libnvidia-ml.so.6文件夹的挂载操作完成后,/usr/local/cuda/compat/libnvidia-ml.so.7实际上以已经指向了根目录。这也是TOCTOU漏洞利用的核心点,通过利用安全检查之后,正式挂载之前的时间间歇,实现恶意链接的替换。

这时候再在对libnvidia-ml.so.7进行挂载的时候,通过mount(../../../usr/local/cuda/compat/libnvidia-ml.so.7,/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.7)就实现了容器的逃逸,通过访问/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.7能够直接访问根目录。

五、艾体宝Mend.io价值

从此次攻击来看,对AI 的攻击角度涉及容器技术、挂载机制、符号链接滥用,以及利用 AI 安全性漏洞实施容器逃逸。这个漏洞不仅暴露了容器环境中的安全隐患,而且对 AI 提供商和使用 AI 技术的企业带来了巨大的安全风险。因此, AI 安全 和 供应链管理,特别是通过工具如 Mend.io(艾体宝)提高代码和容器的安全性,变得尤为重要。在企业的AI服务搭建中,Mend.io 能帮助您:

  1. 容器安全扫描:

    1. 容器映像扫描:Mend.io 扫描容器映像中的潜在漏洞,识别 未修补的漏洞 或不安全的依赖。

    2. 容器配置管理:确保容器配置符合最佳安全实践,并防止潜在的恶意配置和不安全挂载。

  2. 开源软件漏洞管理:

    1. 自动化漏洞识别:Mend.io 利用数据库中的最新漏洞信息,自动识别项目中的 开源库是否存在安全问题。

    2. 实时更新与修复建议:通过提供关于 依赖项升级补丁更新 的建议,Mend.io 帮助开发团队快速修复容器中和 AI 项目中的已知漏洞。

  3. 供应链安全:

    1. 第三方依赖分析:AI 项目中常常依赖于第三方库(如深度学习框架、数据处理工具等)。Mend.io 能够评估这些第三方库的安全性,并确保它们符合合规性要求。

    2. 供应链透明性:通过提供 SBOM(软件物料清单),Mend.io 使组织能够清楚地了解其 AI 环境中的所有组件及其版本,帮助发现潜在的 供应链漏洞

Logo

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

更多推荐