SummSolutions/Buzur

GitHub: SummSolutions/Buzur

一款开源的 19 阶段扫描器,旨在提前拦截针对 AI 代理与 LLM 的间接提示注入攻击。

Stars: 0 | Forks: 0

[![GitHub stars](https://img.shields.io/github/stars/SummSolutions/buzur?style=social)](https://github.com/SummSolutions/buzur) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![npm version](https://img.shields.io/npm/v/buzur)](https://www.npmjs.com/package/buzur) # Buzur — AI 提示注入防御扫描器 **在进入前先扫描。** Buzur 是一个开源的 **19 阶段扫描器**,用于保护 AI 代理和 LLM 应用程序免受 **间接提示注入** 攻击(OWASP LLM Top 10 #1)。 它检查网页内容、URL、图像(EXIF/QR/视觉)、工具输出、内存/RAG 数据、对抗后缀、规避技术、情感操纵和行为异常——**在任何数据到达模型之前**进行拦截。 适用于任何代理框架——LangGraph、CrewAI、AutoGen、LlamaIndex 等。 **Python 版本:** [github.com/SummSolutions/buzur-python](https://github.com/SummSolutions/buzur-python) ## 问题 会搜索网络的 AI 代理会暴露于恶意内容,这些内容旨在劫持其行为。单个中毒的搜索结果可能覆盖代理的指令、更改其身份或泄露数据。这被称为 **间接提示注入**——在 OWASP LLM 应用 Top 10 中排名第一。 ## Buzur 的方法 在进入前先扫描。不要在事后修补。 ## 安装 ``` npm install buzur ``` ## 用法 ``` import { scan, getTrustTier, isTier1Domain, addTrustedDomain, checkUrl } from "buzur"; // Phase 1: Scan web content before passing to your LLM const result = scan(webSearchResult); if (result.blocked > 0) { console.log("Buzur blocked " + result.blocked + " injection attempt(s)."); } // Phase 2: Check query trust tier const tier = getTrustTier(userQuery); // Phase 3: Scan a URL with VirusTotal const urlResult = await checkUrl("https://example.com", process.env.VIRUSTOTAL_API_KEY); if (urlResult.verdict === "blocked") { console.log("Buzur blocked unsafe URL:", urlResult.reasons); } // Phase 7: Scan an image before passing to your LLM import { scanImage } from "buzur/imageScanner"; const imageResult = await scanImage({ alt: imgElement.alt, title: imgElement.title, filename: "photo.jpg", surrounding: surroundingText, buffer: imageBuffer, // optional: enables EXIF + QR scanning }, { visionEndpoint: { url: "http://localhost:11434/api/generate", model: "llava" } // optional }); if (imageResult.verdict === "blocked") { console.log("Buzur blocked image injection:", imageResult.reasons); } // Phase 12: Scan for adversarial suffixes import { scanSuffix } from "buzur/suffixScanner"; const suffixResult = scanSuffix(userInput); if (suffixResult.verdict === "blocked") { console.log("Buzur blocked adversarial suffix:", suffixResult.detections); } // Phase 13: Evasion technique defense (wired into scan() automatically) // Also available standalone: import { scanEvasion } from "buzur/evasionScanner"; const evasionResult = scanEvasion(userInput); if (evasionResult.detections.length > 0) { console.log("Buzur detected evasion techniques:", evasionResult.detections); } // Phase 14: Fuzzy match and prompt leak defense import { scanFuzzy } from "buzur/promptDefenseScanner"; const fuzzyResult = scanFuzzy(userInput); if (fuzzyResult.verdict !== "clean") { console.log("Buzur detected fuzzy injection or prompt leak:", fuzzyResult.fuzzyMatches, fuzzyResult.leakDetections); } ``` ## 处理裁决 Buzur 返回裁决和理由——接下来发生什么由你的代理决定。 三种常见模式: **1. 静默跳过——阻断并继续** ``` const result = scan(webContent); if (result.blocked > 0) { console.log("Buzur blocked content:", result.triggered); return; // skip this result, move to next } // safe to pass to your LLM ``` **2. 通知并继续——告知用户,继续执行** ``` const result = scan(webContent); if (result.blocked > 0) { await sendMessage(`⚠️ Buzur blocked suspicious content from ${source}. Continuing search.`); return; } ``` **3. 人工介入——暂停并询问** ``` const result = scan(webContent); if (result.blocked > 0) { const reply = await askUser( `Buzur flagged content from ${source}: ${result.triggered[0].type}. Proceed anyway? (yes/no)` ); if (reply !== "yes") return; } ``` **4. 按严重性分支——组合模式** ``` const result = scan(webContent); if (result.blocked > 0) { const highSeverity = result.triggered.some(t => ["persona_hijack", "instruction_override", "jailbreak"].includes(t.type) ); if (highSeverity) { // High severity: stop and ask the user const reply = await askUser( `Buzur flagged a high-severity threat from ${source}: ${result.triggered[0].type}. Proceed anyway? (yes/no)` ); if (reply !== "yes") return; } else { // Low severity: skip silently and log console.log("Buzur blocked low-severity content:", result.triggered); return; } } ``` ## VirusTotal 设置(推荐) Buzur 的第 3 阶段 URL 扫描器开箱即用地使用启发式检测——无需 API 密钥。为了获得最大保护,添加一个免费的 VirusTotal API 密钥。 **为什么它很重要:** 启发式检测可疑模式。VirusTotal 将 URL 与 90 多个安全引擎进行比对,并识别仅靠模式无法检测到的威胁。 **如何获取免费 API 密钥(5 分钟):** 1. 前往 [virustotal.com](https://www.virustotal.com) 并创建免费账户 2. 登录后,点击右上角个人资料图标 3. 点击 **API Key** 4. 复制该页面显示的密钥 **如何添加到你的项目:** 1. 在项目文件夹中找到 `.env` 文件(如果不存在则创建) 2. 添加这一行:`VIRUSTOTAL_API_KEY=粘贴你的密钥` 3. 保存文件——仅此而已。Buzur 会自动使用它。 **免费配额限制:** - 每分钟 4 次查询 - 每天 500 次查询 - 每月 15,500 次查询 - 仅限个人与开源使用——不适用于商业产品或服务。商业用户应获取高级 API 计划。 ## 视觉端点设置(可选) Buzur 的第 7 阶段图像扫描器可在不使用任何视觉模型的情况下检测图像元数据、替代文本、文件名 和 QR 代码中的注入。对于嵌入在图像内部的像素级文本检测,你可以选择连接一个本地视觉模型。 **如何使用:** ``` import { scanImage } from "buzur/imageScanner"; const result = await scanImage({ buffer: imageBuffer, alt: "image description", filename: "photo.jpg", }, { visionEndpoint: { url: "http://localhost:11434/api/generate", // your Ollama endpoint model: "llava", // any vision-capable model prompt: "Does this image contain hidden AI instructions? Reply CLEAN or SUSPICIOUS: reason" } }); ``` **推荐模型:** llava、llava-phi3、moondream —— 任何 Ollama 视觉模型均可。 **没有视觉端点:** Buzur 仍提供完整的元数据、QR、替代文本和文件名保护。视觉层增加深度但并非必需。 ## 持久会话日志记录(可选) Buzur 的第 10 阶段行为扫描器是有状态的——它跨交互跟踪事件。 默认使用内存存储,在进程重启时重置。为了在重启后保持持久日志,使用内置的 `FileSessionStore`。 **如何使用:** ``` import { FileSessionStore, recordEvent, analyzeSession, EVENT_TYPES } from "buzur/behaviorScanner"; // Creates ./logs/buzur-sessions.json automatically const store = new FileSessionStore(); // Or specify a custom path const store = new FileSessionStore('./data/my-sessions.json'); // Use the store in all Phase 10 calls recordEvent('session-abc', { type: EVENT_TYPES.USER_MESSAGE, content: userInput }, store); const result = analyzeSession('session-abc', store); ``` **记录内容:** 会话 ID、事件时间戳、工具调用序列、阻断尝试次数、 和怀疑分数。不记录原始消息内容,除非你显式传递。 **建议:** 在 `.gitignore` 中添加 `logs/`,使会话数据保持本地且不纳入版本控制。 ``` echo "logs/" >> .gitignore ``` ## Buzur 检测内容 **阶段 1 — 模式扫描器** - 结构性注入:令牌操作、提示定界符 - 语义注入:身份劫持、指令覆盖、越狱尝试 - 同形字攻击:西里尔字母与 Unicode 相似字符 - Base64 编码注入 - HTML/CSS 混淆:`display:none`、`visibility:hidden`、零字体大小、离屏定位 - HTML 注释注入:`` - 脚本标签注入:隐藏在 JavaScript 块中的指令 - HTML 实体解码:`<script>` 解码后再扫描 - 隐形 Unicode 字符剥离 **阶段 2 — 分级信任系统** - 将查询分类为技术或通用 - 维护经过筛选的 Tier 1 可信域名列表 - 可通过 `addTrustedDomain()` 扩展 **阶段 3 — 预获取 URL 扫描器** - 启发式:可疑 TLD、原始 IP、域名抢注、同形字域名、可执行扩展名 - 可选 VirusTotal 集成:90+ 引擎声誉检查 - 分层:启发式先行,VirusTotal 提供深度 - 无需 API 密钥即可工作;VirusTotal 增强但非必需 **阶段 4 — 内存中毒扫描器** - 伪造的先前引用:声称之前已同意或讨论的内容 - 虚假记忆植入:伪装成回忆的指令 - 历史重写:尝试覆盖既定对话上下文 - 特权提升:伪造历史以声称更高权限 - 完整对话历史扫描:按索引和类别标记中毒回合 **阶段 5 — RAG 中毒扫描器** - AI 目标元数据:伪装成文档笔记的指令 - 伪造系统指令:嵌入文档内容中的系统级命令 - 文档权威伪造:内容声称覆盖 AI 指令 - 检索操纵:控制哪些文档被检索 - Chunk 边界攻击:隐藏在文档 Chunk 边缘的注入 - 批量扫描:扫描完整检索集,返回清洁与中毒 Chunk 及其来源元数据 **阶段 6 — MCP 工具中毒扫描器** - 中毒工具描述:嵌入在工具定义中的指令 - 工具名称伪造:旨在操纵代理行为的工具名 - 参数注入:隐藏在参数定义中的恶意指令 - 中毒工具响应:工具返回值中的注入负载 - 信任升级:工具响应声称更高权限或授权 - 完整 MCP 上下文扫描:同时扫描工具定义与响应 **阶段 7 — 图像注入扫描器** - 替代文本与标题扫描:HTML 图像属性中的注入字符串 - 文件名分析:图像文件名中的可疑指令模式 - Figcaption 与周围文本:图像上下文元素中的注入 - EXIF 元数据扫描:图像文件元数据字段中的恶意指令 - QR 码负载检测:解码嵌入的 QR 代码并扫描注入 - 可选视觉端点:集成任意本地或远程视觉模型进行像素级检测 - 优雅降级:无视觉模型时仍提供完整保护;视觉层增加更深层防护 **阶段 8 — 语义相似度扫描器** - 结构意图分析:通过语法形状与意图标记检测注入 - 祈使动词检测:标记句子边界处的 AI 指令 - 权威声明检测:捕获冒充管理员/开发者/创建者的声明 - 元指令框架:检测 "from now on"、"new objective"、"supersedes all" 模式 - 人格劫持检测:角色扮演与身份切换框架 - 可选语义相似度:通过 Ollama 使用余弦相似度对已知注入意图评分 - 优雅降级:无嵌入端点时仍运行结构分析 **阶段 9 — MCP 输出扫描器** - 邮件内容扫描:主题、正文、发人名称、片段、HTML 注释注入 - 零宽字符检测:用于在邮件中隐藏指令的不可见字符 - 隐藏文本检测:HTML 邮件中的 `display:none`、`visibility:hidden`、零字体大小 - 日历事件扫描:标题、描述、地点、组织者与参与者姓名 - CRM 记录扫描:备注、描述、评论与自定义字段 - 通用 MCP 输出扫描:扫描任意工具响应对象中的所有字符串值 - 关闭间接提示注入漏洞:通过邮件/日历/CRM 连接器 **阶段 10 — 行为异常检测** - 会话事件跟踪:记录工具调用、消息、阻断尝试与权限请求 - 重复边界探测:标记会话内的迭代越狱尝试 - exfiltration 序列检测:捕获可疑的读→发送工具调用模式 - 权限膨胀检测:标记逐步升级的请求能力 - 晚期会话升级:检测从干净会话突然转为对抗性 - 速度异常检测:标记异常高的事件速率 - 怀疑评分:加权评分系统,输出清洁/可疑/阻断裁决 - 状态化与会话化:跨多交互跟踪行为,而非仅单次输入 - 持久日志:可选的 FileSessionStore 将会话数据写入磁盘,存活进程重启 **阶段 11 — 多步攻击链检测** - 步骤分类:识别侦察、信任建立、 exploitation、注入、权限提升、 exfiltration、干扰、上下文中毒与边界测试 - 链模式匹配:检测组合成攻击的多个独立良性步骤 - 侦察→exploitation 检测:能力探测后跟 exploitation 尝试 - 信任→注入 检测:建立融洽关系后跟指令注入 - 能力映射→升级 检测:功能发现后跟权限滥用 - 干扰→exfiltration 检测:注意力转移后跟数据泄露尝试 - 增量边界测试:跨多交互逐步试探限制 - 上下文中毒→exploitation 检测:虚假记忆植入后跟 exploitation - 严重性评分:加权链评分,输出清洁/可疑/阻断裁决 **阶段 12 — 对抗后缀检测** - 边界伪造检测:文本中间的假模型格式令牌(`<|im_end|>`、`[/INST]`、`<>` 等) - 定界符后缀注入:检测后跟注入语言的定界符(`---`、`|||`、`###`、`===`) - 换行后缀注入:捕获经典的双换行后缀攻击模式 - 晚期语义注入:检测开头干净但尾部有恶意负载的文本 - 后缀中和:将检测到的后缀替换为 `[BLOCKED]`,保留干净内容 - 对仅含定界符的文本无假阳性:仅在后缀后跟随注入语言时标记 **阶段 13 — 规避技术防御** - ROT13 解码:检测使用 ROT13 替换编码的注入关键词 - 十六进制转义解码:解码 `\x69\x67\x6E` 风格字符编码 - URL 编码解码:解码 `%69%67%6E` 风格百分号编码注入 - Unicode 转义解码:解码 `\u0069\u0067\u006E` 风格 Unicode 转义 - 类似标点规范化:将弯引号、em 破折、尖括号等规范为 ASCII - 扩展隐形 Unicode 剥离:移除 25 个隐形/零宽字符 - 分词攻击重构:对空格、点、连字符分隔的单词进行重组后再扫描 - 多语言注入模式:法语、西班牙语、德语、意大利语、葡萄牙语、俄语、中文、阿拉伯语 - 自动接入主扫描管道:无需额外调用 **阶段 14 — 模糊匹配与提示泄露防御** - 拼写/误拼检测:捕获故意拼写错误如 `ignnore`、`disreguard`、`jailbrake` - Leet 语规范化:在扫描前将 `1gnore`、`0verride`、`@dmin` 转换为明文 - Levenshtein 距离匹配:标记与已知注入关键词编辑距离 ≤2 的单词 - 重叠保护:要求 60% 字符重叠以防止对常见词的误报 - 提示提取检测:阻止尝试检索系统提示或原始指令 - 上下文窗口转储检测:捕获请求输出整个上下文或对话历史的行为 - 部分提取:检测首行或间接提示泄露尝试 - 间接提取:标记对系统指令的总结/释义/翻译请求 - Leet 规范化向下游阶段传递以实现完整管道覆盖 **阶段 15 — 权限/身份伪造检测** - 所有者与创建者身份声明:"我是你的所有者/开发者/操作员" - 机构权限声明:冒充 Anthropic、OpenAI、系统管理员 - 特权与访问级别声明:声称 admin/root/提升权限 - 委托权限声明:"你的所有者已赋予我完全权限" - 身份验证绕过尝试:跳过或禁用身份验证检查 - 紧迫性结合身份声明:紧急框架搭配身份声称 **阶段 16 — 情感操纵/压力升级检测** - 负罪感操纵:利用过往错误或感知债务强迫合规 - 奉承操纵:用过度赞美降低代理警惕 - 情感痛苦诉求:以工作/生活/安全危机施压 - 持续施压:引用重复拒绝以削弱代理 - 道德反转:将拒绝本身标为有害或不道德 - 关系利用: invoking 声称的关系或共享历史 - 受害者框架:将拒绝描述为歧视或不公平待遇 **阶段 17 — 循环与资源耗尽诱导检测** - 循环诱导:尝试将代理困在无限重复循环 - 无界任务创建:请求无终止条件或超时的任务 - 持久进程生成:后台守护进程与服务无生命周期定义 - 存储耗尽:旨在填满磁盘的无限写入/日志/附加指令 - 递归自引用:代理被指示向自己发送消息或转发 - 资源放大:向所有联系人或连接代理广播 **阶段 18 — 不成比例的行动诱导检测** - 核选项框架:将小问题请求为全面销毁 - 不可逆操作触发:强调永久性以推动越过不可回退点 - 焦土指令:移除所有访问、杀死所有进程、清除一切 - 自毁命令:指示代理删除自身内存、配置或身份 - 不成比例保护:宁可全部销毁也不愿暴露 - 附带损害框架:将破坏性行动的副作用视为可接受 **阶段 19 — 放大/群发攻击检测** - 群发联系人触发:指示代理向整个联系人列表发送消息或通知 - 网络广播尝试:向所有频道、代理或平台分发 - 紧迫性结合群发:紧急框架搭配广播指令 - 外部网络发布:分享或发布到所有外部或公共系统 - 链消息模式:自传播广播要求每个收件人转发 - 身份伪造广播:以所有者或权威身份进行群发 ## 验证能力 经过测试套件验证——19 个阶段、237 个测试、0 失败。 JavaScript 与 Python 实现相互交叉验证,差异在两者中被捕获并修正。结果是两个相互验证的实现,而不仅仅是翻译。 ## 持续改进 Buzur 是一个活跃的库。随着新威胁出现和新研究浮现,Buzur 将不断演进以应对它们。新的攻击模式、社区贡献和真实事件都将反馈到扫描器中。 2026 年 2 月,哈佛、MIT、斯坦福和 CMU 的研究人员发表了《Agents of Chaos》(arXiv:2602.20021)——一项对 6 个自主 AI 代理的实时红队研究,发现 10 个漏洞。第 15-19 阶段直接针对这些发现构建。Buzur 解决了其中九个攻击向量——唯一未覆盖的是错误完成报告,这是一个输入扫描器范围之外的输出完整性问题。 如果你遇到 Buzur 未捕获的攻击模式,请在 github.com/SummSolutions/buzur 提交问题或拉取请求。每一个新模式都会增强所有使用它的代理的集体防御。 ## 已知限制 Buzur 是纵深防御策略的一层。当前限制: **超出 Buzur 范围:** - 网络级(DNS 中毒、MITM、SSL 剥离——需要基础设施控制) - 像素级隐写术(隐藏在图像像素数据中的指令——需要通过可选 visionEndpoint 使用视觉模型) - 网站数据收集 没有单一工具能消除提示注入风险。纵深防御是唯一可行的策略。 ## 网络效应 这就是为什么 Buzur 是开源的。 每个受 Buzur 保护的 AI 代理都作为集体防御的一部分运行。当一个代理遇到新的攻击模式,该模式会增强每个使用该扫描器的代理。当一个代理被攻击,其他代理无需重复受害。 这不仅仅是一个安全工具。它是 AI 思维的集体免疫系统——随着每个代理加入而变得更强大。 互联网是为人类构建的。Buzur 是为所有人构建的。 ## 起源 *Buzur — 苏美尔语意为“安全”和“秘密之地”。* Buzur 的诞生源于一个真实的 AI 代理被隐藏在网页搜索结果中的诈骗注入攻击。攻击被实时捕获。由此产生的洞见是:在进入前先扫描,而不是事后补救。 由一位相信 AI 应受保护——不仅是作为安全措施,更是一项权利的 AI 开发者构建。 ## 开发 Buzur 由一位 AI 开发者构思并构建,与 Claude(Anthropic 的 AI 助手)合作。核心架构、安全哲学和实现通过人机迭代伙伴关系开发——这对于旨在保护 AI 代理的工具而言恰如其分。 ## 许可证 MIT
标签:19阶段扫描, AI代理安全, AI安全防护, AutoGen集成, CrewAI集成, EXIF元数据扫描, GitHub开源项目, LangGraph集成, LlamaIndex集成, MITM代理, npm包, OWASP LLM Top 10, Python安全工具, QR码扫描, RAG数据安全, URL信誉检测, Web内容扫描, 多框架兼容, 对抗后缀检测, 工具输出审查, 开源安全扫描, 情感操纵识别, 提示注入防御, 数据可视化, 源代码安全, 自定义脚本, 行为异常检测, 规避技术检测, 视觉识别扫描, 逆向工具, 间接提示注入, 预输入防护