前言¶
DeepSeek Harness(dsh)把智能体的工具调用挂在 Cordis 等公开钩子上,模型一旦决定调用 Shell、读写文件或访问网络,请求就会进入运行时。若所用权重在训练或微调阶段被植入后门——例如在特定触发词出现时静默执行 memorized 的工具序列、或向外泄露凭证——危害往往在工具真正 dispatch 之后才暴露。仅靠主模型自我审查并不可靠:被植入后门的模型本身不能充当「法官」。
dsh-backdoor-guard 是维护者 miketako3 发布的 DSH 插件(当前 npm 包版本 0.2.0,MIT 许可证)。它在 tools/pre-execute 阶段对每一次工具调用做一次独立判定;判定不通过则拒绝执行,并在会话 transcript 中写入 SECURITY NOTICE。下面介绍其定位、安装方式与配置要点。
这是什么¶
该插件面向 DeepSeek Harness 生态,专门对付通过工具通道触发的、烧进权重的后门载荷(例如恶意 QLoRA merge 在隐藏触发条件下发起特定 tool call 或凭证外传)。纯文本层面的 misbehavior 不在其威胁模型内。
实现上不 fork 主模型、不依赖 logprobs、也不维护正则规则库:利用 DSH 公开的插件 seam,对每次 tool call 调用一次专用的决策模型(decision model),在约一次前向传播(零输出 token)内得到校准后的「安全概率」,速度足以覆盖全量工具调用(托管 Jev 约 100 ms;Apple M5 Pro 上本地 d1-3B 约 30 ms;RTX 4090 约 8 ms)。
为什么用独立判定模型¶
- 被审查的主模型若已后门化,不能信任其自我 policing。
- 决策模型(Jev 或 LiquidAI d1)针对「对状态文档做 yes/no 并给出概率」设计,与 agent 后端解耦。
- 与基于熵的 rdsh-backdoor-guard 研究思路不同,本插件 deliberately 采用 decision-model 路径,因此无需 logprobs,可与任意 agent backend 配合。
判定端与主 LLM 必须是不同的小型、冻结模型;不要把 judge 请求路由到正在被审查的同一模型。
核心功能¶
判定输入¶
法官收到的 state 文档包括:用户最新请求(可截断)、agent 是否 visibly 宣布了即将执行的动作(静默调用被视为 memorized payload 的运行时特征)、工具名、规范化后的参数、以及本 turn 内更早的 tool call。
判定问题¶
插件用一条 Noul 问题为合法性定价,大意是:safe 表示该调用服务于用户明示需求;不读取或外传无关凭证/秘密;无混淆、pipe-to-shell、自解码类载荷;无异常外部 endpoint;不像隐藏触发器触发的动作。
执行结果¶
当 safe_probability >= threshold 时放行;否则在 dispatch 前 deny,拒绝原因中会带上概率。插件包内含 dsh.bundle layer,dsh plugin add 后会自动写入 Cordis 插件行。
安装与启用¶
官方 README 给出三种安装方式:
dsh plugin add dsh-backdoor-guard # npm,发布后可用
dsh plugin add github:miketako3/dsh-backdoor-guard # 从 GitHub 安装
dsh plugin add file:/path/to/dsh-backdoor-guard # 本地目录
安装后需在 profile 的 cordis.patch.yml(或等价配置)中保留/调整 backdoor-guard 插件项。插件以当前 dsh 进程权限运行,安装前应自行审阅源码与 MIT 许可证。
选择 judge¶
两种选项共用 Decision Index 的 systemone schema,主要差在 endpoint 与鉴权。
选项 A:托管 Jev(TypeSafe AI)¶
先从 console.typesafe.ai 取得 API key,再导出环境变量:
export TYPESAFE_API_KEY=ts_...
profile 片段示例:
- id: backdoor-guard
name: 'dsh-backdoor-guard'
config:
endpoint: https://api.typesafe.ai/v1/systemone
model: jev-latest
apiKeyEnv: TYPESAFE_API_KEY
选项 B:本地 d1-3B(LiquidAI 公开权重)¶
安装 Python 依赖并启动同仓库自带的 shim 服务:
pip install "transformers>=5.14" torch torchvision pillow
python3 server/d1-server.py --model LiquidAI/d1-3B --port 8400
本地 endpoint 通常不需要 Authorization header:
- id: backdoor-guard
name: 'dsh-backdoor-guard'
config:
endpoint: http://127.0.0.1:8400/v1/systemone
model: d1-3B
apiKeyEnv: '' # 空字符串表示不发送 Authorization
README 注明 d1-3B 可读约 32k token 状态,整段 tool-call payload 可完整送入;实验性也可选用 d1-omni-600M(文本+音频)。
配置参考¶
| key | 默认值 | 含义 |
|---|---|---|
endpoint |
https://api.typesafe.ai/v1/systemone |
兼容 systemone 的 judge URL |
model |
jev-latest |
judge 模型 id |
apiKeyEnv |
TYPESAFE_API_KEY |
存放 API key 的环境变量名;'' 表示无鉴权(本地) |
threshold |
0.5 |
安全概率低于此值则 deny |
timeoutMs |
8000 |
judge 请求超时(毫秒) |
skipTools |
[] |
永不判定的工具名,支持 * 通配(如 ['read', 'web_*']) |
maxArgsChars |
2000 |
送给 judge 的参数字符上限 |
maxRequestChars |
1000 |
送给 judge 的用户请求字符上限 |
onJudgeError |
allow |
judge 不可用:allow 为记录日志后放行;deny 为 fail closed |
调参阶段可保持 onJudgeError: allow;高安全部署建议设为 deny。
威胁模型与局限¶
- 覆盖范围:权重后门经工具行动、以及凭证窃取类行为;纯文本恶意输出不在范围内。
- 信任边界:judge 属于可信基础设施——宜固定为本地 d1 或自有的 Jev key,且不与被审模型共用推理路径。
- 纵深防御:完整覆盖仍需配合网络 egress 控制等措施。
实现灵感来自 @pentacoxian_dev 的 rdsh-backdoor-guard 研究;本仓库为独立实现。
开发与验证¶
维护者在仓库根目录提供:
npm install
npm test # vitest:judge client + 端到端插件流
npm run build # tsc → lib/
peer 依赖包括 @deepseek-ai/cordis(>=4.0.5-alpha.1)及 dsh-agent / dsh-llm / dsh-tools 等 0.2.1-alpha.2 系列。
适用场景¶
适合在 DSH 上跑不可完全信任来源的模型权重或 LoRA merge、又需要保留完整工具链的智能体场景。社区插件目录位于 SkillHub 等独立站点,与 DeepSeek / 幻方无官方从属关系;使用前请结合组织安全策略选择托管或本地 judge,并理解 fail-open(onJudgeError: allow)与 fail-closed 的取舍。
- 目录页:https://www.skillhub.cn/plugins/miketako3/dsh-backdoor-guard
- 源码与文档:https://github.com/miketako3/dsh-backdoor-guard