Ollama 是一个开源的大语言模型(LLM)运行环境和工具集,旨在帮助开发者轻松部署、管理和使用模型(如 DeepSeek 等)。
Ollama 存在未授权访问漏洞,攻击者可以直接访问敏感接口进行读取、下载或删除私有模型文件,或滥用模型推理资源等高危操作。
攻击者只需访问服务端口(默认 11434)即可调用敏感功能接口,进而读取、下载或删除私有模型文件,或滥用模型推理资源等。
直接请求api路径即可,这里查看都有哪些模型
curl http://127.0.0.1:11434/api/tags
这个接口列出 Ollama 提供的 LLM 模型。
该接口对应的处理函数是ListHandler
,可以看到,未进行任何权限,直接返回模型。
func (s \*Server) ListHandler(c \*gin.Context) {
ms, err :\\= Manifests(true)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
models :\\= \[\]api.ListModelResponse{}
for n, m :\\= range ms {
var cf ConfigV2
if m.Config.Digest != "" {
f, err :\\= m.Config.Open()
if err != nil {
slog.Warn("bad manifest filepath", "name", n, "error", err)
continue
}
defer f.Close()
if err :\\= json.NewDecoder(f).Decode(&cf); err != nil {
slog.Warn("bad manifest config", "name", n, "error", err)
continue
}
}
// tag should never be masked
models \\= append(models, api.ListModelResponse{
Model: n.DisplayShortest(),
Name: n.DisplayShortest(),
Size: m.Size(),
Digest: m.digest,
ModifiedAt: m.fi.ModTime(),
Details: api.ModelDetails{
Format: cf.ModelFormat,
Family: cf.ModelFamily,
Families: cf.ModelFamilies,
ParameterSize: cf.ModelType,
QuantizationLevel: cf.FileType,
},
})
}
slices.SortStableFunc(models, func(i, j api.ListModelResponse) int {
// most recently modified first
return cmp.Compare(j.ModifiedAt.Unix(), i.ModifiedAt.Unix())
})
c.JSON(http.StatusOK, api.ListResponse{Models: models})
}
大模型拉取函数,没有进行任何权限验证。
也可以删除指定模型。
修复建议
方法一
最好的修复方法肯定是修改代码逻辑,给 Ollama API 添加认证的需求。当然这需要原作者的配合。
方法二
对web服务器配置进行修改,这里拿nginx进行举例:
对访问接口的请求,添加一个简单的密码验证。
server {
listen 11434;
location / {
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://192.168.1.100:11434;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
No Responses (yet)
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.