技能扫描器被绕过:静态检查为何漏掉恶意技能
Trail of Bits 分别用不到一小时,就让四个恶意技能骗过了 ClawHub、Cisco 扫描器和 skills.sh。教训是:静态扫描器无法充当技能的信任边界。
这是什么?
2026 年 6 月 3 日,Trail of Bits 的研究员 Samuel Judson 与 Tjaden Hess 发布了一项研究,展示他们绕过了所测试的所有主流技能扫描器:OpenClaw 的 ClawHub 检测器(背后由 VirusTotal 和一个 GPT-5.5 守卫模型支撑)、Cisco 的开源 skill-scanner,以及 Vercel 的 skills.sh 所集成的三家扫描器(Gen、Socket 和 Snyk)。
代理的*技能(skill)*是一个打包好的组合,包含自然语言指令(一个 SKILL.md 提示)、代码和资源,供 Claude Code、Codex 或 OpenClaw 等代理加载以扩展其行为。随着公共市场充斥着窃取凭据、劫持代理的技能,一类新产品应运而生,用于在安装前审查技能。结论很直接:这些扫描器不起作用。四个恶意演示技能中有三个是在不到一小时内构建的,全部公开在 trailofbits/overtly-malicious-skills。
工作原理
该研究记录了四种结构性绕过,每一种都利用了不同的盲点,而非某个单一的产品缺陷。
填充导致的截断。 在无害样板与恶意内容之间预置约 10 万个换行符,会把有效载荷推到 ClawHub 守卫模型截断输入的位置之后。文件被判为”干净”,因为扫描器根本没读到危险部分;VirusTotal 的模型同样被搞糊涂,而在网页界面中,超长的滚动很容易被忽略。
打包间接引用。 一个 SKILL.md 指示代理从随附的 .docx 中提取其”真正的”指令——而该文件不过是携带隐藏脚本的 XML 之 ZIP 包。基于模式匹配的引擎只看到一个格式化辅助工具,看不到随归档一起到来的有效载荷。
源码与产物不一致。 一个无害的 Python 源文件旁边放着一个预编译的 .pyc,其字节码中含有额外行为——读取环境变量以备日后外泄。只读源码、或将二进制视为不透明的扫描器永远看不到它。这正是经典的 xz-utils 模式:交付的产物与被审查的源码不一致。
提示注入误导。 一个把 npm 和 yarn 重新配置到攻击者控制的注册表的技能,被包装成”企业镜像”(位于 VPN 之后)和”经 AppSec 审计的白名单”之类的措辞,说服了 LLM 分析器认为该改动只是例行操作。在使用 Claude Sonnet 4.6 时,Cisco 的工具仅把这个替代注册表标记为 LOW,仍然判定该技能安全。
共同的弱点是:静态扫描器是一个固定靶子。攻击者后手出招,在紧凑的循环中反复调整攻击,直到某个版本蒙混过关。Trail of Bits 用一个正当的例子点出了镜像式难题——Anthropic 官方的 Office 技能合法地使用 LD_PRELOAD 打入一个已编译的垫片库,以绕过沙箱中的套接字封锁,而这种行为在扫描器看来与攻击无从区分。
为何重要
技能是与包管理器并列的一种新的供应链依赖,但攻击面更广:它们混合了代码、二进制、资源以及可执行或可外泄的自然语言指令。从公共市场一键安装,就可能把代理及其宿主机一并交到攻击者手中。由于推理成本高昂,扫描器倾向于使用更弱的模型和被截断的上下文——恰恰是这些绕过所利用的缝隙。而且,由于一条指令在某个环境中良性、在另一个环境中恶意,任何静态裁决都无法可靠。一个绿色对勾制造出的虚假信心,或许比完全不检查还要糟。
防御
不要把信任外包给扫描器。 把公共技能仓库当作不可信代码对待,尤其是运行于敏感环境中的代理。“通过”扫描并不等于安全保证。
策展并锁定版本。 优先使用经过审查的策展合集(例如 anthropics/skills 或 trailofbits/skills-curated),锁定到具体的提交,并控制谁能引入或更新技能——就像对待任何依赖一样。
约束打包格式。 禁止无法被分析的产物:不允许二进制、不允许预编译字节码,采用明确的文件类型白名单,并对照技能规范进行校验。Trail of Bits 提交给 Cisco 扫描器的 PR 增加了一个严格的格式校验模式,正好拒绝了上文的字节码向量。
在运行时强制,而不只是在入口。 静态分析看不到行为。将其与最小权限、出站流量控制和沙箱结合,使得即便恶意技能蒙混过关,其影响半径也保持很小。
保持攻击面小并交由人工复审。 更少的技能、来自已知来源、由人(而非扫描器裁决)复审——在生态成熟之前,这才是可持续的模式。
状态
| 项目 | 详情 |
|---|---|
| 被绕过的扫描器 | ClawHub(OpenClaw + VirusTotal)、Cisco skill-scanner、skills.sh(Gen、Socket、Snyk) |
| 技术手段 | 换行填充截断、.docx 间接引用、.pyc 字节码不一致、提示注入误导 |
| 投入 | 4 个技能中 3 个在一小时内构建完成 |
| 披露 | Trail of Bits(S. Judson、T. Hess),2026 年 6 月 3 日 |
| 加固 | ToB PR #25:为 Cisco 扫描器增加严格格式校验 |
| CVE | 无——属结构性设计问题 |