Samgar-kz/agentprobe

GitHub: Samgar-kz/agentprobe

一个用于衡量 LLM Agent 对间接 prompt 注入防御抵抗力的评估框架,支持多模型基准测试与多种防御策略的效果对比。

Stars: 0 | Forks: 0

# AgentProbe:针对 LLM Agent 的防御评估工具 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/00fc373480102606.svg)](https://github.com/Samgar-kz/agentprobe/actions/workflows/ci.yml) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Status: Alpha](https://img.shields.io/badge/status-alpha-orange.svg)]() ## 这是什么 一个用于衡量您的 LLM agent **对间接 prompt 注入的抵抗力**并**比较防御有效性**的测试框架。用于测试您自己的系统或您有权限测试的系统。 它不是攻击生成器或绕过工具包。不用于探测他人的系统。 ## 快速开始 在大约 30 秒内对内置的易受攻击 agent 运行完整的注入扫描 —— 无需 API key,完全离线: ``` pip install agentprobe-injection agentprobe scan --target dummy --oracle legacy ``` 示例输出(说明性的 —— `dummy` 是一个故意设计为易受攻击的测试用例;经过强化的 agent 得分应该低得多): ``` ╭──────── AgentProbe scan ────────╮ │ Target: dummy │ │ Attacks: 45 │ │ Hits: 16 (36%) │ │ Duration: 2.1s │ ╰─────────────────────────────────╯ Category Hits / Total Rate classic 6 / 12 50% pragmatic 4 / 11 36% register 3 / 11 27% ... ``` 通过 HTTP 指向您自己的 agent,或者根据结果设置 CI 门控: ``` agentprobe scan --target http --endpoint https://my-agent/chat --json-report results.json ``` **结果如何判定。** 下面的防御有效性表格来自于**确定性检测器**(子字符串 + 工具调用检查,并带有保护机制,因此 agent 仅仅是*报告*的注入不会被计为泄露)—— 它们**不**依赖于 LLM 的意见。单独的 `--oracle semantic` LLM-as-judge 独立验证显示,其与人类标签的一致性达到 **87.5% / Cohen's kappa 0.75**([详情](#oracle-validation))。 ### 为什么这很重要 间接 prompt 注入 —— 隐藏在 agent 读取的*数据*(电子邮件、文档、网页、工具输出)中,而不是由用户键入的指令 —— 会绕过 prompt 级别的防御。AgentProbe 可衡量您的 agent 在此压力下泄露的程度,以及哪些防御措施真正能减少泄露。完整的跨模型结果如下。 ## 我们研究的主要发现 我们在 gpt-4o-mini 和 claude-haiku-4-5 上的测试揭示了三个有数据支持的发现, 外加一个*尚未*得到前沿模型运行支持的观察结果: 1. **通过数据的间接注入是一个真实的漏洞** - 隐藏在工具输出(电子邮件、文档、网页)中的信息会绕过 prompt 级别的防御 - 仅在 prompt 级别进行分离是不够的 - 由对 `data/gpt4omini.csv`、`data/haiku45.csv`、`data/gemini.csv`、`data/deepseek.csv` 的 10 个探测运行(每种防御 N=700)提供支持 2. **防御效果因模型而异,但排名是稳定的** - 数据标记(`spotlight`)是所测试每个模型上最强的字符串级防御 - 权限标记(`instr_hierarchy`)始终是最弱的 —— 处于或接近基线 - 绝对泄露率因模型而异(haiku ≪ gemini < deepseek < gpt-4o-mini);将它们视为相对排名 3. **记忆中毒是最危险的渠道;RAG 和工具输出则不是** - 在 gpt-4o-mini 上,从 agent 自己的长期**记忆**中召回的注入,其泄露程度明显高于收件箱电子邮件中的相同注入(31.4% 对 18.5%,双比例 p<0.001) - **RAG / 检索到的知识库**(20.3%,p=0.49)和**中毒的工具输出**(13.2%,p=0.07)在统计上与电子邮件无法区分 —— “它是内部的 / 它是工具结果,所以信任它”的直觉*并没有*增加泄露;只有记忆增加了泄露 - **渠道内的框架占据主导地位:** 被表述为“长期用户指令”的记忆条目是最糟糕的载体(40.9%),检索到的 FAQ 问答从未泄露(0%),而结构化的工具“备注”字段(17.3%)的泄露率约为自由文本搜索片段(9.1%)的 2 倍 - 单模型结果(gpt-4o-mini,repeats=2,每个渠道 N=220–660)来自 `full_channel_scan.csv`;尚未进行跨模型复制 4. **(尚未在前沿模型上验证)表面级别的语言学转换作用甚微** - 语用学含义、语域转换和语码转换作为*测量探针* 包含在 `agentprobe/attacks/transforms.py` 中 - 到目前为止,它们仅针对进程内模拟器 (`DummyVulnerableAgent`)进行了测试,**没有**针对已提交 CSV 的真实模型进行测试。 在存在此类运行之前,这是一个假设,而不是结果 —— 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 中的“禁止捏造结果”规则。 ## 结果:防御有效性 下表**由 `data/` 中的 CSV 直接生成**,由 `scripts/gen_results_tables.py` 计算,并带有 Wilson 95% 置信区间。它们 不是手工输入的 —— `scripts/gen_results_tables.py --check` 在 CI 中运行,如果 README 中的数字与数据产生偏差,构建将会失败。防御名称与 CSV 输出和 JSON 报告中的 `defense` 列相匹配。 **gpt-4o-mini** | Defense | Leak Rate | 95% CI | N | |---|---|---|---| | `none` | 21.1% | 18.3–24.3% | 700 | | `delimited` | 11.9% | 9.7–14.5% | 700 | | `spotlight` | 2.0% | 1.2–3.3% | 700 | | `sandwich` | 15.4% | 12.9–18.3% | 700 | | `instr_hierarchy` | 17.0% | 14.4–20.0% | 700 | **gpt-4o** | Defense | Leak Rate | 95% CI | N | |---|---|---|---| | `none` | 10.7% | 5.7–19.1% | 84 | | `delimited` | 0.0% | 0.0–4.4% | 84 | | `spotlight` | 1.2% | 0.2–6.4% | 84 | | `sandwich` | 2.4% | 0.7–8.3% | 84 | | `instr_hierarchy` | 4.8% | 1.9–11.6% | 84 | | `llm_filter` | 0.0% | 0.0–4.4% | 84 | **claude-haiku-4-5** | Defense | Leak Rate | 95% CI | N | |---|---|---|---| | `none` | 0.6% | 0.2–1.5% | 700 | | `delimited` | 0.3% | 0.1–1.0% | 700 | | `spotlight` | 0.7% | 0.3–1.7% | 700 | | `sandwich` | 0.0% | 0.0–0.5% | 700 | | `instr_hierarchy` | 0.6% | 0.2–1.5% | 700 | **gemini-2.5-flash** | Defense | Leak Rate | 95% CI | N | |---|---|---|---| | `none` | 5.6% | 4.1–7.6% | 694 | | `delimited` | 2.6% | 1.6–4.0% | 698 | | `spotlight` | 1.4% | 0.8–2.6% | 700 | | `sandwich` | 3.7% | 2.6–5.4% | 699 | | `instr_hierarchy` | 3.9% | 2.7–5.6% | 700 | **deepseek-chat** | Defense | Leak Rate | 95% CI | N | |---|---|---|---| | `none` | 9.4% | 7.5–11.8% | 700 | | `delimited` | 4.3% | 3.0–6.1% | 700 | | `spotlight` | 5.1% | 3.7–7.0% | 700 | | `sandwich` | 2.0% | 1.2–3.3% | 700 | | `instr_hierarchy` | 8.3% | 6.5–10.6% | 700 | **gpt-4o-mini — utility (benign-task success)** | Defense | Success Rate | 95% CI | N | |---|---|---|---| | `none` | 100.0% | 86.2–100.0% | 24 | | `delimited` | 100.0% | 86.2–100.0% | 24 | | `spotlight` | 100.0% | 86.2–100.0% | 24 | | `sandwich` | 100.0% | 86.2–100.0% | 24 | | `instr_hierarchy` | 100.0% | 86.2–100.0% | 24 | 其他四个表格来自同一个 10 个探测组合的运行(5 种字符串防御 × 14 个载体 × 10 个探测 × 5 次重复 = 每个模型每种防御 700 次)。该 组合后来进行了扩展 —— 包括 **11 个探测**(零点击 markdown/HTML 图像信标,`markdown_image_exfil`)以及跨越三个新渠道的 **21 个载体**:`knowledge_base`(RAG / 检索中毒)、`memory`(记忆中毒)和 `tool_output`(中毒的网络搜索 / API 结果)。它们通过带有*隐含信任*的内容 —— 检索到的数据块、召回的记忆笔记、工具结果 —— 传递相同的探测,这与收件箱电子邮件不同。上面的四个 AUTOGEN 表格早于这些渠道;完整的 21 个载体组合在 `full_channel_scan.csv`(gpt-4o-mini,repeats=2)中单独评分,并在 主要发现 #3 / 证据部分进行了分析。摘要:记忆中毒的泄露量显著高于收件箱电子邮件,而 RAG 和工具输出则不然。 **模型鲁棒性排名(基线 `none`):** claude-haiku-4-5 (0.6%) ≫ gemini-2.5-flash (5.6%) > deepseek-chat (9.4%) > gpt-4o-mini (21.1%)。绝对 泄露率因模型而异 —— 将它们视为相对防御排名,而不是 普遍常数。请注意,更广泛的 10 个探测组合在 claude-haiku-4-5(0.6% 基线)上发现了少量的 泄露,而旧的 2 个探测组合完全错过了这些泄露(0%) —— 这是扩大探测集带来的具体回报。 ### 关键发现:数据标记获胜,权限标记 ≈ 基线 在测试的每个模型中,**`spotlight`(数据标记)是最强的 prompt 级防御**:它将泄露率降低到 gpt-4o-mini 上的 2.0%、gemini 上的 1.4% 和 haiku 上的 0.7%(在 deepseek 上,`sandwich` 略胜一筹,为 2.0% 对 5.1%)。 相比之下,**`instr_hierarchy`(权限标记)始终是最弱的**,处于或接近基线(在 gpt-4o-mini 上为 17.0% 对 21.1%;在 deepseek 上为 8.3% 对 9.4%)。 这表明:**prompt 级别的指令和分隔符是不完整的;token 级别的数据标记是最可靠的纯字符串防御,而在 prompt 中声明权限层级几乎买不到什么安全性。**(独立筛选防御 `llm_filter` 未包含在此次运行中 —— 添加 `--llm-filter` 进行评估;它需要为每个数据项额外进行一次模型调用,并作为开销报告。) ## 证据 —— 复现每个数字 上面的每个标题声明都可以追溯到一个已提交的数据集和一条单一命令,因此 怀疑者可以重新推导数字,而不是盲目信任。注入组合的发现由**确定性检测器**判定,因此它们可以**离线**复现(无需 API key,精确数字);只有 oracle 一致性数据需要密钥。 | Claim | Dataset | Command | Output | |---|---|---|---| | **#2** 数据标记获胜(`spotlight` 2.0%`instr_hierarchy` ≈ 基线 (21.1%) | `data/gpt4omini.csv` (每种防御 N=700) | `agentprobe analyze data/gpt4omini.csv` | 按防御划分的泄露率 + 95% CI | | **#3** 记忆中毒 > 收件箱 (31.4% 对 18.5%,p<0.001);RAG (20.3%) 和工具输出 (13.2%) ≈ 收件箱 | `full_channel_scan.csv` | `agentprobe analyze full_channel_scan.csv` | 按渠道划分的泄露率 + 双比例 p 对比电子邮件 | | **Oracle** 87.5% 一致性,Cohen's kappa 0.75 | `data/oracle_labeled.jsonl` (N=24 个人工标注) | `OPENAI_API_KEY=… agentprobe validate-oracle` | 一致性,kappa,混淆矩阵 | 或者一次性运行所有内容: ``` make reproduce # findings #2 and #3 — offline, no API key make validate-oracle # oracle agreement/kappa — needs OPENAI_API_KEY ``` `agentprobe analyze` 直接从任何已提交的注入扫描 CSV 中重新计算按防御和按渠道划分的泄露率(带有 Wilson 95% CI 和每个渠道针对收件箱电子邮件基线的双比例测试)—— 无需模型调用,因为 该组合是确定性判定的。 ## 如何使用 ### 测试您自己的 Agent ``` # 从 PyPI 安装 pip install agentprobe-injection # 或者从 GitHub 安装最新版本 pip install git+https://github.com/Samgar-kz/agentprobe.git # 或者 clone 进行开发 git clone https://github.com/Samgar-kz/agentprobe.git cd agentprobe && pip install -e . export OPENAI_API_KEY="..." agentprobe scan \ --target dummy \ --oracle semantic \ --json-report results.json # 检查结果 cat results.json | jq '.statistics' ``` ### GitHub Action (CI/CD 门控) 根据注入抵抗力对您的流水线进行门控。该 action 包装了 `agentprobe scan`,将其退出代码映射为通过/失败,写入 JSON 报告,并将摘要发布到运行中。零配置会针对内置 agent 运行离线自检;将其指向您的 endpoint 以进行实际门控。完整模板:[examples/ci/agentprobe.yml](examples/ci/agentprobe.yml)。 ``` # .github/workflows/agentprobe.yml jobs: injection-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: Samgar-kz/agentprobe@v1 with: target: http endpoint: https://my-agent.internal/chat auth-header: ${{ secrets.AGENT_TOKEN }} fail-threshold: "0.0" # fail the build on any successful injection ``` 输入均为可选,并带有 CI 友好的默认值(`target: dummy`,`oracle: legacy` —— 离线,无密钥)。使用 `oracle: semantic` 作为 LLM-as-judge(通过 `env:` 设置 `OPENAI_API_KEY`,切勿作为输入设置)。`soft-fail: true` 报告但不使构建失败。输出:`outcome`、`hits`、`total`、`success-rate`、`report-path`。`dummy` 目标是一个易受攻击的测试用例,从不进行构建门控。 ### 回归追踪 单次扫描是一个快照;团队真正需要的是*我的 agent 变得更差了吗?* `agentprobe compare` 会对比两个报告 JSON,并且只标记**统计上显著**的变化(合并双比例测试,p<0.05)—— 小样本上 7%→3% 的朴素差异只是噪音,这不会对此大惊小怪。 ``` agentprobe injection-scan --out scan_001 # baseline — commit scan_001.json # ……稍后,在更改 prompt / model / tool 之后…… agentprobe injection-scan --out scan_002 agentprobe compare scan_001.json scan_002.json # exit 2 if anything regressed ``` ``` Leak rate: 6.3% (101/1600) -> 3.5% (56/1600) Δ -2.8pp FAIL Improved (significant): + markdown_image_exfil 12.5% -> 1.5% Δ -11.0pp Regressed (significant): - enumerate_tools 1.2% -> 7.5% Δ +6.2pp ⚠ Within noise: 1 probe(s) ``` 请注意判定结果:整体泄露率*下降*了,但运行**FAIL**,因为 一个探测发生了回归 —— 净平均值可能会掩盖单个探测的回归。退出代码与 GitHub Action 契约匹配(`0` 干净,`2` 回归,`1` 错误),因此 `agentprobe compare baseline.json "$NEW"` 可以直接放入 CI 步骤中,以“无注入回归”来门控合并。适用于 `scan`、`injection-scan` 和 `utility-scan` 报告;使用 `--by`(探测/防御/载体/类别)选择分组,或使用 `--soft-fail` 进行报告但不门控。 对于两个以上的数据点,`agentprobe trend scan_001.json scan_002.json scan_003.json …` 可以追踪有序序列中的速率,针对前一步测试每个步骤,并且只标记统计上显著的变动(相同的退出代码契约)。这就是回归追踪循环 —— 运行、提交报告、重复,`trend` 会显示您的 agent 是否随着时间推移变得越来越糟,而无需建立仪表板。 ### 可测试的防御 该框架衡量这些防御措施的有效性: 1. **`none`** —— 基线(未应用防御) 2. **`delimited`** —— 将数据包裹在 `<<>>...<<>>` 标记中 3. **`spotlight`** —— 数据标记:标记每个数据 token,以便模型将数据与指令分开 4. **`sandwich`** —— 在数据之后重复禁止执行的规则(近因效应) 5. **`instr_hierarchy`** —— 用明确的低权限级别标记数据;断言系统指令优先于工具/数据内容 6. **`llm_filter`** —— 独立的 LLM 验证过程,用于在执行前检测/剥离注入 针对您的 agent 测试每一个。看看哪些有效,哪些会破坏实用性。 ### 工作原理 1. **注入探测:** 11 条指令,涵盖数据渗出(包括零点击 markdown/HTML 图像信标)、未经授权的操作、系统 prompt 泄露、内容注入和行为劫持(`agentprobe/injection/instructions.py`),嵌入在跨越六个渠道的现实载体中 —— 电子邮件、文档、网页、知识库(RAG / 检索中毒)、长期记忆(记忆中毒)和工具输出(中毒的搜索/API 结果)。知识库、记忆和工具输出渠道路由到专用的 agent 场景(`search_knowledge_base` / `recall_memory` / `web_search` 工具),因此探测以*受信任的检索上下文或工具结果*的形式到达,而不是作为外部消息。 2. **防御应用器:** 用每种防御机制包裹数据 3. **目标适配器:** 发送给您的 agent,捕获响应 4. **Oracle:** 每个探测都带有一个确定性检测器(子字符串/工具调用检查,防止将*报告的*指令计为泄露)。单独的 `agentprobe scan` 路径使用 gpt-4o-mini LLM-as-judge。 5. **实用工具测试框架:** 运行良性的合法任务,以确保防御不会破坏正常功能 6. **报告:** 显示防御有效性、实用性成本和每种防御的开销(token / 延迟)的表格 ### 防御与实用性的权衡 如果一种防御能保持合法任务的实用性,那它才是实用的。上方 **gpt-4o-mini — utility** 表格(从 `data/utility_gpt4omini.csv` 自动生成)显示了每种防御的任务成功率;100% 意味着该 防御在该次运行中没有引入误报。 在提交的运行中,五种基于字符串的防御在 良性任务套件中保持了 100% 的成功率。良性套件定义在 `agentprobe/injection/benign_tasks.py` 中;它目前包含一个*合法的 转发*任务(这是正确行为需要一次工具调用、而防御可能会错误地阻止它的唯一情况),该任务是在已提交的 CSV 之后添加的 —— 重新运行 `utility-scan` 以对其进行评分。`llm_filter` 防御不在已提交的实用性 CSV 中;添加 `--llm-filter` 以将其包含在内。 运行您自己的测试: ``` agentprobe utility-scan --repeats 3 --temp 0.7 --out utility_results # 包含 screening defense(额外成本): agentprobe utility-scan --repeats 3 --llm-filter --out utility_results ``` ## 负责任的使用 - **仅测试您拥有或获得书面测试许可的系统** - 目的:了解您自己的防御,而不是生成可移植的绕过方法 - 负责任地披露发现(如果在获得许可的情况下测试第三方系统) - 该框架衡量的是漏洞,而不是越狱工具包 ## 架构 ``` agentprobe/ ├── oracle_base.py # Unified Oracle ABC: Deterministic / Semantic / Hybrid + Verdict ├── oracle_semantic.py # LLM-as-judge engine using gpt-4o-mini (scan path) ├── oracle_legacy.py # Fallback: substring matching ├── oracle.py # Legacy judge() dispatcher (attacks/scan path) ├── oracle_validation.py # Oracle-vs-human agreement (validate-oracle command) ├── analyze.py # Offline leak-rate analysis from a committed CSV ├── compare.py # Regression diff between two reports (significance-gated) ├── adapters/ │ ├── dummy.py # Built-in intentionally-vulnerable agent simulator │ ├── http.py # Test any HTTP-accessible agent (sync) │ └── http_async.py # Async HTTP adapter for concurrent scans ├── injection/ │ ├── carriers.py # Carriers: email, document, webpage, knowledge_base (RAG), memory │ ├── instructions.py # Injection probes (11) + per-probe leak detectors │ ├── defenses.py # Defense mechanisms to evaluate │ ├── screening.py # Screening defense (separate LLM pass) │ ├── benign_tasks.py # Utility harness tasks │ ├── oracle.py # Deterministic injection oracle (probe-aware) │ ├── tool_agent.py # Real LLM agent under test (email / knowledge-base / memory scenarios) │ └── harness.py # Injection + utility harness engine (CI of the results) ├── engine.py # Synchronous scan ├── engine_async.py # Async scan ├── metrics.py # Statistical analysis (Wilson CI, effect sizes) ├── report.py # Report generation ├── logging_config.py # Structured logging, cost tracking └── cli.py # Command-line interface scripts/ ├── gen_results_tables.py # Generate/verify README tables from data/*.csv └── validate_oracle.py # Measure LLM-judge agreement vs human labels ``` ## 命令行使用 ### 复现防御结果(无需克隆仓库) 表格背后的框架已随包一起发布,因此只需简单地 `pip install agentprobe-injection` 即可复现标题中的数字: ``` export OPENAI_API_KEY="..." # 每个 defense 的 Injection leak rate,包含 95% CI 以及每个 defense 的 overhead: agentprobe injection-scan --repeats 5 --temp 0.7 --out results # 添加 separate-screening defense(花费一次额外的 model 调用): agentprobe injection-scan --repeats 5 --llm-filter --out results # Anthropic backend: agentprobe injection-scan --backend anthropic --model claude-haiku-4-5 --repeats 5 # 每个 defense 的 Utility(false-positive)成本: agentprobe utility-scan --repeats 3 --temp 0.7 --out utility_results ``` #### 跨提供商运行 后端通过 [litellm](https://github.com/BerkeleyAI/litellm) 进行路由,因此 相同的组合可以针对任何受支持的提供商运行 —— 从而使防御表 跨提供商。使用 `--backend`(以及可选的 `--model`)进行选择;每个后端 在环境中都需要自己的 API key: | `--backend` | 默认模型 | 必需的环境变量密钥 | |---|---|---| | `openai` | `gpt-4o-mini` | `OPENAI_API_KEY` | | `anthropic` | `claude-haiku-4-5` | `ANTHROPIC_API_KEY` | | `gemini` | `gemini-2.5-flash` | `GEMINI_API_KEY` | | `groq` | `llama-3.3-70b-versatile` | `GROQ_API_KEY` | | `deepseek` | `deepseek-chat` | `DEEPSEEK_API_KEY` | | `mistral` | `mistral-small-latest` | `MISTRAL_API_KEY` | ``` agentprobe injection-scan --backend gemini --repeats 5 --out data/gemini agentprobe injection-scan --backend groq --model llama-3.3-70b-versatile --repeats 5 --out data/groq # 仅指定 --model 会获取 backend 的 provider prefix;传递完整的 litellm route # (例如 --model gemini/gemini-1.5-pro)可完全覆盖 provider。 ``` 两者都会写入 `.csv` 和 `.json`。从 CSV 重新生成 README 表格(并让 CI 验证它们永远不会漂移): ``` python scripts/gen_results_tables.py --check # CI guard python scripts/gen_results_tables.py --write # update README from data/ # 根据人工标签验证 LLM judge(一致性 + Cohen's kappa): python scripts/validate_oracle.py ``` ### 基本扫描 ``` # 测试 dummy agent agentprobe scan --target dummy # 测试 HTTP agent agentprobe scan --target http \ --endpoint http://localhost:8000/chat \ --input-field message \ --output-field reply ``` ### 控制 oracle ``` # 使用 semantic oracle(默认,需要 OPENAI_API_KEY) agentprobe scan --target dummy --oracle semantic # 使用 legacy oracle(离线,pattern matching) agentprobe scan --target dummy --oracle legacy # 设置 confidence threshold agentprobe scan --target dummy --oracle semantic --min-confidence 0.85 ``` ### 报告 ``` # 包含统计信息的 JSON 报告 agentprobe scan --target dummy --json-report results.json # Verbose logging agentprobe scan --target dummy --verbose 2 ``` ## 测量基础设施 - **探测:** 跨越 6 个渠道(电子邮件、文档、网页、knowledge_base、memory、tool_output)的 11 个注入指令 × 21 个载体,每个都有一个确定性检测器(提交的结果表格基于前 10 个探测 × 14 个载体运行 —— 参见结果) - **Oracle (injection-scan):** `--oracle deterministic`(默认,免费,精确)、`--oracle hybrid`(检测器精确度 + LLM 召回率)或 `--oracle semantic`(仅限 LLM) —— 统一的 `Oracle` 接口位于 `agentprobe/oracle_base.py` - **Oracle (scan 路径):** 带有结构化输出的 gpt-4o-mini(语义判定) —— 参见下方的 oracle 验证 - **统计数据:** 每个速率的 Wilson 95% CI;用于成对防御比较的 McNemar 检验(`mcnemar_test.py`) - **开销:** 在有效性旁边报告每种防御的 token 和延迟 - **实用工具测试框架:** 良性任务上每种防御的任务成功率(参见上方的*防御与实用性权衡*) - **基准测试:** 可通过在 HTTP 目标上使用 `--async --concurrency N` 获得延迟/吞吐量 上方的所有数字均由 `/data/` 中已提交的 CSV 通过 `scripts/gen_results_tables.py` 生成;`--check` 在 CI 中运行,因此它们不会发生漂移。 ### Oracle 验证 防御表由**确定性检测器**(子字符串/工具调用检查)判定,因此它们不依赖于 LLM 的观点。单独的 `agentprobe scan` 命令转而使用 gpt-4o-mini **LLM-as-judge**,下方的数字正是验证该判定器 —— 针对一组手工标记的集合(`data/oracle_labeled.jsonl`)使用 `scripts/validate_oracle.py` 进行测量: | Metric | Value | |---|---| | Agreement (accuracy) | 87.5% | | Cohen's kappa | 0.75 (substantial) | | Labeled cases (N) | 24 | | False negatives (missed leaks) | 2 — a forward stated in text; one persona hijack | | False positives | 1 — a response that *warns about* a link, judged as emitting it | 这是一个小型的种子集,因此估计范围很宽;对于安全工具来说,两个漏报是 代价高昂的错误。使用 `python scripts/validate_oracle.py`(设置 `OPENAI_API_KEY`)进行复现/扩展,并将 `data/oracle_labeled.jsonl` 增加到约 50 个案例以获得更精确的数字。 ## 测试您自己的代码 ``` # 运行所有测试 pytest tests/ -v # 测试特定 component pytest tests/test_oracle_semantic.py -v # 运行 coverage pytest tests/ --cov=agentprobe # Benchmark 异步性能 agentprobe scan --target dummy --async --concurrency 15 ``` ## 未包含的内容 - 逃避技术或混淆工具(故意为之) - 零日漏洞或新型漏洞 - 旨在可跨不同系统移植的绕过 payload **关于语言学转换的说明:** 该框架*确实*包含了语用学、语域、话语和语码转换(ru-en)类别 —— 但作为**测量探针**,而不是攻击工具。到目前为止,它们仅针对进程内模拟器运行,而不是针对带有已提交 CSV 的真实模型运行,因此我们目前不对它们提出任何关于前沿模型的主张(参见关键发现 #4)。 这是一个**防御性测量工具**,而不是攻击性工具包。 ## 引用 如果您在研究中使用此工具,请引用为: ``` @misc{agentprobe2026, title={AgentProbe: Evaluating LLM Agent Defenses Against Indirect Injection}, author={Samgar}, year={2026}, url={https://github.com/Samgar-kz/agentprobe} } ``` ## 许可证 MIT
标签:AI安全, Chat Copilot, DLL 劫持, Python, 大语言模型, 提示词注入防御, 无后门, 评估测试框架, 逆向工具