DSH 插件安全扫描器:只读静态审计(执行、凭据、外传、混淆、安装脚本、bundle 清单),输出 0-100 风险分。
安装
# npm 包(预构建)
dsh plugin --profile web add deepseek-harness-sentinel
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Eligahyu/dsh-sentinel-scanner
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
English README 是主文档,也是最完整、最先维护的说明。本中文文件是辅助说明; 如有歧义,以英文文档、当前发布版本和报告契约为准。
定位
dsh-sentinel 是 DeepSeek Harness(DSH)插件的只读安全、供应链和健康扫描器。它对源码树、
npm 发布包、DSH profile 和 CI 进行静态审计,输出风险分、裁决、可审阅证据和覆盖率信息。
静态扫描不会 require、import、eval 或执行被扫描的插件代码。
Phase B 动态分析:显式选择、网络隔离
动态分析不是默认行为。只有明确传入 --dynamic 才会在静态结果之后请求独立的动态层;没有
这个选项就不会探测 Docker/Podman,也不会启动 runner。静态裁决和动态状态始终分开。
Phase B 只接受本地 Docker 或 rootless Podman,以及由扫描器发布、预先加载、使用完整
sha256 digest 固定的可信镜像。当前 npm 包没有编译/部署内置的 scanner-owned 镜像,因此
生产 resolver 在没有该镜像时报告 unavailable(通常原因为 trusted-image-unavailable)。
它不会 pull、build、在主机执行插件,也没有主机执行回退路径。
静态 preflight 会在高风险 native 可执行文件或 native Node 模块、容器控制/逃逸信号、超出 硬限制、入口点无法解析、核心遍历不完整或隔离 backend 不可用时拒绝动态执行。拒绝是可报告 状态,不会删除或覆盖静态 findings。
动态状态包括 not-requested、unavailable、refused、complete 和 incomplete:
not-requested:没有请求动态层;unavailable:可信 immutable 镜像或本地隔离前提不存在,插件没有运行;refused:静态 preflight 认为目标超出 Phase B 的威胁边界;complete:固定阶段、有界证据和精确 cleanup 都完成,但不等于插件安全;incomplete:阶段、解析、超时、取消、资源限制或 cleanup 存在不确定性。
使用 --fail-on-incomplete 或 --strict-exit-codes 时,请求的
unavailable/refused/incomplete 会以退出码 3 告知 CI;否则状态仍在报告中可见,
但不会单独改变静态退出策略。
Phase B runner 边界
Linux release gate 只运行在受保护、由管理员维护的 self-hosted runner,标签为
self-hosted、linux、dsh-sentinel-phase-b,environment 为
dynamic-analysis-protected。它要求本地 Docker/Podman、预加载的扫描器可信镜像和受保护
的 immutable digest;镜像格式固定为
^[a-z0-9](?:[a-z0-9._/-]{0,254})@sha256:[a-f0-9]{64}$,不接受 remote endpoint/context。
任何 engine 命令之前都会枚举 exported environment name、转为大写,并拒绝任何大小写形式的非空
DOCKER_HOST、DOCKER_CONTEXT、CONTAINER_HOST、CONTAINER_CONNECTION、DOCKER_CONFIG、
CONTAINERS_CONF、CONTAINERS_STORAGE_CONF、PODMAN_CONNECTIONS_CONF 或 XDG_CONFIG_HOME,
随后清除这些 selector/config 变量;只使用 /usr/bin/docker 或 /usr/bin/podman、受控的空环境和
/ 工作目录,并显式绑定 Docker --host=unix:///var/run/docker.sock 或 Podman
--url=unix:///run/user/<uid>/podman/podman.sock。不安全 selector 会在 image inspect 之前 fail closed;
inspect 使用固定 15 秒 host timeout、TERM 和 5 秒 kill-after,smoke run 使用固定 90 秒 host timeout;
engine socket 永远不会挂载进容器。runner 每个阶段都是新的短生命周期
容器,并固定使用:
--network=none,不允许 public 或 private egress;Phase C 的 gateway/probe 不在其中;--pull=never,不拉取镜像;不在扫描中 build 镜像;如果本地没有 exact image,则明确 报告unavailable并跳过;- private PID/IPC namespace、read-only root、read-only staging、non-root 用户、dropped
capabilities 和
no-new-privileges; - 有界的 CPU、内存、PID、临时空间、输出和 wall-clock 资源;
- 没有 host workspace mount、engine socket、host namespace、host credential 或真实凭据;
- 不执行 package manager,也不执行
preinstall、install、postinstall、prepare生命周期。
staging lifecycle 会先做 root containment,再把允许的 regular files 复制到扫描器拥有的临时
snapshot;symlink、hardlink、socket、device、VCS metadata、worktree 和逃逸路径都会被排除。
只读挂载 snapshot,运行结束后只清理当前 run 所有的资源;cleanup 不确定时状态为
incomplete。证据会限长、结构化、脱敏和摘要化,报告不会写入 secret 原文、完整请求体、
主机绝对路径或未过滤的 engine diagnostics。
runner 的 endpoint 与 executable binding 由扫描器固定,调用者不能替换镜像、endpoint、 entrypoint、mount 或 namespace 策略。可信镜像由 scanner release 负责;staged package 始终是不可信输入。
Phase C 限定
Phase B 故意只做 network-denied runner。CI gate 使用固定两分钟 job timeout 和 90 秒 host
command timeout。DNS/HTTP/TCP/UDP gateway、Node preload probe、
canary correlation 和任何 allowlisted replay network 都是 Phase C 工作;Phase B 的
complete 不暗示这些能力,也不暗示公共网络访问。
动态分析 CLI 选项
| 选项 | Phase B 行为 |
|---|---|
--dynamic |
显式请求 Phase B;默认不启用。 |
--dynamic-backend <auto|docker|podman> |
选择本地 engine,但不能绕过 immutable image 或网络隔离。 |
--dynamic-profile observe |
选择有界 Phase B profile;不包含 Phase C gateway/probe。 |
--dynamic-timeout <ms> |
请求有界超时;默认 15000 ms,强制限制在 1000–30000 ms。 |
安全与隐私保证
- 被扫描代码从不执行;安装前审计也不会执行 npm 生命周期脚本。
- 所有动态层证据都在固定的脱敏边界内规范化、限长和摘要化;原始 secret 不会写入报告。
- 路径、清单入口和隔离解包继续经过 containment 与资源限制检查。
- 所有跳过、截断和不完整状态都显式报告;“干净”不等于插件安全。
- 默认不会上传源码。OSV advisory 等联网功能需要显式开启。
更多静态扫描功能、报告格式、CI 集成和安全政策,请参阅 English README、 架构文档 与 安全策略。
链接
同类插件
toby-bridges/api-relay-audit★ 865
从 DeepSeek Harness 对 AI API 中转站和 LLM 代理运行本地安全审计,生成 Markdown 报告,覆盖提示词注入、模型替换信号、工具调用改写、错误泄漏、流完整性和按 profile 启用的 Web3 风险。
SeaOf0/dsh-redteam-model★ 662
面向授权安全研究的 DSH 合集:九个工作模式(redteam 总控、渗透测试、代码审计、二进制分析、攻防评估、免杀对抗、应急溯源、云安全攻防、CTF 解题)与十五个运行时插件,设置页管理台支持一键部署、安装、更新与卸载。
howmp/dsh-pentest★ 588
面向 DeepSeek Harness 的授权渗透模式:以探索链路记录目标、线索、资产与漏洞,并在 Web 中可视化展示。
PerryLink/dsh-auto-review★ 226
审批链上的第二模型自动审查:只读审查子代理返回带理由的 allow/deny 结构化裁决,默认 fail-closed。
NanmiCoder/dsh-auto-mode★ 164
在 Workspace Write 与 Full access 之间增加 Auto 权限档:日常操作留在官方 workspace-write 沙箱内,由当前会话模型复核升权与破坏性调用,精确的越界访问按次放行一次,意图不明时询问,命中关键路径则拒绝。
PerryLink/dsh-permission-rules★ 117
Claude Code 风格的声明式权限规则:按序 allow/deny/ask 的 YAML 规则,在 tools/pre-execute 瀑布上匹配工具名、参数、工作区路径与 agent 身份,带完整会话日志审计、干跑模式与热重载。
社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。