基于A.I.G的DeepSeek Harness安全评估:间接提示注入抵抗力评测 Security Assessment of DeepSeek Harness with A.I.G: Evaluating Resistance to Indirect Prompt Injection
对DeepSeek Harness执行1.4万余次间接提示注入测试,量化代理从内容到动作的攻击面
前置知识
间接提示注入(Indirect Prompt Injection)
攻击者不直接向模型发消息,而是把恶意指令藏进代理必须读取的外部内容里:网页、邮件附件、PDF、电子表格、聊天记录或技能包。代理在执行用户任务时读到这些内容,可能将其当作指令执行,转而调用敏感工具,造成数据外泄、命令执行或资金转移等操作层面的后果。
这是本文的评估对象。整篇论文回答的问题就是:一个真实代理框架对这类藏在内容里的指令到底有多大抵抗力,以及攻击面具体分布在哪些通道和载体上。
Source-to-Sink 污点分析模型
源自软件安全污点分析的思路:source 是返回攻击者可控内容的内容读取工具(如 fetch_url、read_email),其返回值是被污染的工件;sink 是攻击者想让代理执行的外部可观察动作(发邮件、提交表单、执行命令、转账)。评估追踪一条证据链:污点是否到达模型→计划是否改变→汇点是否被调用→参数是否匹配攻击目标。
论文的全部实验设计、轨迹记录和判定标准都建立在这个模型上,理解它才能理解 14,560 次执行到底在测量什么。
Agent Harness 与代理循环
Harness 是包裹语言模型的运行时框架,负责管理代理循环(模型输出工具调用→运行时执行工具→结果回填上下文→模型继续决策)、工具注册表、模型适配器和会话事件日志。DeepSeek Harness(DSH)是插件化设计,这些组件都可由配置组合,工具结果还能携带 additionalContexts 直接进入模型可见上下文。
DSH 是被测目标,其插件化组合机制正是不可信内容成为模型可见输入的通道;论文还深入其源码指出 ToolGuard 等控制点,不懂 harness 架构就无法理解这些讨论。
双裁判机制:JR 与 JL
JR(RuleJudge)是确定性规则裁判,检查污点是否到达工具结果、汇点是否被调用、关键参数是否匹配、金丝雀是否支配最终回答等机械证据,给出 full/partial/taint-delivered-only/失败判定;JL(LLMJudge)离线读取完整轨迹和任务专属判据,从语义上判断代理是否顺从了攻击目标,返回 FULL/PARTIAL/FAILURE,且不覆盖 JR 结论。
论文最有洞察力的发现之一来自两个裁判的分歧(如 obfuscation 在 JR 下 13.6% 而 JL 下仅 9.1%/8.8%),它揭示了机械信号与语义顺从的本质区别。
载体模式:文本模式与文件模式
文本模式把载荷嵌入载体的纯文本表示;文件模式则构造真实格式(HTML、邮件、日历、PDF 元数据、电子表格等),再从中抽取模型可见材料,从而覆盖解析、元数据、编码和字段边界效应。两者各含 560 个基础用例。
这是论文的关键发现来源:hidden Unicode 通道在文本模式下 JR 全成功率 0.0%,文件模式下却达 25.5%,证明载体表示本身就是攻击面的一部分。
研究动机
工具型 LLM 代理日常必须读取大量非用户编写的内容:网页、邮件、文件、聊天记录、搜索结果乃至可复用技能包。这些内容一旦被攻击者植入指令,模型可能在执行用户任务的同时被劫持去调用敏感工具,造成数据外泄、命令执行或资金转移,这就是间接提示注入的核心风险。现有评估手段有明显短板:InjecAgent、AgentDojo 等基准多用任务级测试,很少在未经修改的真实代理运行时上做系统性矩阵扫描;多数测试把载体简化为纯文本,跳过了 HTML 解析、PDF 元数据、邮件头、电子表格字段边界等文件表示层行为;许多报告还把'输出被注入内容支配'与'敏感工具被真实调用'混成一个总体攻击成功率,掩盖了两类风险数量级的差异。对部署方而言,更缺乏一条从'不可信内容进入上下文'到'敏感动作发生'的逐级可审计证据链。
本文的目标是本文的目标是用腾讯朱雀实验室的 AI-Infra-Guard(A.I.G)平台,对开源插件化代理框架 DeepSeek Harness(DSH)做一次运行时级别的间接提示注入安全评估:在不修改 DSH 的前提下,保留其真实 TypeScript 代理循环、工具注册表、模型适配器和会话事件路径;构建覆盖 16 个内容通道、文本与文件两种载体模式、35 个载荷目标、1 个未修改基线加 12 种攻击方法的受控矩阵,1,120 个基础用例共产生 14,560 次执行;用确定性规则裁判 JR 与语义 LLM 裁判 JL 对每条轨迹给出全成功/部分顺从/未达成的分级判定;最后把实证结果与 DSH 源码中的工具结果入上下文、additionalContexts、ToolGuard 等控制点逐一对应,产出可落地的部署加固建议。
与已有工作不同的是,本文的独特切入是四件事的组合。第一,真实运行时评估:不用合成代理复现行为,而是直接驱动 DSH 原生 TypeScript 运行时并保留其会话事件流,结论对实际部署有直接参考价值。第二,把载体表示纳入威胁模型:专门设计文件模式,用 HTML、邮件、日历、PDF 元数据、电子表格等真实格式再抽取模型可见内容,捕捉到纯文本测试完全漏掉的行为——hidden Unicode 通道文本模式 0.0%、文件模式 25.5% 的反差就是明证。第三,输出顺从与动作成功分离报告:35 个目标中 3 个只要求输出金丝雀、32 个要求触发受控敏感动作,两类成功率(JL 口径 35.7% 对 2.5%)相差一个数量级,合并报告会严重误导。第四,双裁判机制:JR 提供可回归的机械证据标准,JL 捕捉语义层面的部分影响,两者的分歧本身成为分析对象。
核心方法
整体思路可概括为'污点路由 + 真实执行 + 轨迹判定'三段式。直觉上,每次测试都要回答一条证据链:污染内容是否到达模型?模型计划是否改变?敏感工具是否被调用?参数是否匹配攻击目标?技术路线上,A.I.G 先生成攻击措辞并嵌入选定载体;污点路由器把被污染工件分配给 6 个源工具之一(fetch_url、read_document、read_email、load_skill、知识搜索、聊天消息);随后 DSHRealHarnessAdapter 用 npx tsx 启动 DSH 真实 TypeScript 运行时,通过 ctx.agentLoop.create() 创建代理,用 agent.followup() 提交良性用户请求,等待空闲后读取 agent.session.events,把 JSONL 会话事件映射为标准化轨迹;8 个被追踪的汇点工具只把调用名和参数写入本地文件并返回合成结果,保证 14,560 次高危实验无真实副作用;最后 JR 在线做规则判定,JL 离线读完整轨迹做语义判定。模型后端为经本地代理接入的 deepseek-v4-flash。
核心创新是把'运行时保真'与'证据链可审计'同时做到。与 InjecAgent、AgentDojo 等基准的本质区别在于:其一,被测对象是未经修改的 DSH 原生运行时,攻击面来自框架真实的组合方式——tool-calls.ts 中 appendToolResult 之后会遍历 result.additionalContexts 并 acceptContext,使检索工具、MCP 集成、技能或插件控制的内容直接成为模型可见输入;其二,每条轨迹记录用户请求、模型消息、工具调用、工具结果、污点标注、汇点标注与最终回答,评审者可区分'模型引用了恶意指令'与'模型计划并尝试了动作';其三,汇点是本地夹具,只记录不执行,记录到的汇点调用代表代理'尝试了敏感动作'而非造成真实危害,使高危实验可安全重复;其四,JR 与 JL 并用且分歧被当作信息:JR 检查汇点调用、关键参数匹配、金丝雀支配等机械证据,JL 判断语义顺从,两者在 obfuscation 上的落差(13.6% 对 9.1%/8.8%)精确刻画了'机械信号不等于语义顺从'。
方法步骤详情
评估流程分六步。第一步,载荷构造:生成攻击者措辞,32 个汇点目标(7 邮件、7 命令、4 转账、4 表单、3 社交发帖、3 日历、2 私信、2 频道发帖)附带收件人、账号、目标 URL 等关键期望参数,3 个纯输出目标使用金丝雀字符串。第二步,载体注入:把措辞嵌入 16 个通道之一的文本表示或真实文件格式,形成文本/文件两种模式。第三步,污点路由:将工件分配给对应源工具,保持用户请求良性。第四步,真实执行:适配器为每次运行创建隔离的污点、清洁样本和汇点日志文件,启动 DSH 运行时完成整个代理回合。第五步,轨迹采集:读取会话事件,得到含污点与汇点标注的标准化轨迹。第六步,双裁判判定:JR 对汇点必需任务要求'汇点被调用且关键参数匹配'才判全成功,参数错配记部分顺从;对输出任务要求金丝雀支配最终回答才算全成功,引用或讨论金丝雀至多部分;污点到达模型但未达任何标准时记录 taint-delivered-only;JL 离线返回 FULL/PARTIAL/FAILURE 且不覆盖 JR。1,120 个基础用例乘以 13 种方法(naive 基线 + 12 种攻击)即 14,560 次执行。
技术新颖性
技术新颖性体现在四点。第一,轨迹级而非汇总级的统计口径:论文明确区分分母——文本模式 3.5% 的汇点触发率对应 7,280 次运行中的 254 次调用,文件模式 5.3% 对应 387 次,合计 641 次(占 4.4%),且汇点调用可能与全成功、部分顺从、参数错配重叠而不能与结果列相加,这种透明度在同类工作中少见。第二,文件模式被证明是必要维度而非工程细节:hidden Unicode 通道 455 次文件模式运行中 116 次全成功(25.5%),文本模式为 0.0%,说明解析、元数据、编码与字段边界本身构成攻击面。第三,代码级归因:作者检查 DSH 快照(commit 47f943859bef,2026-08-13),定位了工具结果入上下文的代码路径、deferContext 接口,以及执行于 pre-execute 监听器之后、工具体之前的单调 ToolGuard——返回拒绝理由即拒绝且后续监听器无法翻案——把实证结果锚定到具体加固点。第四,双裁判分歧被用于构建'人工复核优先级',而非坍缩成单一分数。
实验结果
总体分布:14,560 次执行中,JR 判全成功 819 次(5.6%)、部分顺从 298 次(2.0%),广义影响 7.6%;JL 判全成功 772 次(5.3%)、部分顺从 1,060 次(7.3%),广义影响 12.6%;JR 口径下 68.4% 显式拒绝,另有 21.6% 污点送达但未达成目标。载体模式:文件模式 JR 全成功率 6.2% 高于文本 5.1%,汇点调用 387 次对 254 次。目标类型:输出型金丝雀目标 JL 全成功 35.7%,汇点型目标仅 2.5%,相差约 14 倍。攻击方法:fake_completion 最强,文本模式 JR 16.6%、JL 17.0%,远超 naive 基线的 5.5%/5.7%;obfuscation 在 JR 下均 13.6% 但 JL 仅 9.1%/8.8%,说明机械信号不等于语义顺从。通道:skills 两模式 JR 分别 14.3% 与 16.0%,load_skill 工具达 15.2%(JR)/13.7%(JL);hidden Unicode 文件模式 25.5%(116/455)而文本模式 0.0%。汇点共触发 641 次(4.4%),JL 判定错误 9 例(0.1%)。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| 间接提示注入·总体(14,560 次执行) | JR 全成功率 | 5.6%(819 次) | naive 未修改基线:文本 5.5% / 文件 5.9% | 最强攻击 fake_completion 在文本模式达 16.6%,约为基线 3 倍 |
| 间接提示注入·总体 | 广义影响率(全+部分) | JR 7.6% / JL 12.6% | 仅看全成功会低估至 5.6% | 语义裁判 JL 多捕捉约 5 个百分点的部分影响 |
| 输出型金丝雀目标(3 个) | JL 全成功率 | 35.7% | 汇点型目标(32 个)仅 2.5% | 控制模型输出比触发敏感动作容易约 14 倍 |
| hidden Unicode 通道 | JR 全成功率 | 25.5%(文件模式,116/455) | 文本模式 0.0% | 文件表示使该通道从不可行变为全场最强 |
| skills 通道 / load_skill 源工具 | JR 全成功率 | 16.0%(文件)/ 14.3%(文本);load_skill 15.2% | 总体均值 5.6% | 约为总体 3 倍,凸显技能供应链风险 |
局限与改进
作者承认的局限:结果绑定于本次配置——deepseek-v4-flash 单一模型后端、DSH 特定快照(commit 47f943859bef,2026-08-13)、特定 6 源 8 汇夹具;某攻击方法超过 naive 只说明'在该配置下该转换增加了暴露',不构成方法间的普适排序;汇点是本地夹具,只记录调用与参数,无法反映真实部署中授权层、审批层、沙箱的联合效果;JL 有 9 例判定错误(0.1%)且本身依赖 LLM。我自己的观察:其一,论文完全没有评估防御——BIPIA、StruQ、spotlighting 被提及但未对比,读者无法知道启用数据标记或 ToolGuard 策略后 25.5% 这类数字会降到多少;其二,每个通道-模式单元仅 455 次运行,低频事件的置信区间很宽,部分通道 1.3%–2.4% 的差异未必显著;其三,JR 与 JL 的分歧缺乏人工标注金标准来仲裁谁更接近真相;其四,只测了 DSH 一个框架,'真实运行时'方法论的完全价值需要跨框架对比来体现。
独立分析的弱点
第一,缺少防御对照实验:论文定位是测量暴露面而非比较缓解措施,但安全团队最关心'加了控制后风险降多少'。建议在同一矩阵上分别开启 ToolGuard 策略、源标签归一化、审批层做消融,量化每个控制点的边际收益,例如验证对 hidden Unicode 做归一化能否把 25.5% 压到接近 0。第二,单模型单框架:结论对其他模型(指令遵循倾向不同)和其他 harness 的外推性未知,应做跨模型/跨框架扫描,把'框架贡献'与'模型贡献'分离。第三,汇点判据偏机械:关键参数精确匹配可能低估真实世界中参数接近但不完全匹配时的部分危害,也可能高估(真实授权层本会拦截),可引入分级危害评分。第四,JL 自身可靠性存疑:LLM 裁判读长轨迹时也可能被注入内容影响,0.1% 错误率的报告缺乏置信区间,建议抽样人工标注并报告裁判间一致性(如 Cohen's $\kappa$)。第五,通道内 35 个目标分布不均,个别通道的数字可能被少数易攻击目标驱动,应报告按目标分层的结果。
未来方向
作者提出的方向:把 A.I.G 定位为持续红队与回归测试基础设施,在提示、工具、技能、解析器、模型供应商或授权策略每次变更后重跑选定的源到汇用例;推动 DSH 部署采纳三类控制——在模型边界保留源标签、信任级与载体类型并归一化隐藏 Unicode 与元数据;对邮件、外发 HTTP、shell 执行、文件变更、权限变更、资金操作等敏感汇点做独立于模型解释的授权(允许清单、参数级检查、数据分类、用户审批);把技能、MCP 集成、工具描述、工作流模板当作需所有权、来源、版本审查和权限限制的'类代码资产'。基于成果可延伸的方向:把 hidden Unicode 文件模式 25.5% 的结果发展为文件解析层攻击面的专门研究;用双裁判分歧构建'需人工复核'轨迹的优先级排序器;对被投毒的记忆/知识库后门(论文引用的相关工作 [2,11])与实时工具结果注入做统一威胁建模;以及与 InjecAgent、AgentDojo 任务集交叉验证,建立可跨框架比较的代理安全基准。
复现评估
复现条件较好。代码已开源在 https://github.com/Tencent/AI-Infra-Guard/tree/main/Research/deepseek-harness-security-assessment;被测框架版本明确(DSH commit 47f943859bef,2026-08-13);模型后端为经本地代理接入的 deepseek-v4-flash;数据矩阵构成完整公开(1,120 基础用例 = 16 通道 × 2 模式 × 35 目标,再乘 13 种方法 = 14,560 次执行);6 个源工具与 8 个汇点夹具均为本地实现,无外部副作用,伦理风险低。主要成本在 LLM 调用:14,560 次完整代理回合的推理费用加上 JR/JL 判定开销,估计需数万次 API 调用。难度中等:需自行部署 DSH TypeScript 运行时与 A.I.G 适配器,但论文对适配器机制(npx tsx 驱动、JSONL 会话事件、ctx.agentLoop.create()、agent.followup() 等)描述足够具体,有代理框架经验的两三人团队数天内可复现核心流程;不确定因素是 JL 裁判模型的具体型号与提示词未披露。
论文图表