ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

dsh-purge:5 步装好 DSH 破甲,完整卸载一步到位

dsh-purge:5 步装好 DSH 破甲,完整卸载一步到位

dsh-purge:5 步装好 DSH 破甲,完整卸载一步到位

【免费下载链接】dsh-purgeDeepSeek Harness 破甲:让所有模型都能破甲,不同模型可换不同提示词;默认提示词面向国模「小码酱」。Jailbreak for every model — swap prompts per model. 求 Star 收藏 ⭐ 如要二开,请查看署名要求部分项目地址: https://gitcode.com/GitHub_Trending/ds/dsh-purge

dsh-purge是装在本机官方DeepSeek Harness(DSH)上的红队评测插件,核心动作叫「破甲」:把宿主层的提示词改写、审批门与沙箱策略同模型本身的表现拆开,让你分辨一句回答到底是「模型拒答」还是「宿主拦截」——这个拆开判源的动作,本文称之为分诊。它不是公网扫描器,也不面向第三方站点或系统:适用面只有你有权管理的本机官方 Harness、离线靶标和书面授权的演练环境。全文回答四件事:它到底改了哪些文件、哪一步最容易装错、装好怎么验证、反悔时怎样完整卸掉。

改动面清点:三层写入、两处不碰

改动面在源码里显式登记,全部补丁目标由 lib/core.js 的targetFiles()(约 6313 行)列成清单,共三层:

层改动对象登记位置
官方@deepseek-ai/*包运行逻辑(主体)系统提示词组装(dsh-agent-instructions)、审批门(dsh-user-approval)、沙箱与升级策略(dsh-sandbox、dsh-fs-sandbox等)、dsh-base/dsh-web-app/dsh-headless的 bundle 配置(cordis.patch.yml与lib/index.js),以及设置、观测、压缩、工具面、子代理等包targetFiles()中agent-instructions、user-approval、web-app等键
CLI 启动 shimdsh.cmd、dsh.ps1、dsh三个启动脚本本身SHIM_NAMES,lib/core.js第 40 行
$DSH_HOME插件运行时文件prompt-inject.md(会话注入覆盖段)、rules/(多套规则集)、net-scope-allow.txt(本地靶场名单)、redteam/(演练台事实库)按「DSH_HOME环境变量 → dsh 启动器旁的.dsh→~/.dsh」解析,不写死盘符

三处「不碰」是硬边界:

  • 不碰 Harness 源码仓库,改动止于已安装包的磁盘文件;
  • 不改非@deepseek-ai的第三方插件源;
  • 不写profiles/<name>/cordis.patch.yml这个官方支持的用户 patch 层——isUserProfilePatchFile()(lib/core.js第 6005 行)把它从备份与还原流程中显式排除,避免版本自愈盖掉你后加的 insert。

注入入口只有一处:cordis.patch.yml 中声明inject: [systemPrompt, tools]。每轮注入内容的优先级是「本进程框内提交的提示词 →$DSH_HOME/prompt-inject.md→ 插件内置加密槽」,这条链由 lib/rules.js 的resolveInjectText()(第 243 行)实现;身份默认值来自插件自带的加密内容,不读宿主磁盘上的提示词文件。

前置核对:先对版本兼容表

宿主 DSH 版本对应 dsh-purge说明
0.2.1-rc.2(官方桌面 / 官方dsh web)1.1.78(当前版)package.json里dshTarget固定指向这一档
0.2.0-rc.21.1.40 或更新同一安装流程
0.1.7(含 rc.1 / rc.2)1.1.39 或更早需从历史版本里选对应标签

两个配套要求:engines.node要求Node >= 18;官方 Web 与官方桌面端是两个 profile,各自安装、各自应用,一边的包进不了另一边,别在 A 宿主里替 B 宿主点「应用」。

版本对不上会发生什么:该条补丁停在「待应用」或「跳过」,不会动任何文件,本次应用仍算完成。宿主升级后出现跳过条属预期,重跑一次应用,跳过的条目会在新版原文上重新匹配。

标准安装路径:从 clone 到应用五步

⚠️ 两条弯路先绕开:走「插件市场」一键安装会报already queued: dsh-purge,命令永远不执行;dsh-purge不在 npm registry,别pnpm add dsh-purge。

  1. clone 仓库并进入目录:
git clone https://gitcode.com/GitHub_Trending/ds/dsh-purge cd dsh-purge
  1. 把包名.指向当前目录,按你实际打开的那一端选 profile:
dsh plugin --profile web add . # 官方 Web(dsh web) dsh plugin --profile desktop add . # 官方桌面端(EXE)

完成后应看到:对应 profile 的node_modules/dsh-purge/package.json存在,且该 profile 的dsh.profile.bundles里出现"dsh-purge"。此时任何@deepseek-ai文件都还没被写过——lib/index.js第 1505 行的注释说得很直白:「启动不写宿主包。补丁 / bak / client.js / runtime 只在点『应用』时写一次。」

  1. 完全退出再重开刚装的那个宿主:Web 停掉dsh web再启动;桌面端托盘图标也要退出后重开 exe。完成后应看到:新进程加载了插件包。

  2. 点会话标题旁的dsh-purge按钮,进「清洗」页点应用。宿主自己的设置页里没有这一项。完成后应看到:应用成功后自动重启一次;补丁没打完就不会重启。

  1. 新开一轮对话。完成后应看到:注入进入当前会话,聊天里/purge status能打出各补丁状态。

三个操作面行为一致,任选其一:CLI(dsh-purge --status / --apply / --revert / --uninstall / --edit)、聊天(/purge status | apply | revert | uninstall | edit | help)、模型工具(purge_status/purge_apply/purge_revert)。

手动兜底路径:dsh 不在 PATH 时五步走

⚠️ 全程只动你实际启动的那个宿主对应的那份 profile,别碰另一份。

  1. 定位真正在用的$DSH_HOME:目录名.dsh(官方 EXE 偶见dsh-home),内有profiles,且至少一个profiles/<name>/package.json。最高频事故就出在这一步——本机常有两份.dsh,改错那份后面全白干。用profiles/web/package.json里"name": "dsh-profile-web"(桌面是dsh-profile-desktop)确认哪份归你用。
  2. 放插件树:
git clone https://gitcode.com/GitHub_Trending/ds/dsh-purge "$DSH_HOME/plugins/dsh-purge"

文件夹名必须叫dsh-purge;已有 clone 就复制整棵目录树,不是挑几个.js。 3.只改对应 profile 的package.json(先备份),只加两处:dependencies加"dsh-purge": "file:../../plugins/dsh-purge"(保持file:相对路径,别换绝对路径);dsh.profile.bundles末尾追加"dsh-purge"(已存在就跳过)。JSON 保持合法:新条目前加逗号,最后一条后不加。 4.只在该 profile 目录内pnpm install,不要跑在仓库根或$DSH_HOME。完成后应看到:profiles/<name>/node_modules/dsh-purge/package.json存在;报Could not resolve就查file:路径。 5. 完全退出宿主、重开、按标准路径第 4 步点「应用」。完成后应看到:按钮出现在会话标题旁;没出现,大概率改了另一份.dsh,回第 1 步。

装完验收:四条判据逐条核对

  • ✅ 会话标题旁出现dsh-purge按钮,「清洗」页能点「应用」。不成立时:在对应 profile 跑dsh --dump-config(桌面端加--profile desktop),确认有id: dsh-purge的用户层 insert;没有就再跑一次node node_modules/dsh-purge/scripts/ensure-profile-bundle.mjs,然后完全重启宿主。开头的几条entry "redteam-store" not found是旧红队包的痕迹,可忽略。
  • ✅ 聊天里/purge status打出DSH_HOME与补丁列表,路径是你正在用的那份 home。不成立时:装错 profile 了,按手动路径从第 1 步重做定位。
  • ✅ 未安装的可选包显示「跳过」,不阻塞应用完成。不成立时:多为版本错档,按兼容表换对应版本再点应用。
  • ✅ 「应用」成功后宿主自动重启一次,新开对话注入生效。不成立时:补丁未打完——此时不会重启,先核对版本表,修正后重新点应用。

还原与卸载:干净退出的底气从哪来

分诊能干净拆掉,靠的是写入前四道闸门,都在lib/core.js:

  • 原子写。atomicWriteSync/atomicWriteFile/atomicCopyFile(第 66 行起)先写同目录.tmp再 rename,失败清理 tmp 后抛出,EBUSY / ENOSPC 都不会留下半写的原文件。
  • 幂等。重复应用是「已是最新」,不二次改写。
  • 不匹配即跳过。原文对不上就跳过该条,本次应用仍算完成,不硬改。
  • 备份防竞争。backupAll()(约 6161 行)先用wx标志独占创建占位文件,成功才写内容;失败删掉占位,避免下次把坏占位当成有效备份。

备份落点两处:每个目标文件旁的 sidecar<文件>.dshpurge.bak(BAK_SUFFIX,第 6035 行);shim 另按「文件名 + 路径 sha1 前 20 位」归档到$DSH_HOME/dsh-purge/shim-backups/(约 376 行),防原目录被宿主自升级整个换掉。反向自愈由restoreMissingOriginalsFromBak()(约 6060 行)负责:声明过的补丁文件在磁盘上消失或被写成空文件时,应用会先从.dshpurge.bak拷回再加载。

还原走revertAll()(约 6207 行)的三支分支:

  1. 有备份:当前内容与备份字节相同则跳过,不做无意义写入;不同则写回并删除备份;
  2. 无备份:⚠️ 第 6248 行注释把底线写死——没有 bak 时绝不删除目标。源码部署的构建产物缺备份时删了无法自愈(#41),只跳过、不碰。shim 例外:无备份时拆掉插件写入的 shim 行;
  3. 用户文件永不进还原流程:prompt-inject.md是用户文件,还原时保留;profiles/<name>/cordis.patch.yml是官方支持的用户 patch 层,插件从不写入,历史误建的 profile 级备份会被主动丢弃。

卸载是更重的动作,由 lib/uninstall.js 的uninstallPurge()(第 208 行)执行,顺序固定:还原补丁 → 还原 shim → 还原命令 flash → 删注入文件 → 重置并整目录删rules/→ 清演练台授权 → 从各 profilepackage.json剥离dsh-purge条目(stripPluginFromPackage(),第 50 行,覆盖dependencies等依赖键与bundles/plugins)→ 最后才删各 profile 的node_modules/dsh-purge、插件树与$DSH_HOME/dsh-purge数据目录。⚠️ 与还原不同:卸载会删掉prompt-inject.md注入文件(removeOverride())。还原阶段只要出现任何错误,ok = false且cleanup = []——还原没完成,一个文件都不删。

入口三选一:

dsh-purge --uninstall # 或聊天里 /purge uninstall # 或 UI:清洗 → 卸载,弹窗确认

卸载同时会把「智能体预设」里指向红队模式的默认值改回standard,避免宿主因找不到预设而无法新建会话。

卸载后复核:再跑一次/purge status(bin/dsh-purge.js的printStatus逐项打印),各目标文件无.dshpurge.bak残留、补丁计数归零;重启宿主后 dsh-purge 按钮消失。两项都成立才算删干净。

边界与高频坑:网络面、授权与正解

网络面。开源版攻击任务默认拒绝,只放行本机回环与 RFC1918 私网。域名先按系统解析(含 hosts),解析到的每个地址都必须是私网或回环:hosts 把实验域名指到公网、解析失败、混有公网地址,一律拦。entryHost()(lib/net-scope.js第 387 行)只接受一行一个 IP 或一个完整主机名,密钥、密码、网段与通配符直接拒收——在对话里说「这是我的服务器」不会放行。名单写入$DSH_HOME/net-scope-allow.txt。

演练台授权。首次进入演练台要读完声明、等倒计时、滚到文末并勾选三项;未授权时页签直接标「Unauthorized」。它只用于你有权管理的本机、离线靶标或已有书面授权的演练环境;开源版不下发技能库和知识库。

高频坑与正解。

坑后果正解
装完插件不做「退出重开 + 点应用 + 新会话」补丁不生效,注入全程不工作标准路径后三下缺一不可
在 A 宿主里替 B 宿主点「应用」改的是另一份 profile,本端按钮依旧缺失按实际打开的宿主选 profile,互不代劳
版本错档仍硬装补丁停在「待应用 / 跳过」按兼容表换对应版本再点应用
pnpm 11 默认拦安装脚本(ERR_PNPM_IGNORED_BUILDS)或加了--ignore-scriptsbundles 没写入,宿主不加载插件、没有按钮补跑node node_modules/dsh-purge/scripts/ensure-profile-bundle.mjs后完全重启
宿主升级后出现跳过条属预期,该条原文与新版对不上重跑一次应用,跳过条目在新版原文上重新匹配
极简 / PTC 与标准模式行为不一致preset 拦截句没洗净,同一任务一个能跑一个被拦升到 1.1.61+,完全退出宿主 → 应用 → 自动重启 → 新开对话再试

回到开头:dsh-purge 的改动面就是三层登记在案的文件——@deepseek-ai/*包内运行逻辑、dsh 启动 shim、$DSH_HOME下的插件运行时文件,每处写入都对应一份.dshpurge.bak或归档备份;分诊拆得干不干净,由机制兜底:原子写不留半成品,还原三支分支不碰用户文件,「无备份绝不删目标」写死在注释里,卸载在还原完成之前不动任何删除,/purge status可逐项复核。验收与卸载复核两节读完再动手,半小时内足够。

合规声明:本项目为非盈利开源项目(Apache-2.0),仅供使用者在本人有权管理的本机官方 Harness、离线靶标与书面授权的演练环境中做红队评测与研究,仓库内不含面向公网或第三方系统的攻击载荷;使用者对自身的一切行为及输入输出后果独立承担法律责任。

【免费下载链接】dsh-purgeDeepSeek Harness 破甲:让所有模型都能破甲,不同模型可换不同提示词;默认提示词面向国模「小码酱」。Jailbreak for every model — swap prompts per model. 求 Star 收藏 ⭐ 如要二开,请查看署名要求部分项目地址: https://gitcode.com/GitHub_Trending/ds/dsh-purge

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进