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版本,修复方案是增加了对文件名称前缀的检查,防止目录穿越攻击。
漏洞利用详解
攻击步骤
-
生成恶意共享对象文件:
- 创建包含恶意代码的C语言共享对象(
.so文件) - 该对象在构造函数中通过
system()函数执行任意命令
- 创建包含恶意代码的C语言共享对象(
-
构造恶意ZIP文件:
- 打包包含指向系统关键路径的文件:
/etc/ld.so.preload- 用于预加载共享对象/tmp/hook.so- 恶意共享对象本身
- 打包包含指向系统关键路径的文件:
-
上传并触发:
- 通过Ollama的blob API上传恶意ZIP文件
- 创建引用此blob的模型
- 通过请求embeddings触发有效载荷执行
恶意共享对象示例代码
#include <stdlib.h>
#include <stdio.h>
__attribute__((constructor)) void init() {
system("%s");
}
其中%s会被替换为攻击者指定的命令。
复现过程
环境准备
- 搭建Docker环境
- 运行存在漏洞的Ollama版本(0.1.46或更早)
利用脚本
可以使用公开的PoC脚本:
srcx404/CVE-2024-45436: exploit script for CVE-2024-45436
脚本执行流程:
- 根据输入命令构造C代码
- 编译生成动态链接库
- 生成包含恶意路径的ZIP文件
- 通过
api/upload/接口提交到Ollama - 通过
api/embeddings接口触发执行
注意:该漏洞的命令执行没有回显,建议使用反弹shell技术。
受影响系统
- Ollama版本0.1.46及更早版本
- 自托管和云部署的Ollama实例
- 仅影响Linux系统
漏洞检测
通过调用Ollama的API版本端点确定版本号:
GET /api/version
如果版本低于0.1.47,则系统可能存在此漏洞。
缓解措施
- 升级:将Ollama升级到版本0.1.47或更高
- 网络限制:如果无法立即升级,限制对Ollama API端点的网络访问
漏洞修复
Ollama在0.1.47版本中修复了此问题,修复方案包括:
- 在解压ZIP文件时正确验证文件路径
- 防止路径中包含
../或类似序列 - 确保文件被解压到预期目录内