Vai al contenuto principale
Y

dsh-security-judge

youchen-yc/dsh-security-judge

Code security defense review judge for DeepSeek Harness: detects sessions that are writing code, reviews them against the Code Security Defense Architecture Rules, recommends which security architectures the program needs (one or several), checks conflicts between them, teaches the session AI after repeated failures, and teaches the session AI after repeated failures; once you grant it review authority in its panel, it gates task completion until the review passes (without that authorization it only observes).

Installazione

dsh plugin --profile web add github:youchen-yc/dsh-security-judge

README

代码安全防御规则评审判官(dsh-security-judge)

审核正在写代码的会话有没有按《代码安全防御架构规则》v1.0(强制性规则)做代码安全防御、 加入了哪些代码安全防御架构、这些架构之间会不会冲突;用户授权后,未通过评审的代码任务不能算完成。

它做什么

  1. 自动识别所有活跃会话,判断哪些会话正在做代码(写入/编辑代码文件、构建/测试命令、项目特征), 非代码会话不评审。
  2. 推荐代码安全防御架构:按技术栈(Android / 服务端 / Web / 桌面 / IoT / AI)与项目特征, 给出这个程序需要几种核心架构(1 种 / 2 种 / 多种)、分别属于哪个层面、为什么需要。
  3. 检查架构冲突:对推荐架构、会话声明的架构、代码里实际出现的反模式做两两冲突检查 (硬冲突 / 重叠 / 张力),每条都带处理建议;未登记处理结论会阻断评审。
  4. 规则评审:按 A–J 十组 72 条规则(L1 强制 54 条、L2 基线 12 条、L3 建议 6 条)评审:
    • 代码类规则用自动检查扫描本会话写入/编辑过的代码文本,命中即违规;
    • 文件类规则检查本会话是否改到对应文件(锁文件、SBOM、混淆配置、签名材料等);
    • 其余规则要求会话 AI 在 security_judge 工具里逐条提交证据;
    • L1 不可豁免;L2/L3 由用户在面板登记豁免理由(180 天有效)。
    • J 组(分发与可迁移性):检测到要产出安装包时强制做真实分发自检——包清单/入口/资源/bundle patch/绝对路径/依赖可安装性, 保证评审合格的安装包发给别人也装得上、用得了(详见 lib/dist.js)。
    • 计数口径:《代码安全防御架构规则》v1.0(2026-10-28)共 67 条安全规则(A–I 九组),本插件 A–I 与之对齐; J 组 5 条是交付规则,不计入 67 条安全规则总数——安全评审按 67 条计,交付评审另计 5 条(共 72 条)。
  5. 提醒与门禁(需要用户授权):
    • 首次检测到写代码时向会话注入评审提醒;
    • 评审未通过 = 不合格,不合格必须重做,默认合格为止:每个回合收尾时,如果代码会话不合格, 就拦截「算完成」,要求继续修复/补齐架构/提交评审,直到 verdict=pass(合格);
    • 默不设重做次数上限(maxEnforcePerSession=0);用户可自行设保护阈值,或随时在面板 「暂停强制重做」(暂停后结论仍是不合格,只是暂停自动催办)。
  6. Web 面板:侧栏「代码安全评审判官」入口,展示授权状态、所有会话、推荐架构与「需要几种」、 架构冲突、规则进度、失败/缺失项、规则目录、架构目录、冲突矩阵与设置。

权限边界(底层逻辑,不可修改)

  • 本插件权限低于用户最高权限,只用于代码安全防御规则与架构的评审。
  • 可以:读取/汇总会话里已经产生的代码与工具痕迹;授权后向代码会话注入评审提醒、拦截未通过评审的代码任务。
  • 不能:修改代码、修改配置、代替用户做决定、读取与代码安全防御无关的内容。
  • 授权必须由用户给:未授权时插件只读观察,不注入、不拦截。授权入口在面板的「授权」卡, 需要用户两次确认;插件自己不能授权自己。

安装

1. 插件市场(推荐)

DSH Plugins → Discover 搜索「代码安全防御规则评审判官」或 dsh-security-judge,一键安装。 条目数据:data/plugins/youchen-yc__dsh-security-judge.yml(awesome-dsh-plugin 仓库)。

2. GitHub Release 预构建包

从 Releases 下载 dsh-security-judge-1.5.3.tgz,在 DSH 里用 plugin_manager 的 install_bundle 指向该 tarball。

3. 从 GitHub / Gitee 源码

git clone https://github.com/youchen-yc/dsh-security-judge
git clone https://gitee.com/youchen-yc/dsh-security-judge    # Gitee 镜像
plugin_manager install_bundle  target: <克隆目录的绝对路径>

4. npm

npm 上最新版本为 1.5.3(https://www.npmjs.com/package/dsh-security-judge);1.6.0 需重新授权 npm token 后发布。

plugin_manager install_bundle  target: dsh-security-judge

5. 本地目录

plugin_manager install_bundle  target: F:\DSH1.0\security-judge

安装后侧栏出现「代码安全评审判官」,插件列表里出现「代码安全防御规则评审判官」。

使用

会话内口令:检查审核评审该会话

在任意已有会话里对 AI 说:

检查审核评审该会话

评审判官会自动受理(也识别「评审这个会话的代码」「代码安全防御评审」「review this session」等说法):

  • 回看该会话最多 2000 条历史事件(超过 24 小时的旧代码工作也会找回来),把该会话做的软件 / 插件 / 代码纳入评审;
  • 面板对应会话显示「用户已要求评审」;已授权时会向该会话注入受理通知,未授权时只读受理、不注入;
  • 不合格就要求该会话按规则重做,直到合格;确实没有代码工作时如实提示不涉及。

面板里每个会话的「评审该会话」按钮走同一套受理逻辑。

  1. 打开面板 → 「授权」卡 → 请求用户授权 → 确认授权。
  2. 在设置里选模式:
    • advisory 只提示:只记录评审结论,不打断;
    • remind 提醒:不合格时向代码会话注入提醒;
    • block 阻断(默认):不合格的代码任务不能算完成,会一直要求重做到合格(需要授权)。 重做上限默认 0 = 合格为止;如担心死循环可设一个阈值,或点会话里的「暂停强制重做」。
  3. 会话 AI 通过 security_judge 工具自检与提交:
    • action=status:本会话的代码识别、推荐架构、冲突、评审状态;
    • action=checklist:适用规则逐条状态;
    • action=architectures:这个程序需要几种架构、有哪些冲突;
    • action=submit:提交证据 { architectures?, rules: { "A-02": { verdict:"pass", evidence:"…" } }, notes? };
    • action=conflict-ack:登记架构冲突处理结论;
    • action=authority:查看/请求用户授权。

评审结论怎么算

  • 通过:范围内每条 L1 都自动通过或带证据通过;L2 全部满足或已豁免;所有架构冲突已登记处理结论。
  • 不合格:任何 L1 自动命中违规、L1/L2 缺证据、冲突未登记、L1 被尝试豁免。 不合格必须重做;只有重新提交并得到 verdict=pass 才算合格。
  • 失效:合格之后又写了新代码,评审自动失效,需要重新提交并再次合格。

连续不合格后的「教学模式」

连续 2 次不合格后,评审判官不再只喊「重做」,而是开始教该会话 AI 怎么做:

  • 回合收尾拦截时,在提醒后面附带教学单:先修哪个自动命中项、每个问题怎么改(改哪个文件、换成什么库/配置)、 哪些规则要按什么判定标准补证据、补哪个核心架构怎么落地、架构冲突怎么登记、分发自检问题怎么修;
  • 教学单里带可直接照抄的 action=submit 提交格式(rules / evidence / architectures);
  • 会话 AI 也可以随时调用 security_judge action=coach 获取完整教学计划(结构化 + 中文文本);
  • 面板对应会话显示「已进入教学模式」。

教学单不会代替评审:改完仍要提交,直到 verdict=pass(合格)。

数据与隐私

  • 扫描只读取会话事件(工具名、文件路径、写入的代码文本片段)和会话的工作目录文件名,不读与代码无关的文件内容。
  • 持久化只有三样:授权状态、设置、评审历史(80 条),位置:$DSH_PROFILE_DIR/security-judge-data/state.json (没有 profile 时用 ~/.dsh/security-judge-data/)。
  • 会话扫描与代码片段是内存态,不落盘。
  • 面板接口鉴权:每次加载生成随机页面令牌,只注入当前页面;写操作(授权/撤销/设置/评审/豁免/冲突登记等 POST) 必须带 x-security-judge-token,缺失/错误 401;跨站 Origin 一律 403。只读 GET 不要求令牌(同源页面直接读, 跨站读取被浏览器同源策略挡住)。令牌不落盘、不写日志、不出现在响应里。 残余风险:能读取本机页面 HTML 的本机进程仍可拿到令牌,这属于本机进程权限问题,不在插件可隔离范围内。

已知边界

  • 自动检查是启发式规则匹配,只覆盖规则里可判定的部分;不能被自动判定的规则必须由会话 AI 提交证据, 面板不会替它编造证据。测试 / 夹具文件(路径含 test、spec、fixtures 等)会被自动检查跳过, 避免测试数据里的弱哈希样本被当成生产代码违规。
  • 面板只展示「正在运行」或「最近 30 分钟内做过代码」的会话;更早的旧会话不追溯评审。
  • 拦截的实现是「在回合收尾时把评审要求再推进会话一步」,不是撤销会话日志;默认合格为止、 不设次数上限;担心死循环可在设置里设阈值,或在面板「暂停强制重做」(暂停后仍是不合格)。
  • 架构冲突矩阵来自《代码安全防御架构资料汇编》;冲突处理结论由用户/会话 AI 判断并登记,插件只负责检查与提醒。
  • 分发自检是静态包结构检查(清单/入口/资源/补丁/绝对路径/依赖),不替代「在另一台机器实际安装一次」; 插件自身提供 dist/ 下的可分发 tarball 与干净目录验证记录,可按同样方式验证其他项目。
  • Host 插件的代码更新需要重启 DSH 才会加载新模块;面板界面在页面刷新后使用新客户端资源。

开发流程(本机维护)

  • 本插件当前为本机使用、冻结版本:修改代码后不 bump 版本、不发布,只做本地 remove_bundle → install_bundle 让 Host 重载;两者之间有短暂空窗,别在这时并行跑评审。
  • remove_bundle / install_bundle 会重置本会话的文件读取状态:重装之后要编辑文件, 先重新 read 一次,再 edit / write。撞到 file has not been read 是保护机制,不是 bug。
  • 测试入口:npm test(引擎、Host 核心、教学模式、分发自检、回归 fixture 共 507 项)。
  • 代码改动会使评审失效、回 pending,需要重新提交。
  • 文档改动(README / SECURITY.md / CHANGELOG)不影响评审状态,但文档不能替代代码检查—— 把不安全的做法写进文档同样是漏洞。
  • 用户重新请求评审(「检查审核评审该会话」)会让会话回到 pending,需要重新提交。

规则与架构来源

  • 《代码安全防御架构规则》v1.0(2026-10-28):A–I 九组 67 条,含 L1/L2/L3 与豁免条款; 本插件在此基础上补充 J 组「分发与可迁移性」5 条(按用户的发布要求)。
  • 《代码安全防御架构资料汇编》(2026-10-28 核对版):判据层、理论层、骨架层、方法层、 供应链安全、AI 层、后量子、授权换代、运行时、合规。

文件

  • index.js:Host 入口(工具、系统提示、HTTP 接口、事件装配)。
  • lib/core.js:会话跟踪、授权门禁、面板状态、工具动作。
  • lib/engine.js:代码识别、架构推荐、冲突检查、规则评审、提醒文本。
  • lib/catalog.js:规则目录、架构目录、冲突矩阵、自动检查模式。
  • lib/dist.js:分发包自检(包清单/入口/资源/bundle patch/绝对路径/依赖可安装性)。
  • lib/store.js:授权/设置/历史持久化。
  • lib/httpapi.js:面板接口。
  • client.js:Web 面板。
  • test/selftest.mjs:引擎自测(node test/selftest.mjs)。

Plugin correlati