CVE-2024-45436:Ollama ZIP文件解压导致的命令执行漏洞
字数 1211 2025-08-29 22:41:10

CVE-2024-45436: Ollama ZIP文件解压导致的命令执行漏洞分析及利用教学

漏洞概述

CVE-2024-45436是Ollama软件0.1.47版本之前存在的一个路径遍历漏洞(Zip Slip漏洞)。该漏洞允许攻击者通过特制的ZIP文件将恶意文件解压到系统任意位置,可能导致远程代码执行(RCE)。此漏洞仅影响Linux系统。

技术细节

漏洞位置

漏洞位于Ollama的model.go文件中的parseFromZipFile函数,该函数负责处理ZIP文件的解压操作。问题在于没有正确验证解压路径,当ZIP文件包含带有../序列的路径条目时,应用程序会将这些文件解压到目标目录之外。

漏洞成因分析

在ollama-0.1.46版本中,创建临时文件夹的代码如下:

tempdir, err := os.MkdirTemp(filepath.Dir(file.Name()))

由于ZIP文件格式中,文件名称写在文件头部分,攻击者可以构造恶意文件名(如../etc/xxx),使得解压后的文件位于特定目录下。

对比ollama-0.1.47版本,修复方案是增加了对文件名称前缀的检查,防止目录穿越攻击。

漏洞利用详解

攻击步骤

  1. 生成恶意共享对象文件

    • 创建包含恶意代码的C语言共享对象(.so文件)
    • 该对象在构造函数中通过system()函数执行任意命令
  2. 构造恶意ZIP文件

    • 打包包含指向系统关键路径的文件:
      • /etc/ld.so.preload - 用于预加载共享对象
      • /tmp/hook.so - 恶意共享对象本身
  3. 上传并触发

    • 通过Ollama的blob API上传恶意ZIP文件
    • 创建引用此blob的模型
    • 通过请求embeddings触发有效载荷执行

恶意共享对象示例代码

#include <stdlib.h>
#include <stdio.h>

__attribute__((constructor)) void init() {
    system("%s");
}

其中%s会被替换为攻击者指定的命令。

复现过程

环境准备

  1. 搭建Docker环境
  2. 运行存在漏洞的Ollama版本(0.1.46或更早)

利用脚本

可以使用公开的PoC脚本:

srcx404/CVE-2024-45436: exploit script for CVE-2024-45436

脚本执行流程:

  1. 根据输入命令构造C代码
  2. 编译生成动态链接库
  3. 生成包含恶意路径的ZIP文件
  4. 通过api/upload/接口提交到Ollama
  5. 通过api/embeddings接口触发执行

注意:该漏洞的命令执行没有回显,建议使用反弹shell技术。

受影响系统

  • Ollama版本0.1.46及更早版本
  • 自托管和云部署的Ollama实例
  • 仅影响Linux系统

漏洞检测

通过调用Ollama的API版本端点确定版本号:

GET /api/version

如果版本低于0.1.47,则系统可能存在此漏洞。

缓解措施

  1. 升级:将Ollama升级到版本0.1.47或更高
  2. 网络限制:如果无法立即升级,限制对Ollama API端点的网络访问

漏洞修复

Ollama在0.1.47版本中修复了此问题,修复方案包括:

  • 在解压ZIP文件时正确验证文件路径
  • 防止路径中包含../或类似序列
  • 确保文件被解压到预期目录内

参考链接

CVE-2024-45436: Ollama ZIP文件解压导致的命令执行漏洞分析及利用教学 漏洞概述 CVE-2024-45436是Ollama软件0.1.47版本之前存在的一个路径遍历漏洞(Zip Slip漏洞)。该漏洞允许攻击者通过特制的ZIP文件将恶意文件解压到系统任意位置,可能导致远程代码执行(RCE)。此漏洞仅影响Linux系统。 技术细节 漏洞位置 漏洞位于Ollama的 model.go 文件中的 parseFromZipFile 函数,该函数负责处理ZIP文件的解压操作。问题在于没有正确验证解压路径,当ZIP文件包含带有 ../ 序列的路径条目时,应用程序会将这些文件解压到目标目录之外。 漏洞成因分析 在ollama-0.1.46版本中,创建临时文件夹的代码如下: 由于ZIP文件格式中,文件名称写在文件头部分,攻击者可以构造恶意文件名(如 ../etc/xxx ),使得解压后的文件位于特定目录下。 对比ollama-0.1.47版本,修复方案是增加了对文件名称前缀的检查,防止目录穿越攻击。 漏洞利用详解 攻击步骤 生成恶意共享对象文件 : 创建包含恶意代码的C语言共享对象( .so 文件) 该对象在构造函数中通过 system() 函数执行任意命令 构造恶意ZIP文件 : 打包包含指向系统关键路径的文件: /etc/ld.so.preload - 用于预加载共享对象 /tmp/hook.so - 恶意共享对象本身 上传并触发 : 通过Ollama的blob API上传恶意ZIP文件 创建引用此blob的模型 通过请求embeddings触发有效载荷执行 恶意共享对象示例代码 其中 %s 会被替换为攻击者指定的命令。 复现过程 环境准备 搭建Docker环境 运行存在漏洞的Ollama版本(0.1.46或更早) 利用脚本 可以使用公开的PoC脚本: 脚本执行流程: 根据输入命令构造C代码 编译生成动态链接库 生成包含恶意路径的ZIP文件 通过 api/upload/ 接口提交到Ollama 通过 api/embeddings 接口触发执行 注意 :该漏洞的命令执行没有回显,建议使用反弹shell技术。 受影响系统 Ollama版本0.1.46及更早版本 自托管和云部署的Ollama实例 仅影响Linux系统 漏洞检测 通过调用Ollama的API版本端点确定版本号: 如果版本低于0.1.47,则系统可能存在此漏洞。 缓解措施 升级 :将Ollama升级到版本0.1.47或更高 网络限制 :如果无法立即升级,限制对Ollama API端点的网络访问 漏洞修复 Ollama在0.1.47版本中修复了此问题,修复方案包括: 在解压ZIP文件时正确验证文件路径 防止路径中包含 ../ 或类似序列 确保文件被解压到预期目录内 参考链接 GitHub版本对比 PoC脚本