标签 Ollama 下的文章

这两年,大模型几乎成了开发者的“标配工具”:
写代码、查资料、做总结、当智能助手。

但你有没有认真想过一个问题:

我们真的必须把所有请求都发到云端 API 吗?

随着模型体积持续下降、硬件性能快速提升,以及 Ollama 这类工具逐渐成熟,
本地运行大模型,已经从早期的“极客尝鲜”,演进为一种可以在真实项目中落地的工程方案

这篇文章,我们就来完整走一遍:

如何使用 LangChain,基于最新 Runnable API,调用本地启动的 Ollama 模型,构建一个真正可用的本地大模型应用。

一、为什么选择 LangChain + Ollama?

先给结论:

Ollama 解决“模型怎么跑”,LangChain 解决“能力怎么用”。

这是目前本地大模型场景中,最自然、最稳定的一种组合方式


1️⃣ Ollama:本地大模型的“Docker”

你可以把 Ollama 理解为:
专门为大模型设计的一层运行时基础设施。

它解决的问题非常聚焦:

  • 统一模型的下载、管理与启动
  • 对外提供标准化 HTTP API(默认端口 11434
  • 支持 LLaMA、Qwen、Mistral、DeepSeek 等主流模型
  • Mac / Linux / Windows 全平台可用
  • 天然适合 Docker / 私有化部署

一句话总结:

Ollama 把“跑模型”这件事,做成了基础设施能力。

2️⃣ LangChain:AI 应用的“控制中心”

如果你只是想“问一句、回一句”,直接调 Ollama API 当然也没问题。
但一旦进入真实工程场景,需求会迅速复杂化:

  • Prompt 如何复用、版本化?
  • 对话上下文如何管理?
  • 如何组合多步推理?
  • 后续怎么接 RAG、Agent、工具调用?

这些正是 LangChain 擅长的事情:

  • Prompt 模板与结构化输入
  • Runnable / LCEL 编排能力
  • 对话历史(Memory)管理
  • Tool、RAG、Agent 的统一抽象
  • 可自然演进到 LangGraph

所以一个非常自然的分工是:

LangChain 负责“编排与逻辑”,Ollama 负责“模型与算力”。

二、准备工作:本地启动 Ollama 模型

1️⃣ 使用 Docker 部署 Ollama(推荐)

docker run \
-d \
--restart=always \
--name ollama \
--gpus=all \
-p 11434:11434 \
-v /home/data/ollama:/root/.ollama \
ollama/ollama

如果你对部署细节感兴趣,可以参考我之前的文章:

  • 《如何使用 Ollama 打造你的本地 AI 助手》
  • 《为本地部署的大模型添加 API Key 认证:Nginx 实现方案》

2️⃣ 拉取并运行模型

qwen3:8b 为例:

ollama pull qwen3:8b

简单测试:

ollama run qwen3:8b

如果可以正常对话,说明模型已经在本地成功运行。


三、LangChain 接入本地 Ollama(OpenAI 协议)

接下来进入核心部分:
如何用 LangChain 调用本地 Ollama?


1️⃣ 安装依赖

pip install langchain langchain-openai

这里我们使用 OpenAI 兼容协议,这是目前最稳定、生态最完整的一种方式。


2️⃣ 创建 Ollama LLM(ChatOpenAI)

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    name="ollama-ai",
    model="qwen3:8b",
    base_url="http://localhost:11434/v1",
    api_key="your api key",
    temperature=0.7,
    timeout=300,
)

几个关键点说明:

  • model 必须与 Ollama 中的模型名称一致
  • base_url 指向 Ollama,并注意使用 /v1 后缀
  • 这里使用的是 OpenAI 标准协议,不是 Ollama 私有 API

3️⃣ 最简单的一次调用

response = llm.invoke("用一句话解释什么是 LangChain")
print(response)

到这里,你已经完成了:

LangChain → 本地 Ollama → 本地大模型

这条完整调用链。


四、进阶用法:Prompt + Runnable(LCEL)

在真实项目中,几乎不会直接“裸调”模型。


1️⃣ PromptTemplate

from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate(
    input_variables=["question"],
    template="你是一个资深后端工程师,请用简洁、专业的语言回答:{question}",
)

2️⃣ 输出解析(StrOutputParser)

from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()

显式的输出解析,是 LangChain 新 API 的重要特征:

  • 输出类型清晰
  • 便于后续切换为 JSON / Pydantic
  • 更适合工程化

3️⃣ Runnable 组合(推荐写法)

chain = prompt | llm | parser

response = chain.invoke({
    "question": "为什么本地部署大模型越来越流行?"
})
print(response)

这就是 LangChain 当前主推的 LCEL(表达式)写法
比早期的 LLMChain 更透明、也更可组合。


五、加入 Memory:真正的本地对话能力

⚠️ 一个非常重要的变化

在新的 Runnable 体系中,
Memory 不再是 Chain 的“隐藏参数”,而是显式的状态管理。


1️⃣ 定义对话历史存储

from langchain_core.chat_history import InMemoryChatMessageHistory

store = {}

def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = InMemoryChatMessageHistory()
    return store[session_id]

2️⃣ Prompt 显式消费 history(关键)

from langchain_core.prompts import PromptTemplate

prompt = PromptTemplate(
    input_variables=["history", "question"],
    template="""
         你是一个资深后端工程师。

         以下是之前的对话历史:
         {history}

         当前用户问题:
         {question}

         请基于上下文给出连贯、准确的回答。
    """.strip()
)
这是很多人第一次使用 RunnableWithMessageHistory 时最容易忽略的一点:
历史是否生效,取决于 Prompt 是否显式使用 {history}

3️⃣ 构建带记忆的 Runnable

from langchain_core.runnables.history import RunnableWithMessageHistory

chain = prompt | llm | parser

chat_chain = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="question",
    history_messages_key="history",
)

4️⃣ 调用(带 session_id)

config = {"configurable": {"session_id": "local-chat"}}

print(chat_chain.invoke(
    {"question": "什么是 Ollama?"},
    config=config
))

print(chat_chain.invoke(
    {"question": "它和 LangChain 有什么关系?"},
    config=config
))

到这里,你已经拥有了一个:

  • 支持上下文
  • 完全本地
  • 状态可控

的对话系统。

而且 所有数据都只存在你的本地机器上


六、这套方案适合谁?

非常适合:

  • ✅ 本地工具 / 桌面应用
  • ✅ 内部知识库 / 私有 RAG
  • ✅ 研发辅助工具(代码、文档、SQL)
  • ✅ 对数据安全敏感的企业场景
  • ✅ 学习大模型工程化的开发者

不太适合:

  • ❌ 超大并发场景
  • ❌ 极限性能 / 超大模型
  • ❌ 面向公网的 C 端产品

七、一些来自实践的工程建议

最后分享几点真实踩坑后的经验:

  1. 模型别贪大

    • 7B / 8B 是当前本地部署的性价比甜点位
  2. Prompt 比模型更重要

    • 本地模型对 Prompt 非常敏感
  3. LangChain 要“模块化使用”

    • Prompt / LLM / Parser / Memory 明确分层
  4. Memory 要可演进

    • InMemory → Redis → 数据库 → Checkpointer
  5. Ollama 非常适合私有化场景

    • Docker + 内网 + 权限控制,工程成本极低

结语

过去一年,我们讨论最多的问题是:

“该用哪个云端大模型?”

而现在,越来越多开发者开始认真思考:

“哪些能力,其实可以放回本地?”

LangChain + Ollama 并不是为了“替代云”,
而是为我们提供了一个:

真正可控、可组合、可落地的本地大模型方案。

如果你正在做:

  • 本地 AI 工具
  • 私有化大模型
  • Agent / RAG 工程实践

那么这套组合,非常值得一试。


如果你觉得这篇文章对你有帮助,欢迎 点赞 / 转发 / 收藏
下一篇,我会继续分享 LangGraph 在本地大模型场景下的实战用法

Clawdbot 详解

Clawdbot 是什么?

Clawdbot 是一个开源的个人 AI 助手,你可以运行在自己的设备上。它通过你已有的通讯渠道与你交流:

  • WhatsApp, Telegram, Slack, Discord
  • Google Chat, Signal, iMessage, Microsoft Teams
  • 语音交互( macOS/iOS/Android )
  • WebChat 界面


核心特点

特性 说明
本地优先 数据完全由你控制,不需要依赖云服务
多平台支持 macOS, Linux, Windows (WSL2), Raspberry Pi
多 Agent 系统 可以运行多个隔离的 AI 代理
浏览器控制 自动控制 Chrome/Chromium 浏览器
Canvas AI 驱动的可视化工作区
语音唤醒 持续语音对话功能
技能扩展 可安装/自定义技能插件


为什么这么火?

原因 说明
隐私优先 本地运行,数据不泄露
功能强大 集成浏览器控制、文件操作、多平台通讯
完全开源 MIT 许可证,社区活跃
部署灵活 从树莓派到云服务器都能跑
Claude 深度集成 优先推荐使用 Claude Opus 4.5
AI Agent 体验 让 AI 真正"干活",不只是聊天


部署需求

硬件需求(官方)

配置 最低要求 推荐配置
RAM 512MB - 1GB 2GB+
CPU 1 核 2 核+
磁盘 ~500MB 更多(日志/媒体)
网络 稳定互联网 24/7 在线

软件需求

组件 要求
Node.js ≥22
系统 macOS, Linux, Windows (WSL2)


4090 显卡够吗?

结论:4090 完全足够,甚至有点"杀鸡用牛刀"

为什么?

Clawdbot 本身不需要显卡运行 LLM。它是一个网关/控制层,实际的 AI 推理通过 API 调用完成(如 Anthropic API 、OpenAI API )。

4090 的使用场景

如果你想让 Clawdbot 使用本地 LLM 模型(不调用云端 API ),4090 可以用来运行:

  • Ollama 本地模型
  • vLLM 推理服务
  • 其他本地推理框架

部署选项

┌─────────────────────────────────────────────────────────┐
│                    你的 4090 机器                        │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐  │
│  │  Clawdbot   │────│  Ollama/    │────│  本地 LLM   │  │
│  │  (网关)     │    │  vLLM       │    │  (4090 推理) │  │
│  └─────────────┘    └─────────────┘    └─────────────┘  │
│         │                                           │    │
│         └───────────────────────┬───────────────────┘    │
│                                 ▼                        │
│                         或使用云端 API (Claude/OpenAI)    │
└─────────────────────────────────────────────────────────┘

推荐配置

方案 A:纯 API 模式(最简单)

  • Clawdbot 直接调用 Claude/OpenAI API
  • 不需要本地 GPU
  • 4090 可以用于其他任务

方案 B:混合模式(推荐)

  • 4090 运行本地模型( Ollama + Qwen/Llama 等)
  • Clawdbot 配置使用本地推理端点
  • 省钱 + 隐私

方案 C:轻量本地模型

  • 使用量化模型(如 Qwen-7B-Int4 )
  • 4090 可以同时跑多个实例


快速开始

# 安装 Clawdbot
npm install -g clawdbot@latest

# 运行向导
clawdbot onboard --install-daemon

# 启动网关
clawdbot gateway --port 18789


Sources

0x01 组件简介

近期由于Deepseek爆火,大部分企业和个人都开始部署AI。Ollama是一个本地私有化部署大语言模型(LLM,如DeepSeek等)的运行环境和平台,简化了大语言模型在本地的部署、运行和管理过程,具有简化部署、轻量级可扩展、API支持、跨平台等特点,在AI领域得到了较为广泛的应用。

fofa语法:app="Ollama"

0x02 漏洞描述

近日,Ollama存在安全漏洞,该漏洞源于默认未设置身份验证和访问控制功能,未经授权的攻击者可在远程条件下调用Ollama服务接口,执行包括但不限于敏感模型资产窃取、虚假信息投喂、模型计算资源滥用和拒绝服务、系统配置篡改和扩大利用等恶意操作。

0x03 影响版本

Ollama所有版本均受此漏洞影响。

0x04 漏洞验证

随机找一个靶机看看
出现Ollama is running,即证明存在未授权访问的漏洞

574X249/image.png

漏洞验证

通过查看Ollama api文档,Ollama提供了多个API 端点,用于执行不同的操作

详细情况查看:https://ollama.cadn.net.cn/api.html

/api/generate 用于生成文本或内容。通常用于基于给定的输入生成响应或输出,例如生成对话回复、文章等。
/api/chat 专门用于聊天交互。用户可以通过此端点与模型进行对话,模型会根据输入生成相应的回复。
/api/create 用于创建新的模型或资源。可能涉及初始化一个新的模型实例或配置。
/api/ps(或者tags) 用于管理或查看模型的标签。标签可以帮助用户对模型进行分类或标记,便于管理和查找。
/api/show 用于显示模型或资源的详细信息。用户可以获取模型的配置、状态或其他相关信息。
/api/copy  用于复制模型或资源。用户可以通过此端点创建一个现有模型的副本。
/api/delete 用于删除模型或资源。用户可以通过此端点移除不再需要的模型或数据。
/api/pull 用于从 Ollama 下载模型。用户可以通过此端点将模型从远程服务器拉取到本地环境中。
/api/push 用于将模型上传到 Ollama。用户可以通过此端点将本地模型推送到远程服务器。
/api/embeddings 用于生成文本的嵌入向量。嵌入向量是文本的数值表示,通常用于机器学习任务中的特征提取。
/api/version 用于获取 Ollama 的版本信息。用户可以通过此端点查询当前使用的 Ollama 版本。

漏洞利用

在未授权情况,可以通过访问/api/ps(使用GET请求即可) 获取目前搭建的所有模型信息。

1035X775/image.png

通过返回信息可以看到采用的是deepseek-r1模型,通过刚才我们知道的接口端点信息,我们可以调用/api/chat(使用POST请求)来完成聊天请求,消耗资源。

1825X819/image.png

通过引导deepseek回答问题的过程中也能造成一些信息的泄露

所以在未授权的情况下,其他的接口都是可以用的,危害极大,可以通过调用那些危险接口进行操作,可对模型进行创建或删除的操作

0x05 漏洞影响

通过以上过程,我们可以看到该漏洞危害极大,且该漏洞利用难度也极低,可以通过未授权对大模型进行操作

0x06 修复建议

  1. 限制公网访问:尽量避免直接将 Ollama 服务端口(默认 11434)暴露在公网。  

  2. 配置网络访问控制:通过云安全组、防火墙等手段限制对 Ollama 服务端口的访问来源。仅允许可信的源 IP 地址连接 11434 端口,阻止非授权 IP 的访问请求。 

0X07 参考链接

https://github.com/ollama/ollama/blob/main/docs/faq.md

0x08 免责声明

本文所涉及的任何技术、信息或工具,仅供学习和参考之用。

请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。

作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。

缘起
坦白说,最开始我是受 “沉浸式翻译” 的启发,想做一个不一样的翻译工具。

但在开发过程中,看到 Duolingo 频繁上热搜,我意识到翻译只是为了获取信息,大家真正的痛点是 “学会” 这门语言。语言学习从来不是一朝一夕的事,而是需要高频的接触。

于是,我重新思考了产品方向,借鉴了 ToucanRelingo 等优秀产品的思路,决定做一款能把 “学语言” 无缝融入到日常浏览和看视频中的工具 ——Lingoku 就这样诞生了。

主要功能

Lingoku 的核心逻辑是 “沉浸式学习”,不打断你的正常浏览,在看网页或者看视频时实时植入适当的词汇,帮助用户学习语言。

  • 视频与网页:支持 YouTube, Bilibili, Netflix 字幕,也兼容主流网页。
  • 多语言互学:中、英、日、韩互转,支持设置语言等级。
  • AI 深度释义:不只是给翻译,更给语境解析。
  • 模型自由配置
    • 省钱方案:推荐配置 Flash 版本模型(如 doubao-1.6-flash),速度快且便宜,实测效果足够好。
    • 隐私 / 极客方案:支持 本地 Ollama (Qwen 14b),效果很棒,推荐折腾党尝试。

项目暂未开源,但核心功能全免费。安装插件后不用登录,配置自己的 API Key 就能使用全部功能。 同时,对于不想自己折腾配置的用户,我们也提供了付费订阅选项,以便支持项目的长期发展。

Chrome 商店地址https://chromewebstore.google.com/detail/lingoku-immersive-ai-lang/pmiebjobnadehkmjgkbkapkcbkmjefkg

希望这个小工具能陪伴大家的语言学习之旅,帮到大家。如果有任何反馈或建议,都非常欢迎。


📌 转载信息
原作者:
Ecc
转载时间:
2026/1/20 11:07:38

0x01 组件简介

近期由于Deepseek爆火,大部分企业和个人都开始部署AI。Ollama是一个本地私有化部署大语言模型(LLM,如DeepSeek等)的运行环境和平台,简化了大语言模型在本地的部署、运行和管理过程,具有简化部署、轻量级可扩展、API支持、跨平台等特点,在AI领域得到了较为广泛的应用。

fofa语法:app="Ollama"

0x02 漏洞描述

近日,Ollama存在安全漏洞,该漏洞源于默认未设置身份验证和访问控制功能,未经授权的攻击者可在远程条件下调用Ollama服务接口,执行包括但不限于敏感模型资产窃取、虚假信息投喂、模型计算资源滥用和拒绝服务、系统配置篡改和扩大利用等恶意操作。

0x03 影响版本

Ollama所有版本均受此漏洞影响。

0x04 漏洞验证

随机找一个靶机看看
出现Ollama is running,即证明存在未授权访问的漏洞

574X249/image.png

漏洞验证

通过查看Ollama api文档,Ollama提供了多个API 端点,用于执行不同的操作

详细情况查看:https://ollama.cadn.net.cn/api.html

/api/generate 用于生成文本或内容。通常用于基于给定的输入生成响应或输出,例如生成对话回复、文章等。
/api/chat 专门用于聊天交互。用户可以通过此端点与模型进行对话,模型会根据输入生成相应的回复。
/api/create 用于创建新的模型或资源。可能涉及初始化一个新的模型实例或配置。
/api/ps(或者tags) 用于管理或查看模型的标签。标签可以帮助用户对模型进行分类或标记,便于管理和查找。
/api/show 用于显示模型或资源的详细信息。用户可以获取模型的配置、状态或其他相关信息。
/api/copy  用于复制模型或资源。用户可以通过此端点创建一个现有模型的副本。
/api/delete 用于删除模型或资源。用户可以通过此端点移除不再需要的模型或数据。
/api/pull 用于从 Ollama 下载模型。用户可以通过此端点将模型从远程服务器拉取到本地环境中。
/api/push 用于将模型上传到 Ollama。用户可以通过此端点将本地模型推送到远程服务器。
/api/embeddings 用于生成文本的嵌入向量。嵌入向量是文本的数值表示,通常用于机器学习任务中的特征提取。
/api/version 用于获取 Ollama 的版本信息。用户可以通过此端点查询当前使用的 Ollama 版本。

漏洞利用

在未授权情况,可以通过访问/api/ps(使用GET请求即可) 获取目前搭建的所有模型信息。

1035X775/image.png

通过返回信息可以看到采用的是deepseek-r1模型,通过刚才我们知道的接口端点信息,我们可以调用/api/chat(使用POST请求)来完成聊天请求,消耗资源。

1825X819/image.png

通过引导deepseek回答问题的过程中也能造成一些信息的泄露

所以在未授权的情况下,其他的接口都是可以用的,危害极大,可以通过调用那些危险接口进行操作,可对模型进行创建或删除的操作

0x05 漏洞影响

通过以上过程,我们可以看到该漏洞危害极大,且该漏洞利用难度也极低,可以通过未授权对大模型进行操作

0x06 修复建议

  1. 限制公网访问:尽量避免直接将 Ollama 服务端口(默认 11434)暴露在公网。  

  2. 配置网络访问控制:通过云安全组、防火墙等手段限制对 Ollama 服务端口的访问来源。仅允许可信的源 IP 地址连接 11434 端口,阻止非授权 IP 的访问请求。 

0X07 参考链接

https://github.com/ollama/ollama/blob/main/docs/faq.md

0x08 免责声明

本文所涉及的任何技术、信息或工具,仅供学习和参考之用。

请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。

作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。

0x01 组件简介

近期由于Deepseek爆火,大部分企业和个人都开始部署AI。Ollama是一个本地私有化部署大语言模型(LLM,如DeepSeek等)的运行环境和平台,简化了大语言模型在本地的部署、运行和管理过程,具有简化部署、轻量级可扩展、API支持、跨平台等特点,在AI领域得到了较为广泛的应用。

fofa语法:app="Ollama"

0x02 漏洞描述

近日,Ollama存在安全漏洞,该漏洞源于默认未设置身份验证和访问控制功能,未经授权的攻击者可在远程条件下调用Ollama服务接口,执行包括但不限于敏感模型资产窃取、虚假信息投喂、模型计算资源滥用和拒绝服务、系统配置篡改和扩大利用等恶意操作。

0x03 影响版本

Ollama所有版本均受此漏洞影响。

0x04 漏洞验证

随机找一个靶机看看
出现Ollama is running,即证明存在未授权访问的漏洞

574X249/image.png

漏洞验证

通过查看Ollama api文档,Ollama提供了多个API 端点,用于执行不同的操作

详细情况查看:https://ollama.cadn.net.cn/api.html

/api/generate 用于生成文本或内容。通常用于基于给定的输入生成响应或输出,例如生成对话回复、文章等。
/api/chat 专门用于聊天交互。用户可以通过此端点与模型进行对话,模型会根据输入生成相应的回复。
/api/create 用于创建新的模型或资源。可能涉及初始化一个新的模型实例或配置。
/api/ps(或者tags) 用于管理或查看模型的标签。标签可以帮助用户对模型进行分类或标记,便于管理和查找。
/api/show 用于显示模型或资源的详细信息。用户可以获取模型的配置、状态或其他相关信息。
/api/copy  用于复制模型或资源。用户可以通过此端点创建一个现有模型的副本。
/api/delete 用于删除模型或资源。用户可以通过此端点移除不再需要的模型或数据。
/api/pull 用于从 Ollama 下载模型。用户可以通过此端点将模型从远程服务器拉取到本地环境中。
/api/push 用于将模型上传到 Ollama。用户可以通过此端点将本地模型推送到远程服务器。
/api/embeddings 用于生成文本的嵌入向量。嵌入向量是文本的数值表示,通常用于机器学习任务中的特征提取。
/api/version 用于获取 Ollama 的版本信息。用户可以通过此端点查询当前使用的 Ollama 版本。

漏洞利用

在未授权情况,可以通过访问/api/ps(使用GET请求即可) 获取目前搭建的所有模型信息。

1035X775/image.png

通过返回信息可以看到采用的是deepseek-r1模型,通过刚才我们知道的接口端点信息,我们可以调用/api/chat(使用POST请求)来完成聊天请求,消耗资源。

1825X819/image.png

通过引导deepseek回答问题的过程中也能造成一些信息的泄露

所以在未授权的情况下,其他的接口都是可以用的,危害极大,可以通过调用那些危险接口进行操作,可对模型进行创建或删除的操作

0x05 漏洞影响

通过以上过程,我们可以看到该漏洞危害极大,且该漏洞利用难度也极低,可以通过未授权对大模型进行操作

0x06 修复建议

  1. 限制公网访问:尽量避免直接将 Ollama 服务端口(默认 11434)暴露在公网。  

  2. 配置网络访问控制:通过云安全组、防火墙等手段限制对 Ollama 服务端口的访问来源。仅允许可信的源 IP 地址连接 11434 端口,阻止非授权 IP 的访问请求。 

0X07 参考链接

https://github.com/ollama/ollama/blob/main/docs/faq.md

0x08 免责声明

本文所涉及的任何技术、信息或工具,仅供学习和参考之用。

请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。

作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。


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

报告

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

Claude Code Multi-Agent

【个人工作流开源】Claude-Code-Multi-Agent 涵盖 300+ 超智能开发调优专家,完整的 Hooks 调优系统1
【个人工作流开源】Claude-Code-Multi-Agent 涵盖 300+ 超智能开发调优专家,完整的 Hooks 调优系统2


让 Claude Code 拥有项目感知能力的智能开发框架

更多详细的介绍内容与文档,请详见:
Claude-Code-Multi-Agent/README.md at master · Prorise-cool/Claude-Code-Multi-Agent

如果有功能上的疑问,请在 github 上提交 PR,此项目已内置 MCP

因为是个人使用的工作流,开源出来如果有无法复现的情况请反馈给我及时优化,欢迎提交 PR,分享更多实用的 SKILLS 技能

这是什么?

Claude Code Multi-Agent 是一个为 Claude Code 设计的智能开发框架,通过 Hooks 系统 在会话生命周期中自动执行智能操作,让 Claude Code 从 “通用聊天助手” 升级为 “懂你项目的专业开发伙伴”。

核心定位

这不是一个插件生态,而是一个 Claude Code 的专属工作空间
你需要将仓库克隆后,将你的项目(或初始化项目)放在此文件夹中,即可享受智能 Hooks 定义以及 300+ Skills 方案。


解决了什么痛点?

痛点 1:Claude Code 缺乏项目感知能力

问题:Claude Code 默认不知道你的项目是什么类型、使用什么框架、有什么依赖。每次都需要你手动描述项目背景。

解决:通过 Ollama 智能引擎 自动检测项目类型(Python/Node.js/Java 等)、识别框架(Django/FastAPI/React 等),并在会话启动时自动注入项目上下文。

痛点 2:需要手动配置各种工具和提示词

问题:每次使用 Claude Code 都需要:

  • 手动告诉它项目结构
  • 手动配置 Git 工作流
  • 手动编写提示词模板
  • 手动管理文档更新

解决零配置启动 - 克隆即用,所有配置通过 Hooks 自动完成。提示词模板化存储在 prompts.json,支持团队协作和版本控制。

痛点 3:缺乏智能的意图分析和技能推荐

问题:Claude Code 不知道什么时候该调用什么工具,也不知道有哪些可用的专家技能。

解决智能意图分析 - 自动判断任务复杂度,推荐合适的 MCP 工具(Sequential Thinking、Task Manager 等)和 Skills(后端专家、测试专家等)。

痛点 4:文档维护繁琐且容易遗忘

问题:代码改了,文档忘了更新。项目知识散落在聊天记录中,无法沉淀。

解决自动文档维护 - 每次代码修改后,强制提示更新 DEVELOPMENT.mdKNOWLEDGE.mdCHANGELOG.md,确保文档与代码同步。


核心优势

所有判断逻辑通过本地部署 Ollama 完成,无需编写复杂的规则引擎。提示词模板化存储在 prompts.json,支持持续调优和版本控制。

300+ Skills 专家智能体

会话启动时自动扫描并加载所有 Skills,包括:

  • 后端专家 (/backend-specialist) - Django、FastAPI、Spring Boot 等
  • 前端专家 (/frontend-specialist) - React、Vue、Next.js 等
  • 测试专家 (/testing-specialist) - 单元测试、集成测试、E2E 测试
  • 安全专家 (/security-specialist) - OWASP Top 10、安全审计
  • 架构专家 (/architecture-specialist) - 系统设计、微服务架构
  • DevOps 专家 (/devops-specialist) - CI/CD、容器化、云部署
  • … 还有更多

自动文档维护系统

强制维护三个核心文档:

  • DEVELOPMENT.md - 开发工作文档(任务状态、进度跟踪)
  • KNOWLEDGE.md - 项目知识库(技术决策、代码模式)
  • CHANGELOG.md - 变更日志(版本记录、功能变更)

文档在会话启动时自动注入上下文,替代 Memory MCP,避免上下文爆炸。

Git 工作流智能集成

自动检测 Git 仓库配置,提示分支策略(github-flow /git-flow),确保团队协作规范。

零配置启动

基于 uv 的依赖管理,无需手动安装 Python 包。克隆项目 → 配置环境变量 → 启动 Claude Code,即可使用。


使用示例

示例 1:自动项目检测

场景:你打开了一个新的 Python 项目,想了解项目结构。

操作:直接打开 Claude Code,系统会自动:

  1. 检测项目类型(Python + FastAPI)
  2. 识别框架和依赖
  3. 加载相关 Skills(后端专家、测试专家等)
  4. 初始化项目文档

结果:Claude Code 立即了解你的项目,无需手动介绍。


示例 2:调用专家 Skills

场景:需要设计 RESTful API,但不确定最佳实践。

操作:在 Claude Code 中输入:

/backend-specialist 设计用户认证的 RESTful API

结果:Claude Code 以 “后端专家” 身份回答,参考 FastAPI/Django 最佳实践,提供:

  • RESTful 资源设计
  • HTTP 方法选择
  • 状态码定义
  • 请求 / 响应格式


示例 3:智能意图分析

场景:输入一个复杂任务:“实现用户登录功能”

操作:系统自动分析意图,推荐:

  • 推荐工具:Sequential Thinking(复杂任务分解)
  • 推荐 Skills/backend-specialist/security-specialist
  • 执行计划:自动生成任务拆解建议

结果:无需手动思考 “该用什么工具”,系统智能推荐。


示例 4:自动文档维护

场景:修改了 user_service.py,添加了新功能。

操作:系统自动检测代码变更,强制提示更新:

  • DEVELOPMENT.md - 记录开发进度
  • KNOWLEDGE.md - 记录技术决策
  • CHANGELOG.md - 记录变更历史

结果:文档始终与代码同步,项目知识可沉淀。


示例 5:Commands 工作流

Commands 是预定义的工作流,通过 /command-name 触发:

# 创建功能规格(从需求到实施计划)
/kiro/spec 用户认证功能

# 执行完整的代理工作流
/agent-workflow 实现博客系统

# Git 提交(自动生成 Commit Message)
/gh/commit

Command 示例:/kiro/spec

这个 Command 会引导你完成:

  1. 需求收集:生成 EARS 格式的需求文档
  2. 设计文档:创建架构设计和数据模型
  3. 任务列表:拆解为可执行的开发任务

所有文档自动保存到 .kiro/specs/{feature_name}/ 目录。

系统架构

Hooks 工作原理

本项目通过 Python Hooks 系统管理 Claude Code 的会话生命周期。每个 Hook 在特定事件触发时执行,通过 Ollama 进行智能决策。

核心设计理念:

  • 文档驱动:强制维护三个核心文档(DEVELOPMENT.md、KNOWLEDGE.md、CHANGELOG.md),会话启动时自动读取并注入上下文
  • 配置化提示词:所有提示词模板存储在 .claude/hooks/prompts.json,用户可自由调整和优化
  • 去 Memory 中间层:不再依赖 Memory MCP,直接通过文档维护项目知识,避免上下文爆炸导致的指令失效

Hook 触发时机

会话启动

SessionStart

用户输入

UserPromptSubmit

工具调用

PreToolUse

PostToolUse

Notification

PreCompact

Stop/SubagentStop

Hook 执行流程

每个 Hook 通过 exit_code 控制后续操作:

0

2

Hook 触发

执行脚本

exit_code

继续操作

阻止操作

返回 JSON

更新系统消息

返回值格式:

{ "exit_code": 0, "message": "操作成功", "data": { "skills": ["backend-specialist", "testing-specialist"], "project_type": "Python", "framework": "FastAPI" } } 
  • exit_code=0:允许操作继续
  • exit_code=2:阻止操作(如检测到危险命令)


Hook 类型说明

Hook触发时机核心功能Ollama 作用
SessionStart会话启动项目初始化检测项目类型、推荐 Skills
UserPromptSubmit用户提交输入意图分析判断任务复杂度、优化提示词
PreToolUse工具调用前权限检查评估操作风险
PostToolUse工具调用后文档更新生成文档更新建议
Stop会话结束清理资源-
SubagentStop子代理停止子任务处理-
PreCompact上下文压缩前信息保留识别重要上下文
Notification系统通知消息处理-

核心 Hook 详解:

1. SessionStart - 会话启动处理器

这是最重要的 Hook,负责项目初始化:

# .claude/hooks/handlers/session_start.py 的核心逻辑 # 1. 调用 Ollama 检测项目类型
project_info = ollama_client.detect_project_type()
# 返回:{"type": "Python", "framework": "FastAPI", "version": "3.11"} # 2. 扫描 skills/ 目录
skills = scan_skills_directory()
# 返回:["backend-specialist", "testing-specialist", ...] # 3. 初始化文档系统
document_manager.init_documents()
# 创建:DEVELOPMENT.md, KNOWLEDGE.md, CHANGELOG.md # 4. 【核心改进】强制读取三个文档并注入上下文
development_content = read_file("project_document/DEVELOPMENT.md")
knowledge_content = read_file("project_document/KNOWLEDGE.md")
changelog_content = read_file("project_document/CHANGELOG.md")
# 将这些内容注入到系统上下文中,替代 Memory MCP # 5. 检查 Git 配置
git_status = check_git_config()
# 检查:.gitignore, 分支策略 

2. UserPromptSubmit - 意图识别处理器

分析用户输入,提供智能建议:

# 用户输入:"帮我实现用户登录功能" # Ollama 分析结果:
{
    "intent": "feature_implementation",
    "complexity": "medium",
    "recommended_tools": ["Write", "Edit", "Bash"],
    "recommended_skills": ["backend-specialist", "security-specialist"],
    "suggested_plan": [
        "1. 设计数据库表结构",
        "2. 实现认证逻辑",
        "3. 编写单元测试",
        "4. 添加安全防护"
    ]
}

3. PostToolUse - 工具使用后处理器

在每次代码修改后,强制 更新三个文档:

# 检测到修改了 user_service.py # 【强制】必须更新以下文档: # 1. DEVELOPMENT.md - 记录开发进度和任务状态 # 2. KNOWLEDGE.md - 记录技术决策和代码模式 # 3. CHANGELOG.md - 记录变更历史 # 文档更新提示通过 prompts.json 配置,用户可自定义格式和要求 

提示词配置化:
所有提示词模板存储在 .claude/hooks/prompts.json,支持:

  • 自定义提示词内容和格式
  • 使用 {变量} 占位符动态替换
  • 按 Hook 类型分组管理
  • 便于持续调优和版本控制


Skills 触发机制

Skills 是本项目的 “专家团队”,每个 Skill 代表一个专业领域的智能体。

Skills 加载流程

Ollama 文件系统 Claude Code 用户 Ollama 文件系统 Claude Code 用户/backend-specialist 设计 API 读取 skills/backend-specialist/SKILL.md 返回 Skill 定义解析 YAML Frontmatter 结合 Skill 能力优化提示词返回优化后的系统提示注入系统上下文以专家身份执行任务

Skill 目录结构

.claude/skills/ ├── backend-specialist/  ├── SKILL.md                    # Skill 定义(必需)
 └── references/                 # 参考文档(可选)
 ├── cursor_rules_django.md
 ├── cursor_rules_fastapi.md
 └── restful_best_practices.md
├── testing-specialist/  ├── SKILL.md
 └── references/  ├── pytest_guide.md
 └── test_patterns.md
└── security-specialist/ ├── SKILL.md
    └── references/ ├── owasp_top10.md
        └── secure_coding.md


为什么需要 Ollama?

Ollama 是本项目的 “大脑”,负责:

  • 项目类型检测:自动识别你的项目是 Python/Node.js/Java 等
  • 意图分析:理解用户输入,判断是简单查询还是复杂任务
  • 提示词优化:将模糊需求转化为清晰的执行计划
  • 技能推荐:根据任务类型推荐合适的 Skills

没有 Ollama,系统会降级到基础模式(仅支持手动触发 Skills)。

为什么需要 uv?

uv 是 Rust 编写的超快 Python 包管理器,本项目用它来:

  • 自动管理 Python 环境:无需手动创建虚拟环境
  • 秒级安装依赖:比 pip 快 10-100 倍
  • 零配置运行 Hooksuv run 自动处理依赖隔离

为什么不用 pip? uv 会自动创建隔离环境,避免污染全局 Python 环境,且速度快 10 倍以上。


📌 转载信息
转载时间:
2026/1/14 10:44:42