dsh-backdoor-guard:在工具执行前拦截权重后门

前言

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)。

为什么用独立判定模型

  1. 被审查的主模型若已后门化,不能信任其自我 policing。
  2. 决策模型(Jev 或 LiquidAI d1)针对「对状态文档做 yes/no 并给出概率」设计,与 agent 后端解耦。
  3. 与基于熵的 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye