标签 服务器端安全 下的文章


Ollama Template Injection 漏洞分析

前言

看到 ollama 的一个漏洞很有意思,模版注入,之前都不知道 ollama 还有这个漏洞



最后看到还给了赏金,看到了漏洞报告也比较有意思,于是来分析分析

一、漏洞描述

Ollama 在 v0.9.5 及更早版本中,/api/generate/api/chat 端点存在服务端模板注入漏洞。当用户发送请求时,如果提供了 template 参数,系统直接将其传递给 template.Parse() 函数,使用 Go 的 text/template 引擎进行解析和执行,未进行任何安全验证。



二、环境搭建

我的环境

软件版本: Ollama v0.9.5 (漏洞版本)

Go 版本: go1.25.3 darwin/arm64

测试模型: qwen2.5:0.5b

因为需要 go 编译,ollama 是 go 编写的

部署步骤

验证



搭建成功



三、漏洞分析/代码分析

漏洞触发链路

老规矩,先看链路,先懂整体流程后,然后再去分析代码,就会方便很多了

代码分析

写在代码注释里面了,重点用🔴 标注了,这样更清晰

模板解析函数

文件位置: template/template.go:126-141

请求处理入口

文件位置: server/routes.go:229-238

可访问的数据结构

文件位置: template/template.go:165-177

这些决定了我们可以访问哪些内容,不过比较敏感的一般是对话历史,现在直接把完整的 key 丢给 LLM 是很正常的

模板执行函数

文件位置: template/template.go:225-310



四、漏洞复现

验证服务运行

请求





查看可用模型

请求





之前我拿这个测试过,所以文件会有点多

就使用千问模型

访问 Prompt 变量

我们可以先测试模型注入

请求







输入的 prompt 变量回显说明 {{.Prompt}} 被成功解析, SECRET_DATA_12345 被注入到模型响应。



系统提示词

请求





访问对话历史

请求



对话历史那里多,我如何获取关键信息,go 的模版能干的事情,我们一样干,比如要求返回的字符串

把字符串交给正则匹配解析,或者 key 神的 hae 插件

五、漏洞修复

还没有看到官方发布针对此漏洞的修复版本

其实感觉还是未授权的问题,导致任意用户都可以获取到别人的对话历史了

参考资料

OWASP Server-Side Template Injection

Go text/template 文档

Ollama GitHub Repository

CWE-94: Code Injection

Go Template Injection Security Research

报告

免责声明: 本报告仅用于安全研究和教育目的。请勿将此信息用于未经授权的测试。