你的 Ollama 可能正被别人用:CVE-2024-37032 完整攻击链与 3 条自查命令

1 阅读5分钟

浏览器打开 IP:11434/api/tags 就能看到模型列表,说明 Ollama 对公网裸奔。它默认无认证,而 CVE-2024-37032 让这件事从白嫖模型升级成接管机器。

只要在浏览器里打开 http://你的IP:11434/api/tags,就能直接看到这台机器上有哪些模型——这就是典型的 Ollama 未授权访问。它默认没有认证,而 CVE-2024-37032 让这件事从「模型被白嫖」升级成「整台机器被接管」。

这篇给出原理、3 条自查命令和加固清单,不提供利用代码。

怀疑 11434 暴露
        │
        ▼
curl <目标IP>:11434/api/tags
        │
   ┌────┴─────┐
返回模型列表   超时 / 401
   │             │
 已暴露         安全
   │
ollama --version + ss -ltnp | grep 11434
   │
   ├─ 低于 0.1.34 → 升级
   └─ 监听 0.0.0.0 → 改 127.0.0.1
                    ↓
             反代认证 + 防火墙兜底

两条默认值决定了风险

部署方式默认监听风险
Linux 直接安装127.0.0.1:11434低,本机可访问
Docker 容器0.0.0.0:11434,容器内 root高,公网可直接打

Wiz 研究团队扫描公网时发现超过 1000 个暴露的 Ollama 实例,其中包含私有模型。这不是理论风险。

受影响版本:低于 0.1.34。

这个洞是怎么形成的

Ollama 有一个 /api/pull 接口,用来从模型仓库拉取模型。默认从官方仓库拉,但也允许指定私有仓库。

问题出在拉取时对清单文件(manifest)的校验上。

清单里每一层都有一个 digest 字段,本应是 64 位十六进制的 SHA256 值。Ollama 用这个值拼出文件在磁盘上的存放路径:

/root/.ollama/models/blobs/sha256-<digest>

漏洞版本没有校验 digest 的格式。攻击者在自己控制的仓库里放一份清单,把 digest 写成 ../../../../../../etc/ld.so.preload 这样的路径,服务端拼路径时就会跳出模型目录,写到系统任意位置。

ld.so.preload 是动态链接器的预加载配置:里面列出的共享库,会在每个新进程启动时被加载。所以完整链条是:

  1. 通过路径穿越,把一个恶意 .so 文件写到磁盘
  2. 再通过同一手法改写 /etc/ld.so.preload,指向这个 .so
  3. 调用 /api/chat,服务端派生新进程,恶意库被加载

**最终效果是远程代码执行。**Docker 部署下服务以 root 运行,所以直接是 root 权限。

Wiz 在 2024 年 5 月 5 日报告,Ollama 当天提交修复,5 月 8 日发布 0.1.34,6 月 24 日公开细节。

3 条命令查自己有没有中招

第一条:看版本

ollama --version

预期输出类似 ollama version is 0.1.34。

判读:低于 0.1.34 就要升级。看不到版本号说明命令不在 PATH 里,或者这是个纯客户端。

Docker 部署用这条:

docker exec <容器名> ollama --version

第二条:看监听地址

ss -ltnp | grep 11434

预期输出:

LISTEN 0  4096  0.0.0.0:11434  0.0.0.0:*  users:(("ollama",pid=1234,fd=3))

判读看第二列:

  • 127.0.0.1:11434 → 只监听本机,外网打不进来
  • 0.0.0.0:11434 或 *:11434 → 对所有网卡开放,需要立刻处理

第三条:从外网验证是否真的暴露

在另一台机器上执行:

curl -s --max-time 5 http://<目标IP>:11434/api/tags

预期结果:

  • 超时或连接被拒 → 没有暴露
  • 返回一段 JSON,里面有 models 列表 → 已暴露,任何人看到的内容和你一样

这条最值得做,因为配置文件写的和实际生效的经常不一致。

加固:四层,从便宜到彻底

第一层:能升级就升级

curl -fsSL https://ollama.com/install.sh | sh

预期:脚本跑完,ollama --version 显示新版本。

0.1.34 修的是路径穿越本身。但如果版本已经比较新,仍要继续看下面几层——认证缺失不是漏洞,是设计,官方文档明确说要靠反向代理补。

第二层:只监听本机

systemd 部署,改服务配置:

systemctl edit ollama

在打开的编辑器里写:

[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"

保存后:

systemctl daemon-reload
systemctl restart ollama

预期:重启后 ss -ltnp | grep 11434 显示 127.0.0.1。

注意:这一改,局域网里其他机器也访问不到了。本来就是要给局域网用的话,改成内网网卡地址,不要用 0.0.0.0。

第三层:前面挂一层带认证的反向代理

Nginx 加 Basic Auth 或接入现有 SSO。核心是:外部请求必须带凭据才能到 11434。

第四层:防火墙兜底

ss -ltnp | grep 11434

只放开确实需要访问的来源 IP。云服务器同时检查安全组——很多人 Nginx 配好了,安全组还开着 0.0.0.0/0。

怎么确认加固生效

按顺序验收,三条都过才算完:

  1. ss -ltnp | grep 11434 不再出现 0.0.0.0
  2. 从外网 curl http://<IP>:11434/api/tags 超时或 401
  3. 本机 curl http://127.0.0.1:11434/api/tags 正常返回模型列表

第 3 条不能少。只做到「外网打不开」但自己也不能用,那是配错了。

为什么这类问题反复出现

推理服务这一类工具,设计目标都是「让开发者三分钟跑起来」,所以默认值是方便优先:不开认证、绑所有网卡、容器里给 root。

问题在于,很多人把它当生产服务部署,默认值却还留在开发模式。

同类问题不只在 Ollama 出现过。Wiz 此前在 Hugging Face、Replicate 上发现过类似风险,TorchServe 和 Ray 也出过可远程利用的洞。共同点不是某个 CVE,是这些工具默认不设防。

所以自查的重点不该只盯版本号,还要看:这东西到底该不该暴露在公网上。

先看版本,再看监听地址

ollama --version 低于 0.1.34 的,先升级;ss -ltnp 里是 0.0.0.0 的,先改监听。两条都做完,再谈模型效果。

漏洞细节与时间线引自 Wiz Research 公开披露(CVE-2024-37032,代号 Probllama)。本文只讲原理、自查与加固,不含利用代码。