fs/ggml: malicious GGUF v1 crashes decoder — zero-length string underflows Truncate (DoS)

用户在使用 Ollama 加载模型文件时触发问题,尤其是通过外部来源获取的 GGUF v1 格式模型文件。攻击者可以构造一个仅 24 字节的恶意 GGUF v1 文件,其中包含一个长度为零的字符串字段,导致解码器崩溃。

fs/ggml: malicious GGUF v1 crashes decoder — zero-length string underflows Truncate (DoS)

fs/ggml: malicious GGUF v1 crashes decoder — zero-length string underflows Truncate (DoS)

快速结论:当使用 Ollama 加载恶意构造的 GGUF v1 模型文件时,如果模型中包含长度为零的字符串字段,将导致 `panic: bytes.Buffer: truncation out of range` 崩溃。优先检查模型文件是否可信,并更新到包含修复的 Ollama 版本。

问题场景

用户在使用 Ollama 加载模型文件时触发问题,尤其是通过外部来源获取的 GGUF v1 格式模型文件。攻击者可以构造一个仅 24 字节的恶意 GGUF v1 文件,其中包含一个长度为零的字符串字段,导致解码器崩溃。

报错原文

panic: bytes.Buffer: truncation out of range

原因分析

在 `fs/ggml/gguf.go` 文件的 `readGGUFV1String` 函数中,当字符串长度 `length == 0` 时,`io.CopyN` 成功复制了 0 字节,但后续 `b.Truncate(b.Len() – 1)` 因为 `b.Len() == 0` 而变成 `b.Truncate(-1)`,触发 `panic`。这是 GGUF v1 格式中空字符串未受保护的假设导致的整数下溢问题。

环境排查

  • 确认运行 Ollama 的版本(通过 `ollama –version` 查看)。受影响版本≤当前 main 分支(964ea42, 2026-07-03 前)。
  • 确认模型文件是否为 GGUF v1 格式(v2 格式不受此问题影响)。
  • 如果模型文件来源于不可信来源,应停止加载并删除该文件。

解决步骤

  1. 更新 Ollama 到包含修复的版本(由 #17062 修复,预计在下一个 release 中发布)。
  2. 如果无法更新,可优先尝试手动检查模型文件是否包含空字符串字段(使用十六进制编辑器查看文件头部):
    – GGUF v1 文件头部偏移量处,如果某字段长度值为 0,立即停止使用该文件。
  3. 如果必须使用该模型,联系模型提供者获取修复后的版本,或自行修补源码后在本地编译(不推荐生产环境使用)。

验证方法

更新后,尝试加载之前导致崩溃的恶意 GGUF v1 模型文件。如果不再崩溃,而是返回明确的错误信息(如 “malformed v1 string”),说明修复生效。

参考来源

ollama/ollama #17033 — 原始 Issue 报告及讨论

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 12016

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注