标签 Go text/template 下的文章
- 作者: 纯情
- 时间:
- 分类: 资讯
- 评论
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
●报告
免责声明: 本报告仅用于安全研究和教育目的。请勿将此信息用于未经授权的测试。