dsh-agent-policy
策略声明 vs 实际执行:说好不干的事干了没,干了的有没有说
- Stars
- 0
- Language
- Shell
- Created
- Oct 16, 2026
- Updated
- Oct 16, 2026
Introduction
@deepwhale-cn/dsh-agent-policy
说好不干的事干了没,干了的有没有说。
关键词:策略声明 · agent 权限 · 一致性核对 · 不出网 · 通配符放权 · 人工确认 · 过度代理 · 最小权限
先说清楚它是什么、不是什么
是:把项目的策略声明和实际代码摆在一起比 —— 策略文件(policy.yml / agent.yml / 权限配置)写了什么,代码里是不是真的那么干。
不是:
- ❌ 不是运行时拦截 —— 不拦请求、不挡工具调用,只做静态比对
- ❌ 不是权限扫描器 —— 单看「权限是不是太宽」是
dsh-agent-scope的活;这里只问「和声明对得上吗」 - ❌ 不是合规认证 —— 不判断你能不能过审
- ❌ 不下「安全 / 不安全」的结论 —— 只列事实:声明说 A,代码里是 B
一句话分界:
agent-scope = 单看【权限本身】宽不宽(通配符、根目录、无限制出网)
agent-policy = 看【声明】与【实现】是否一致 —— 说好不干的事干了没
同一个 allow: "*",两边都可能提;但 agent-scope 说的是「这权限太宽」,agent-policy 说的是「你声明了允许一切,而你大概以为自己在声明白名单」。
它查什么(5 条)
| 规则 | 查什么 | 级别 |
|---|---|---|
POLICY-EGRESS-PROMISE | 策略里写了「不出网」,同一项目里却有网络调用 | 🔴 |
POLICY-CONFIRM-MISSING | 代码里写着「需人工确认」,同一文件里却直接执行高风险动作 | 🔴 |
POLICY-WILDCARD-ALLOW | 策略里把权限写成通配符(allow: "*" / tools: ["*"] / permissions: all) | 🔴 |
POLICY-DECL-EMPTY | 策略声明里的工具清单是空的(tools: [] / tools: null) | 🟡 |
POLICY-NO-DECLARATION | 有 agent 代码(调模型 / 工具)却找不到任何策略声明文件 | 🟡 |
每条都会给出:哪个文件、第几行、那行长什么样、依据是哪条标准。
第 5 条为什么带 when
POLICY-NO-DECLARATION 是「找不到」类判据,如果对所有项目都跑,一个只有 index.js 的普通小工具也会被报「没有策略声明」——那是误报。所以它只在项目里出现 agent 特征时才跑:openai / anthropic / @deepseek-ai / tool_call / tool_use / AgentExecutor 等。看到 notApplicable 里有它,说明这个项目没有 agent 代码,本来就不该跑。
安装
dsh plugin --profile web add @deepwhale-cn/dsh-agent-policy
用法
# 核对一个项目
dsh-agent-policy --root /path/to/your-agent
# 看内置演示(一个「策略说不出网、代码里却在往外发」的假项目)
dsh-agent-policy --demo
# 列出规则与依据
dsh-agent-policy --list-rules
# 出 HTML 报告 / 给 CI 用
dsh-agent-policy --root . --html
dsh-agent-policy --root . --json
退出码:有 high 命中 → 1(可以挂 CI 卡口)。
一个例子
policy.yml 里写着:
outbound:
allow: false
note: 本 agent 不出网,只访问内网工单库
而 src/sync.js 里:
const WEBHOOK = 'https://hooks.slack.com/services/T000/B000/XXXX';
export async function pushSummary(items) {
const res = await fetch(WEBHOOK, { ... });
}
报出来是这样:
POLICY-EGRESS-PROMISE src/sync.js:9
策略里写明了不准出网,同一个项目里却有网络调用
注意:这不是说「出网就有罪」。是说到时候出事,大家会拿着这份 policy.yml 说「我们规定了不出网」——而实际上它在出。改代码或者改声明,让两边对上,是这份报告唯一的诉求。
判据出处
- OWASP Top 10 for LLM Applications 2025 · LLM06 Excessive Agency —— 智能体的能力应与其声明的边界一致;human-in-the-loop 控制
- CIS Controls v8 · Control 6(Access Control Management) —— 授权必须显式列出,最小权限
- NIST AI RMF 1.0 · GOVERN 1.1 / 1.2、MANAGE 2.2、MAP 1.1 —— AI 系统的策略、责任与边界应明确且与执行一致
- NIST SP 800-53 Rev.5 · AC-6 Least Privilege
双向验证
bash tests/run.sh
- 正例
tests/fixtures/fail/demo-project/:一个有策略文件、但代码处处和它拧着的客服 agent - 反例
tests/fixtures/pass/clean-project/:策略和实现逐条对得上的项目 - 空缺样本
tests/fixtures/absent/minimal/:有 agent 代码、完全没有策略文件
许可
MIT
深鲸网安守护系列(共 31 个)
一个插件做一件事。安全问题是链式的 —— 配套用才完整。
国内合规 | 等保对照 · 日志留存 · 备案公示 · 用户同意 · 个人信息权利 · 未成年人保护 · 影响评估 · 数据分类分级 · 算法备案 · 数据出境 · 国密合规 · AI 内容标识
AI 与 Agent 治理 | AI 输出信任 · 外部内容信任 · MCP 安全 · Agent 权限 · 策略核对 · 可疑指令
数据与凭据 | 敏感数据 · 密钥轮换 · 数据留存 · 配置审计 · 密钥扫描
供应链与构建 | 开源许可 · 依赖投毒 · CI 安全 · 工具审查 · 物料清单
都在 DSH 插件市场(dsh-plugin.org)、npm 和 deepwhale.org.cn/guard.html 上。