# RiskProof v0.2 安全插件对比与迭代依据

## 1 调研目的与范围

本调研用于确定 RiskProof `v0.2.0` 的功能边界：在保持“来源追踪与跨工具信息流控制”目标不变的前提下，参考 Awesome DeepSeek Harness Plugin `security` 分类中具有互补能力的项目，补齐可在 `tools/pre-execute` 阶段确定性验证的风险。

调研快照日期为 2026-08-20。样本选择依据是功能互补性、实现可验证性、文档完整度和近期维护状态，不构成安全认证、排名或对第三方项目的完整审计。

## 2 样本与主要能力

| 项目 | 主要能力 | 对 RiskProof 的启发 |
| --- | --- | --- |
| [PerryLink/dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | 有序 `allow`/`deny`/`ask` 规则、参数/路径/网络匹配、dry-run、审计和热重载 | 策略必须可分阶段上线、可解释、配置失败应明确暴露 |
| [sashankh/dsh-taintguard](https://github.com/sashankh/dsh-taintguard) | 不可信结果污染会话、后续特权调用门控、凭据进入网络工具时拒绝 | 增加凭据网络命令和不可信内容写入本地状态的规则 |
| [tancheng33/dsh-egress-guard](https://github.com/tancheng33/dsh-egress-guard) | 出口主机白名单、结果密钥脱敏、JSONL 审计 | 增加识别目的地的 denylist/allowlist，但不把工具参数检查误称为网络防火墙 |
| [JohnXu22786/safety-net](https://github.com/JohnXu22786/safety-net) | 破坏性命令分词与规则库、不可逆操作确认 | 对高置信灾难性操作设置硬拒绝，对可恢复破坏性操作使用可配置审批 |
| [JohnXu22786/secret-guard](https://github.com/JohnXu22786/secret-guard) | 敏感文件读取/写入门控、模板文件例外、结果脱敏 | 在内容进入模型前检查凭据路径，并为 `.env.example` 等模板控制误报 |
| [shuxue6662-a11y/dsh-risk-guard](https://github.com/shuxue6662-a11y/dsh-risk-guard) | 风险标签、累计风险、保险丝规则和操作账单 | proof 需要按规则聚合并提供处置建议；不引入缺乏统一标定的累计分数 |

## 3 现状差距

RiskProof `v0.1.0` 已具备来源追踪、污点传播、`EIT -> PAT -> NAT` 攻击链、执行前裁决和脱敏 proof。与样本能力对比后，确认以下差距与项目目标直接相关：

1. `CODE_EXECUTION` 参数即使包含明显破坏性操作，只要没有不可信来源污点，原规则不会触发。
2. 凭据文件在成功读取后才能产生 `SECRET` 污点，缺少读取前的敏感路径门控。
3. Shell 命令中的网络客户端不是独立 `EXTERNAL_ACTION` 工具，凭据可能绕过外部动作分类。
4. `internalDomains` 只定义敏感数据的信任边界，不能表达明确禁止或仅允许的出口域名。
5. 用户只能逐项填写决策，缺少适合观察上线、日常使用和高安全环境的成组策略。
6. proof 能给出规则与原因，但缺少面向恢复操作的建议和按规则聚合统计。

## 4 v0.2 设计取舍

### 4.1 纳入范围

- 增加 `permissive`、`balanced`、`strict` 三种预设，显式字段仍优先于预设。
- 增加敏感路径读写规则，内置常见凭据文件并排除文档模板。
- 增加灾难性操作、破坏性操作和远程脚本管道的有界高置信检测。
- 增加网络命令携带凭据、外部摄入后访问凭据、不可信内容写入本地状态规则。
- 增加目的地域名 denylist 和可选 allowlist；仅处理可观测、已识别的 sink 字段。
- 增加规则级 remediation 和 proof 命中统计，不记录原始路径、命令或密钥。

### 4.2 暂不纳入范围

| 能力 | 暂不引入原因 | 推荐组合 |
| --- | --- | --- |
| 通用 YAML 权限规则引擎 | 与来源感知信息流边界不同，重复实现会增加配置冲突 | 组合 `dsh-permission-rules` |
| 进程级 HTTP/CONNECT 代理 | 需要新的网络执行与证书信任边界，参数扫描无法替代内核/代理控制 | 组合网络策略或沙箱插件 |
| 工具结果内容改写 | 脱敏会改变工具对模型的输出语义，并可能与专用 secret-redactor 冲突 | 组合 `secret-guard` 或专用脱敏插件 |
| LLM 审批判断 | 非确定性模型不进入 RiskProof 的安全边界 | 使用 DSH 原生人工审批或独立 reviewer 插件 |
| 通用累计风险分数 | 不同工具和部署缺少统一校准，数字可能形成虚假精度 | 保留离散 risk level 与规则计数 |
| 完整 Shell 解析 | 跨 Bash、PowerShell、cmd 和解释器的正确解析超出本插件边界 | 使用专用危险命令插件和 OS 沙箱 |

## 5 规则分层

`v0.2.0` 将规则分成两层：

1. 硬不变量：云元数据/链路本地目标、灾难性系统操作、凭据外发、已确认私密数据外泄链和 operator denylist 始终拒绝。
2. 可配置规则：敏感路径、破坏性但可恢复的命令、不可信上下文后的访问或写入、外部 allowlist 和未知工具由预设决定，并允许逐项覆盖。

这种分层保留单调安全属性，同时让正常开发中的文件读取、Git 操作和内部服务调用可以根据部署环境调整。

## 6 验收方法

每项新能力至少包含一个命中样例和一个误报边界样例。核心验收包括：

- `.env` 和云凭据路径触发，`.env.example` 不触发；
- `rm -rf /`、根目录通配删除和磁盘格式化始终拒绝，普通 `rm build/output.txt` 不触发；
- `curl | bash` 触发，普通 `git status && npm test` 不触发；
- 网络命令携带高置信 token 时拒绝，proof 不出现 token 原文；
- allowlist 为空时不改变既有出口行为，非空时才检查未列目的地；
- `strict` 可收紧全部可配置规则，显式字段可覆盖预设；
- 所有裁决继续与其他插件执行单调合并。

自动化证据位于 `tests/unit/command-risk.test.ts`、`tests/unit/path-policy.test.ts`、`tests/unit/engine.test.ts` 和 `tests/security/attack-chain.test.ts`。

## 7 局限与后续方向

本轮规则依赖可观测参数、能力分类和有界模式匹配。别名、编码、运行时拼接、DNS 重绑定、工具内部网络请求和语义改写仍可能绕过检测。后续版本优先评估工具身份连续性、任务范围策略和可验证执行回执；网络强制、结果脱敏和通用权限规则继续由专用插件承担。
