@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