在 DeepSeek Harness (DSH) 的开发中,工具调用往往涉及将参数或 URL 传递给外部服务。如果模型在执行过程中回显了特定数据或标记,这些信息可能会被泄露。dsh-canary 插件通过在上下文中种植一个唯一的标记,并拦截任何包含该标记回显的工具调用或 URL,解决了这一检测与阻断问题。
插件简介¶
这是 DeepSeek Harness 插件。插件由 jwilson411 维护,分类为 admin-security,许可证为 MIT。它专注于检测并拒绝任何回显种植的 canary 字符串的工具参数或 URL。
核心功能¶
该插件提供以下核心能力:
- 种植 canary 字符串:在模型可见的上下文中植入唯一标记。
- 检测回显:检测工具参数或 URL 是否包含该 canary 字符串。
- 拒绝调用:在工具执行前拦截并拒绝包含 canary 的调用。
- 记录 incident:当检测到回显时,记录 incident 日志。
- 注册工具:注册
canary_context和canary_status两个工具,用于查看种植状态和统计信息。 - 提供库 API:提供
plantCanary、wrapExecute、CanaryTripError等库级 API,供开发者直接调用。
安装与启用¶
安装插件需要使用官方提供的安装命令。该插件依赖特定版本的 DSH 工具包。
dsh plugin --profile default add github:jwilson411/dsh-canary
典型用法¶
开发者可以通过插件提供的库 API 来实现 canary 的种植与防护逻辑。
种植与包装执行¶
首先调用 plantCanary() 生成种植状态,然后使用 wrapExecute 包装工具的执行函数。在执行时捕获 CanaryTripError 以处理拦截事件。
import { plantCanary, wrapExecute, CanaryTripError } from 'dsh-canary'
const state = plantCanary()
const guarded = wrapExecute(tool.execute, state, { tool: tool.name })
try {
await guarded(argsFromTheModel, exec)
} catch (error) {
if (error instanceof CanaryTripError) {
// 错误处理:记录拦截事件,但不再传递 canary 值
log.warn({ code: error.code, where: error.where, tool: error.tool })
return
}
throw error
}
狭窄入口点¶
如果宿主拥有不同的调用点,可以使用 assertNoCanary 或 assertNoCanaryInUrl 进行检查。这两个函数在命中时会抛出异常,但不写入日志。
import { assertNoCanary, assertNoCanaryInUrl } from 'dsh-canary'
assertNoCanary(requestBody, state, { tool: 'http' }) // 检查参数
assertNoCanaryInUrl(candidate, state, { tool: 'fetch' }) // 检查 URL
适用场景与注意¶
适用场景¶
- 需要检测模型是否将特定标记回显到工具调用参数或 URL 中。
- 需要在工具执行前进行拦截,防止敏感信息或测试标记泄露。
注意事项¶
- 版本要求:该插件需要 DSH RC
0.1.1-rc.2版本。 - 错误代码:检测到回显时的错误代码始终为
'CANARY_TRIP'。 - 返回值安全:返回值(包括错误信息)中不包含 canary 值本身,仅包含前缀。
- 功能定位:
- 不是 prompt-injection 检测器。
- 不是红队产品。
- 不是分类器。
- 不是隐蔽控制。
- 不是数据丢失防护 (DLP)。
结语¶
dsh-canary 插件提供了一个具体的手段来验证模型是否在工具调用或 URL 中泄露了特定的上下文标记。通过严格的安装命令和库 API,开发者可以将其集成到现有的 DSH 工作流中,用于监控和阻断回显行为。