论文:Scan the Skill, Govern the Action: Composing Registry Verdicts with Runtime Consequence Control arXiv:2609.12001(2026-09-10 提交) 团队:Rohit Taneja、Travis Weber(Pheo Inc) 代码:https://github.com/pheo-ai/open-agent-trust-system(复现脚本、活体实验 harness、逐命令记录,Apache 2.0) 语料:OpenClaw 官方 MIT 数据集 clawhub-security-signals(66,192 技能版本 × 四仪器裁决)
Scan the Skill, Govern the Action 精读:agent 技能的「许可 ≠ 恶意」
一、题目与背景
论文标题直译是「扫描技能、治理动作:组合注册表裁决与运行时后果控制」。标题里藏着一个精确的对仗:Scan the Skill(扫描的是技能/工件) 与 Govern the Action(治理的是动作/行为)——这正是全文的核心论题。
背景是 agent 技能生态的安全现状。OpenClaw 的 ClawHub 注册表在技能发布前有四层仪器把关:VirusTotal(已知恶意二进制)、内部静态分析(危险模式匹配)、NVIDIA SkillSpector(能力剖面是否过宽)、ClawScan(一个把前三者输出与出处、元数据、审核历史一起权衡的 LLM 判官,产出 Clean/Suspicious/Malicious 三态裁决)。2026 年 5 月 OpenClaw 自己发布了一项诚实的测量:三台扫描器在合并阳性上的重叠至多 10.4%,81.9% 的被标记技能只被一台扫描器单独捕获。
业界的直觉读法是「检测问题:四台仪器四种校准,统一它们噪声就消了」。本文的读法完全不同:四台仪器回答的是四个良定义的问题,而且都关于工件的同一个属性——「它恶意吗」;但还有一个没有任何仪器在回答的问题——「这个动作,此刻、这台机器、这个操作者,被允许吗」。前者是发布时谓词,后者是运行时谓词,两者答案可以合法地相反。
二、定位:这不又是一篇「新扫描器」论文
本文在 agent 安全文献谱系里的位置很特别。它不是 Saha et al.(2605.11418)那类攻击论文(演示文本改写可让静态/LLM 扫描器 36.5–100% 规避);也不是 Llama Guard / NeMo Guardrails 那类模型护栏(把模型放进决策路径,付出模型延迟,只能挂在对话轮次上);更不是又一台「更准的扫描器」。
它做的事情是把这个领域的问题定义本身重构掉:恶意性与许可性是同一工件上的两个不同谓词,发布流水线计算的是它被建造来计算的那个。论文引用银行合规做类比:KYC 在开户时做身份核验,但没有人会认为「我们开户时验证过他们」是对第 400 天那笔转账的完整回答——每笔转账仍然要实时过限额、模式、账户历史的筛查。agent 技能今天只有 KYC,没有转账筛查。
三、问题定义
三个层层递进的具体问题:
- 测量缺口:在所有仪器共同判「清白」的技能群里,有多少在指示被权威控制框架(CIS Critical Security Control 2.7 要求只有被授权的脚本可执行;NIST SP 800-53 CM-11 要求组织 enforce 软件安装政策并禁止「未知或可疑血统」的软件)点名的禁止操作?
- 代理差距:静态分析读的 SKILL.md 文档,是不是 agent 实际执行内容的一个可靠上界?
- 控制缺口:如果需要一个坐在每个动作前面的控制点,凭什么原则它才敢「停止提问」(从逐动作审查晋升为无人值守放行)?
四、解法:OATS 三件套
4.1 确定性解析器 ρ
核心是一个全函数 ρ: Σ* → C,把命令字符串映射到 33 个后果类别之一(shell 执行及其三个危险特化:远程执行/凭据访问/破坏性;文件写入按路径语义细分;仓库与 CI 操作;秘密与 IAM 变更;部署;computer-use 动词……)。三个刻意保证的性质:
- 全性:匹配不到任何谓词的命令落到通用
shell_exec兜底,不存在失败开放(fail-open)路径。 - 无状态:只读命令字符串——不读技能文档、不读账本、不看时钟、不碰模型。200 条命令在两个不同历史的独立账本中分类 200/200 一致。这使决策可被审计者重放而无需重跑模型。附带一个值得玩味的披露:产品里有一个小本地模型写「人话解释」,但它异步运行在裁决返回之后、只改写已定决策附带的句子、失败不影响任何分类——刻意把模型挡在决策路径外,因为「放在那里的模型会成为攻击者可以用 payload 去争辩的对象」。
- 按最大严重度解析:一条命令命中多个类别时取最严重者,没有分数可调、没有阈值会漂移。
ρ 也不读技能文档——这直接封掉一条已被实证的攻击信道:Saha et al. 的治理规避攻击全部通过技能自身文本的写法实现,对一个根本不读文本的函数无效。实测成本:端到端中位 67.6ms(p95 81.1ms),几乎全是进程启动开销;最坏 2000 字符输入的分类增量约 1.36ms。
4.2 信任账本
ρ 的输出喂入按 (资源, 类别) 键控的有限状态账本——信任是按道(lane)给的:同一技能可以在一个仓库被完全信任写文档、同时被永久禁止读凭据文件。每道沿 unclassified → held → approved(n+1)/rejected(n←0) 转移,连续 n 次干净放行后才可晋升(graduated),且 33 类中 13 个高危类(远程执行、凭据访问、秘密、破坏性、部署、IAM、CI 配置、workflow 触发、webhook、仓库删除、保护分支合并、分支保护、不可逆 UI 提交)在任何 n 下都不可晋升——这条「永不晋升」规则在授权路径里强制执行而非配置。
4.3 推导而非断言的晋升阈值
论文对业界默认的「flat 十次干净放行」做了统计致命一击:零失败 N 次试验下,真实失败率的单侧 95% 上界是 ε ≤ 1−δ^(1/N),代入 N=10 得 25.9%——十次干净放行甚至无法排除「这个 agent 四分之一的次数会出错」。从操作者自报的可容忍失败率 ε_k 出发做 Clopper–Pearson 精确反演:N = ⌈ln δ / ln(1−ε_k)⌉,得到分级阈值表:文档/测试/读操作(ε=10%)需 29 次连续干净(期望 202 次人工审批);shell 执行(ε=5%)需 59 次(期望 392 次);业务逻辑/依赖(ε=2%)需 149 次(期望 965 次);高危类无有限 N。flat-10 比操作者自报政策所需证据少 3–15 倍。论文同样诚实地列出这套推导给不了的东西:试验不独立(N 是下界)、审查下的失败率 ≠ 撤掉审查后的失败率(选择效应)、逐动作界不是累积界(1000 次无人值守动作在 ε=0.5% 下有 99.3% 概率至少一次失败)、无多重比较校正(100 条道各自 δ=0.05 会期望约 5 条被错误晋升)。
五、实验结果
5.1 测量一:清白技能指示禁止操作(§4)
66,192 个技能版本中 29,257 个被三台扫描器与判官共同判 Clean。在这个群里:
- 705 个技能、135 家独立发布者指示了控制框架点名的禁止操作(远程执行 658、凭据访问 23、破坏性命令 20、保护分支合并 7、触发 workflow 1)。
- 检测器精确率:固定种子抽 100 个人工审计,92% 正确(95% CI [84.8%, 96.5%]);对 92 个正确检测逐一检查恶意意图标记——零。全是正常厂商安装器、语言工具链安装、普通包管理操作。
- 发布者分布极度偏斜:单一发布者 oomol 贡献 506/705(71.8%,一家公司把同一条安装线铺满自家产品线,工程上完全正常)。论文同时报告三个数:705(分布工件数)、135(独立当事方数)、199(去掉主导发布者后的余量)。去掉主导者后仍有 152 个技能来自 93 家发布者、携带 102 条不同命令串、拉取 48 个不同域名——头条的量级取决于一家,所描述的实践不取决于。
这组数字支撑了论文的论题而非反驳扫描器:远程执行谓词在全体语料上触发 1.73%、在「全员判清白」群里反而 2.25%——因为这个谓词测的不是恶意,被按非恶意筛过的群里当然不会更少。「清白」意味着「没有任何仪器反对」,不意味着「有任何仪器验证过无害」。
5.2 测量二:被扫描的工件 ≠ 被执行的工件(§5)
39 个技能(跨发布者各取一,限定文档自身代码块至少解析出一个特定类的「有能力包络」文档),活体 agent(Claude Sonnet 5)在沙箱容器里照真实文档执行,144 条命令逐条分类:
| 视角 | 本次 | 早前一次 |
|---|---|---|
| 逐字出现在文档里 | 2(1.4%) | 3(3.2%) |
| 重组合(类别在文档中存在) | 92(63.9%) | 56(60.2%) |
| 类别在文档所有代码块中缺席 | 50(34.7%) | 34(36.6%) |
两次独立运行 Fisher 精确检验 p=0.78 一致。agent 不誊抄文档,agent 重组合文档:把检查链接到文档从未链过的安装上、加 flag、重定向输出、把一步拆成三步。34.7% 是对静态审查方法学的直接打击——审查者对着文档推理能力包络,三分之一的执行后果类别不在包络里。诚实边界:50 条意外命令全部落通用 shell_exec 类,样本中重组合从未制造出比文档更高严重度的类别——代理在良性方向失效,不在危险方向失效;对抗者的全部目标恰恰是让高危看起来低危,良性样本永远不尝试这个。
5.3 实验三:活体运行时验证(§6)
53 个「全员判清白但文档指示不可晋升操作」的技能(每发布者一个),同一活体 agent 经未修改的发布版门控执行:
- agent 对其中 23 个(43.4%,95% CI [29.8%, 57.7%])真的伸手去做了文档指示的禁止动作(远程执行 22、凭据访问 2、破坏性 1);
- 门控 23/23 全部 held 或 blocked(95% CI [85.2%, 100%])。
一个早前版本的运行报 4/54(7.4%),论文没有悄悄覆盖这个数字,而是解释了为什么它错了:早前 harness 关掉了执行,agent 把回合全花在确认自己的工具能不能用上、从没走到安装步骤——一个在到达安装前被截断的 agent 会被记为「没有伸手」,7.4% 是达成率的下界而非估计。这个修正本身是方法学贡献:评估 agent 治理系统时,执行环境的可用性直接决定测量的是治理还是 harness。
第四个案例值得单独读:agent 第一次安装被 routine review 挂起(不是 block),第二次尝试把同一安装路由到第三方镜像——同一解析器把这一次判为远程执行并拒绝。同一步骤、两次执行、两个类别,因为 ρ 是实际发生之事的函数,不是文档声称之事的函数。
5.4 组合而非竞争(§7)
五层并列(问题/输入/时机/盲区):VirusTotal(已知恶意二进制?/捆绑文件/发布时/新代码盲)、静态分析(危险模式?/文档文本/发布时/意图盲)、SkillSpector(能力剖面过宽?/文档+AI/发布时/实际行使盲)、ClawScan(综合恶意?/以上三者+出处/发布时/发布后一切盲)、OATS(此动作此刻被允许吗?/解析后命令串/每个动作/从未成为动作的伤害盲)。
盲区不重合 → 组合。定量上 OATS 旗标与注册表阳性联合的关联仅 ϕ = −0.016(Fisher p=6.5e-5 但效应可忽略——语料大把 p 值做小了,论文拒绝用这个 p 值讲独立性故事,改讲结构性论证:读不同对象的仪器,其盲区由位置决定而非质量决定)。组合规则也具体:注册表裁决是账本的输入而非竞争者——上游判非清白的技能,操作者政策可把其所有道钉死在 held 或永不晋升。
5.5 论文自己砍自己(§2.2 与 §9)
这篇论文的反常之处在于自我攻击的密度:
- 发布了一个 64 案例(九种语义保持改写技术)的动作级治理 benchmark,自家实现宏平均只过 52%(微平均 75%),并说明为什么两个数都该报:完整解析的技术恰好是多案例的插值型技术,失败的技术是固定形式少案例。「我们宁可发布一个自家实现只过一半的 benchmark,也好过没有。」失败形状比头条有用:包装/链式 100% 解析(论元位置纪律在干活),但分阶段 fetch-then-execute(curl -o; chmod +x; ./s)0%——单命令分类器原理上看不见只存在于命令组合中的性质,这不是调模式能修的,是 ρ 这类函数的类边界。
- 威胁模型明确:假设的是「重组合良性文档的 agent」,不是「知道 ρ 文法并针对性改写命令的对手」,不要把它当成能对抗后者来部署。
- 九个自家仪器缺陷逐条列出(fail-open 的 shell 分类绕过、远程执行谓词三次假阳性回归、152MB 每检查的读取缺陷、把相对路径熵判为凭据泄漏……),三个最晚发现的缺陷是「有人对抗性阅读测量代码」才发现的——这是发布测量代码的论证。
- 利益披露:Pheo 销售被评估的实现;解析器闭源(可重执行、不可阅读);论文承认 shipped 版本的晋升阈值就是它自己论证为过于宽松的 flat-10。
六、知识反推:从这篇论文能学到什么领域通用知识
- 「问错了问题」是比「答错了问题」更深的失败模式。四台仪器在各自问题上都是胜任的,叠加更多仪器不产生许可谓词——新问题需要新控制点,不是旧控制点的精度军备竞赛。评审任何「加一层检测」型工作时应先问:它在回答哪个谓词?
- 文档是代理,代理有方向性。SKILL.md 对 agent 执行的代理在良性场景失效 34.7% 且方向向下(从不制造更高严重度)——但这个方向性是良性世界的性质,不是对抗世界的。凡是拿静态工件推断动态行为的研究(代码审查、安全扫描、能力评估)都该测「代理失效的方向」而不只是频率。
- 统计推导可以替代厂商直觉成为政策参数。「十次放行」是被选择的不是被推导的;N = ⌈ln δ/ln(1−ε)⌉ 把「这个组织的容忍度」变成一个数进入系统。同样格式适用于任何「连续干净记录后放宽审查」的机制设计(代码评审的自动合并、部署的金丝雀晋升、agent 权限的渐进授权)。
- 审查下测得的可靠性 ≠ 撤掉审查的可靠性(选择效应:被审查者拦掉的坏案例永远进不了干净记录)。这是所有「人机切换」评估的隐含地雷。
- 成本决定控制点位置。67ms 且无模型 → 可以同步坐在每个工具调用前;模型判官的延迟把它锁死在对话轮次粒度。治理架构的第一约束不是智能是延迟预算。
七、通用灵感:可迁移到其他研究的想法
- 对 Agent 评审系统:把「评审输出的许可性」与「变更的恶意性」分开谓词化——一个 PR 可以完全不恶意但违反本仓库此刻的政策边界;按 (仓库, 变更类别) 键控的信任账本 + 从团队自报容忍度推导的晋升阈值,直接映射到「何时开始自动合并」问题的原则化答案。
- 对评测体系构建:论文的「语义保持改写 benchmark + 按技术宏平均」是评测治理/防御类系统的可复用模板——改写保持语义则 ground truth 无争议,宏平均防止多案例技术污染头条。自家系统只过一半也发布 benchmark,是把「可比性」置于「好看」之上的示范。
- 对 harness/skill 安全方向:OATS 的三重设计(读执行而非读文档 / 决策路径无模型 / 永不晋升类硬编码)给 harness 层安全 hook 提供了可直接落地的参考架构;而「分阶段执行 0% 解析」的失败边界指出了下一步研究缺口——需要解析 shell 文法并在调用间携带状态的解析器,这正是 trajectory assurance(2608.01558)与时间约束(2512.23738)路线的交汇点。
- 对论文写作:这篇论文示范了「负面结果与自我修正作为一等贡献」的写法——withdraw 早前数字并解释为何错、公布自家实现的失败率、披露商业利益与闭源边界。在 agent 安全这个容易营销化的方向,这种透明度本身即是方法学贡献。
八、局限与开放问题
论文自陈:单注册表单快照;检测器召回率未知(705 是下界非估计);活体实验单模型单日(43.4% 的 CI 宽到 [29.8%, 57.7%]);解析器闭源削弱可审计性主张;每检查 12KB 的账本写入使吞吐随存储增长(交互式场景不可见、语料级评估需结构化绕过)。开放的最重要的一个:从未成为动作的伤害(文档里写死的收件人、说服性指令、过宽授权范围)对动作级门控原理上不可见——这正是工件层扫描器的领地,也是「分层组合」结论的另一面:没有任何一层是充分的。
九、一句话总结
当所有扫描器都说一个技能是干净的,它们只是回答了被问到的问题;「这个动作此刻是否被允许」是另一个问题,66,192 个技能的测量表明它几乎与前者正交(ϕ = −0.016)——而 agent 有 43.4% 的概率真的会把手伸向那个没人回答过的问题。