在 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 工作流中,用於監控和阻斷回顯行爲。