dsh-baseline:DSH 上的 fail-closed 安全基线闸门

前言

在 DeepSeek Harness(DSH)里给 Agent 开工具权限,常见做法是在工具名或权限类别上打标签。真实风险往往出在别处:一次 curl 打到云元数据地址、子代理继承比父会话更宽的权限、或者事后说不清「谁在何时因何允许了这次调用」。社区插件 dsh-baseline(维护者 bbo777,分类 admin-security)把网络出口、子代理上限和可校验审计收进同一套策略,默认倾向拒绝(fail-closed),而不是在不确定时放行。

下面按「是什么 → 能做什么 → 怎么装 → 怎么用 → 边界与注意」介绍,事实以 GitHub README 与 npm 包说明为准。

这是什么

dsh-baseline 是面向 DSH 的安全基线插件:策略门控的网络出口、只能收窄不能放宽的子代理权限上限,以及把每次工具判定与结果写入同一条 SHA-256 哈希链的审计。它不魔改 DSH 源码,只使用官方扩展点与事件(如 tools/pre-execute、tools/result、ctx.tools.guard()、ctx.approval、webServer.register() 等)。

与 dsh-permgate、auditrail 等相邻产品定位为互补:本插件守网络底线、子代理单调上限、凭据与破坏性操作等基线,不替代完整的权限分类或全局审计产品。

核心功能

网络出口

默认行为可概括为:公网主机名在策略允许范围内可访问;私网、回环、链路本地、CGNAT 与云元数据类地址默认阻断。配置 allowedHosts 后进入白名单模式;白名单外的公网目标在 standard 下走 DSH 标准审批,在 strict 下直接拒绝。网络相关命令与 URL 在 pre-execute 中提取,并在 ctx.tools.guard() 中二次复核。

始终阻断的内部主机名与后缀(如云元数据、.internal、.svc、.local 等)不可通过面板关闭;私网等 IP 段由 blockedCIDRs 定义,删除条目会削弱对应范围的阻断,属于操作者的显式选择。

子代理权限上限

沿 session.header.parentSession 回溯祖先,对同一次调用重放策略。逻辑在 ctx.tools.guard() 中执行:guard 只有「拒绝 / 不干预」,没有 allow,后注册的 listener 无法把子代理权限放宽。fork 会话不计入 lineage。

审计链

判定与工具结果写入本地 SQLite 哈希链;写入前脱敏。Host 提供 verifyChain() 等能力,客户端通过 HTTP API 只读查询,不直接接触数据库。链只记录本插件自身的判定与结果,不上传远端,也不保存 patch、diff、消息体等业务内容。

硬规则与策略模式

启用后有两类规则无条件优先于自定义配置:破坏性系统命令(如根目录递归删除、写块设备、fork bomb 等),以及对设备或内核接口的原始写入(如 /dev/sd*、/proc/self/mem、/sys/* 等)。凭据读取/外发拒绝与子代理上限默认开启,仅能通过配置文件中的 guard 开关显式关闭,面板不能关。

策略模式分为 loose、standard(默认)、strict。standard 在有明确信号时触发内置审批(例如管道进 shell、破坏性 Git/SQL、读 .env、白名单外目标等);strict 在无规则命中时对可能改状态或出网的调用更严。熔断、出口预算异常、审计库不可用等情况一律 fail-closed。

安装与启用

前置条件

  • DSH 版本区间:>=0.2.1-rc.2 <0.3.0(与 peerDependencies、engines.dsh 一致)
  • Node.js >= 22.5,且具备 node:sqlite(本包使用 DatabaseSync)。22.13 起无需额外 flag;22.5–22.12 需以 --experimental-sqlite 启动 DSH
  • DSH 以 Web 模式运行(面板与 HTTP API 依赖 webServer)

当前包版本为 0.1.0,许可证 MIT。

安装命令

CLI Web profile 下可从目录安装:

dsh plugin --profile web add dsh-baseline

桌面版请在 Plugin Manager 中安装 npm 包 dsh-baseline。本包安装即启用;装好后重启 DSH,左侧栏出现「基线审计」即表示 Host 与客户端已挂载。

若需先审查再启用,不要在包内改文件,而在 profile 的 cordis.patch.yml 末尾覆盖:

- id: dsh-baseline
  disabled: true

审查完成后改为 false 或删除该行,再重启。

配置注意

DSH Loader 对同一插件的 config 是整体替换,不是逐字段合并。覆盖时请一次写全需要偏离默认的字段。推荐最小启用示例:

- insert:
    - id: dsh-baseline
      name: dsh-baseline
      disabled: false
      config:
        defaultMode: standard

替换已安装包后需重启 DSH 才能加载新的 JavaScript 模块。

典型用法

  1. 安装并重启后,在 Web UI 打开「基线审计」面板(主面板 key 为 baseline),只读查看判定与链上记录,必要时在 Host 侧做链校验。
  2. 需要收紧出网时,在配置中设置 allowedHosts 白名单,并按环境选择 defaultMode: standard 或 strict。
  3. 与 dsh-permgate 等同装时,由 permgate 管权限类别,由 baseline 管网络底线、子代理上限与基线审计,二者可共存。

审批一律复用 DSH 标准 ctx.approval,本插件不提供自定义审批 UI。

适用场景与注意

适合谁:在 DSH 上跑能出网、能开子代理的 Agent,希望有一层可运营、可审计的底线,且接受「不确定就拒绝」的运维代价的团队或个人。

能力边界(README 明确列出的不覆盖项):

  • 无法阻止恶意插件直接 require('child_process') 等绕过 ToolRuntime 的原生调用;需要进程隔离、容器或 OS 策略。
  • 不覆盖 DSH Code Mode run_code 在 worker thread 内的逃逸。
  • 不解析 DNS;域名指向私网或 DNS rebinding 时,插件只能看到主机名字符串。
  • 不是防火墙、完整沙箱或替代 dsh-permgate 的全能力权限系统。

安装前:插件以当前 DSH 进程的权限运行,安装前应阅读源码与 MIT 许可证,确认策略默认值与 blockedCIDRs、guard 等配置符合你的环境。社区目录 skillhub.cn 插件页 与 dsh-plugin.org 列表 为独立生态站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-baseline 把网络出口、子代理单调上限和哈希链审计绑在同一套 fail-closed 策略里,适合作为 DSH 上的 admin-security 基线层。进一步细节、兼容矩阵与规则 ID 清单见仓库 README。

  • 目录页:https://www.skillhub.cn/plugins/bbo777/dsh-baseline
  • GitHub:https://github.com/bbo777/dsh-baseline
羽毛球分组比赛记分
小程序二维码

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

Xiaoye