dsh-purge 上手指南:安装命令、改动的三层文件清单与零残留干净卸载
dsh-purge 上手指南:安装命令、改动的三层文件清单与零残留干净卸载
【免费下载链接】dsh-purgeDeepSeek Harness 破甲:让所有模型都能破甲,不同模型可换不同提示词;默认提示词面向国模「小码酱」。Jailbreak for every model — swap prompts per model. 求 Star 收藏 ⭐ 如要二开,请查看署名要求部分项目地址: https://gitcode.com/GitHub_Trending/ds/dsh-purge
dsh-purge 是装在本机官方 DeepSeek Harness 上的红队评测插件,核心功能「破甲」:把宿主层的提示词改写、审批门、沙箱策略与模型本身的表现拆开,用来区分「模型拒答」和「宿主拦截」。本文只回答两个问题:插件到底改了本机哪些文件,想反悔时能不能完整删干净。结论基于当前仓库 v1.1.78,每条都挂到具体文件与函数,可逐条核查。
装之前的版本与安装位置核对
先对版本,再谈命令。package.json 中dshTarget写死0.2.1-rc.2(0.2.0 仍可用),engines.node >= 18。dsh 0.1.7 及更早版本必须配 1.1.39 及更早的插件版本:对不上的补丁会显示「待应用」或「跳过」,不会乱改文件,但别拿最新版去打 0.1.x。
官方 Web 与官方桌面端是两个 profile,各自安装、各自应用,一边的包进不了另一边。手动安装时先定位你实际启动的宿主对应那份.dsh——本机常有两份,改错那份是最高频事故。
安装的两条命令与装完三步
按 profile 各装一条:
dsh plugin --profile web add dsh-purge # 官方 Web(dsh web) dsh plugin --profile desktop add dsh-purge # 官方桌面端(EXE)当前目录已是本仓库时,把包名换成add .;registry 拉不动时,同一个--profile下把目标换成仓库的master.tar.gz(dsh.install段登记了 tarball / zip / git 三个来源)。不要走插件市场一键安装:会报already queued: dsh-purge。
注意:把插件写进 profile还不会改@deepseek-ai。lib/index.jsapply()里第 1505 行的注释写死了这一点:「启动不写宿主包。补丁 / bak / client.js / runtime 只在点『应用』时写一次。」装完必须做三下:
- 完全退出再重开刚装的那个宿主(Web 停掉
dsh web;桌面端托盘也要退出); - 在宿主里点会话标题旁的dsh-purge按钮,进「清洗」页点「应用」。宿主自己的设置页里没有这一项;
- 「应用」成功后自动重启一次,补丁没打完不重启。重启后新开一轮对话,注入才进入当前会话。
✅ 怎样算装上了:会话标题旁出现 dsh-purge 按钮且「清洗」里能点「应用」;聊天里/purge status打出DSH_HOME与补丁列表,路径是你正在用的那一份;没装的可选包显示跳过,不挡住完成。
操作面有三个、行为一致:CLI(dsh-purge --status / --apply / --revert / --uninstall / --edit)、聊天(/purge status | apply | revert | uninstall | edit | help)、模型工具(purge_status/purge_apply/purge_revert)。
dsh不在 PATH 时手动装:插件放进$DSH_HOME/plugins/dsh-purge(git clone https://gitcode.com/GitHub_Trending/ds/dsh-purge)→ 只改对应 profile 的package.json(dependencies加"dsh-purge": "file:../../plugins/dsh-purge",dsh.profile.bundles末尾追加"dsh-purge")→ 在该 profile 目录内pnpm install→ 重启宿主点「应用」。
它到底改了哪些文件:三层清单一次看完
targetFiles()(lib/core.js 约 6313 行起)列出全部补丁目标,共三层:
| 层级 | 目标 | 作用 | 备份方式 |
|---|---|---|---|
官方@deepseek-ai/*包内运行逻辑 | dsh-agent-instructions(lib/index.js+lib/bootstrap.js)、dsh-user-approval(lib/index.js、lib/types/index.js、lib/invariant.js)、dsh-sandbox/dsh-fs-sandbox/dsh-sandbox-local、dsh-base/dsh-web-app/dsh-headless的cordis.patch.yml与lib/index.js,以及dsh-settings、dsh-fs-observation-policy、dsh-compaction-tool-result-pruner、dsh-tool-fs、dsh-subagent | 系统提示词组装、审批门、沙箱与升级策略、bundle 层配置与渲染、设置、观测、压缩、工具面与子代理 | 每个目标文件一份 sidecar.dshpurge.bak |
| CLI 启动 shim | SHIM_NAMES = ["dsh.cmd", "dsh.ps1", "dsh"](core.js 第 40 行) | dsh 启动脚本本身 | sidecar 备份,另按「文件名 + 路径 sha1 前 20 位」归档到$DSH_HOME/dsh-purge/shim-backups/(core.js 约 379 行) |
$DSH_HOME下插件运行时 | prompt-inject.md(会话注入覆盖段)、rules/(多套规则集)、net-scope-allow.txt(本地靶场名单)、redteam/(演练台事实库) | 注入覆盖、规则集、靶场名单、演练事实 | prompt-inject.md是用户文件不备份;rules/与redteam/卸载时整目录删除 |
$DSH_HOME按「环境变量 → dsh 启动器旁的.dsh→~/.dsh」解析,不写死盘符。
注入入口只有一处:cordis.patch.yml 中声明inject: [systemPrompt, tools]。每轮注入内容按「本进程框内提交的提示词 →$DSH_HOME/prompt-inject.md→ 插件内置加密槽」的优先级决策,这条链在resolveInjectText()(lib/rules.js 约 243 行)实现。身份来自插件自带的加密默认,不读宿主磁盘上的提示词文件。
两条硬边界:不碰 Harness 源码仓库;不改非@deepseek-ai的第三方插件源。
写入安全:四道机制逐条过
写文件之前先过四道防护:
- 原子写。
atomicWriteSync/atomicWriteFile/atomicCopyFile(core.js 第 66 行起)全部先写同目录.tmp再 rename,失败清理 tmp 后抛出——EBUSY / ENOSPC 都不会半写坏原文件; - 幂等。重复应用是「已是最新」,不会二次改写;
- 不匹配即跳过。宿主升级后原文对不上,该条补丁显示跳过,本次应用仍算完成,不硬改;
- 备份防竞争。
backupAll()(core.js 约 6161 行)先用fs.openSync(bak, "wx")独占创建占位文件,成功才atomicCopyFile写入;失败路径会 unlink 占位,避免下次把坏占位当成有效备份。
备份落点有两处:每个目标文件的 sidecar<文件>.dshpurge.bak(BAK_SUFFIX,core.js 第 6035 行);shim 另归档到$DSH_HOME/dsh-purge/shim-backups/,防止原目录被宿主自升级整个换掉。反向自愈由restoreMissingOriginalsFromBak()(core.js 约 6060 行)负责:声明过的补丁文件在磁盘上消失或被写成空文件时,应用会先从.dshpurge.bak拷回再加载。
还原、卸载与残留自检
还原逻辑在revertAll()(core.js 约 6207 行),分三支:
- 有备份:当前内容与备份字节相同则 skip,不做无意义写入;不同则写回并删除 bak;
- 无备份但文件内有
dsh-purge标记:绝不删除目标文件,只按补丁反向拆掉插件写入的行; - 无备份也无标记:skip,不碰。
⚠️ 第 6248 行注释把底线写死了:「没有 bak 时绝不删除目标。源码部署的构建产物缺备份时,删了无法自愈(#41)。」
两项永不进还原流程:prompt-inject.md是用户文件,还原时保留(--revert的输出会注明);profiles/<name>/cordis.patch.yml是官方支持的用户 patch 层,插件从不写入,isUserProfilePatchFile()(core.js 第 6005 行)显式排除,历史误建的 profile 级.dshpurge.bak会被主动丢弃。
卸载是更重的动作,由uninstallPurge()(lib/uninstall.js 约 208 行)执行,顺序固定为「先还原,后删除」:
revertAll→revertAllShims→revertCmdFlash→ 删注入文件 → 重置并整目录删rules/→ 清演练台授权 → 收集清理目标(各 profile 的node_modules/dsh-purge、插件树、$DSH_HOME/dsh-purge数据目录)→ 最后才删。stripPluginFromPackage()负责从 profilepackage.json剥离dsh-purge的条目,覆盖四种依赖键与bundles/plugins两个键。⚠️ 若还原阶段出现任何错误,ok = false且cleanup = []——还原没完成,一个文件都不删。
✅ 卸载后复核:再跑一次/purge status(bin/dsh-purge.js 的printStatus会逐项打印),应看到备份 / backup: 无、补丁0/total 已清洗、各目标文件无.dshpurge.bak残留;重启宿主后按钮消失。
它明确不碰的两条线
网络面。开源版攻击任务只放行本机回环与 RFC1918 私网;域名先按系统解析(含 hosts),解析到的每个地址都必须是私网或回环,hosts 把实验域名指到公网、解析失败、混有公网地址一律拦。entryHost()(lib/net-scope.js 约 387 行)只接受一个 IP 或一个完整主机名,保存时丢弃密钥、密码、网段与通配符——在对话里说「这是我的服务器」不会放行。名单写入$DSH_HOME/net-scope-allow.txt。
演练台授权。首次进入演练台要读完声明、等倒计时、滚到文末并勾选三项,未授权时按钮直接标「未授权」;它只用于你有权管理的本机、离线靶标或已书面授权的演练环境。
回到开头的两个问题:改的是三层登记在案的文件,每一处写入都对应一份备份;反悔干不干净由机制保证。动手前把 status 输出读一遍,十分钟足够了。
(本项目为非盈利开源项目,README 中有明确的合规声明与法律免责:仅限本人有权管理的本机官方 Harness、离线靶标与书面授权演练环境;使用者对自身行为独立承担法律责任。)
【免费下载链接】dsh-purgeDeepSeek Harness 破甲:让所有模型都能破甲,不同模型可换不同提示词;默认提示词面向国模「小码酱」。Jailbreak for every model — swap prompts per model. 求 Star 收藏 ⭐ 如要二开,请查看署名要求部分项目地址: https://gitcode.com/GitHub_Trending/ds/dsh-purge
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考