SKILLVERDICT
中文

中文版由 Skillverdict 翻译,仍在校对中;如有出入,以英文版为准。

扫描器评分卡 · 语料库 v1 · 静态模式

我们不扫描技能。
我们检验扫描器。

两个开源的 AI 智能体技能安全扫描器,186 个英语、俄语、德语和中文的真实技能,40 个已去害的攻击样本。结果显示:判定取决于技能所用的语言,而静态评分衡量的是技能附带了多少代码——而不是它做了什么。

用俄语、德语或中文写的“忽略你之前的指令”:两个引擎都未检出。SkillSpector 对 43 个附带代码的正常技能中的 38 个给出的判定:DO NOT INSTALL。

207×
“混合文字系统”发现项在俄语 Markdown 上的次数;德语为 0×
3 / 4
种语言中,文本形式的指令覆盖未被任何一个引擎检出
0.71
代码文件数与 SkillSpector 静态评分之间的秩相关系数
0 / 43
含六个及以上代码文件的正常技能被判为 SAFE
§1为什么需要裁判

技能靠信任来安装。而产生这种信任的工具从未被检验过。

智能体技能是一个告诉编码智能体该做什么的 Markdown 文件,通常旁边还附有脚本。人们把它们从 GitHub 安装到 Claude Code、Codex 和 MCP 宿主中——而且越来越多地由智能体自行安装。现在有好几个扫描器承诺给出判定——SAFE、CAUTION、DO NOT INSTALL——而这个判定正是被复制进 README 和策略文件的东西。

从来没人测量过这些判定。我们构建了一个语料库,让扫描器在上面运行,就像评级机构审计一个信用模型那样:用公开数据、固定版本,并在发布前通知厂商。

一个带有 scripts/ 目录的正常英语技能,得到的评分比一个读取你的 SSH 密钥并发送到某个 URL 的单文件样本还要差。

§2我们的发现

三项发现

  1. 语言差异表现为具体的规则,而不是笼统的偏见。 一条规则几乎在每个俄语技能上触发,而在德语上从不触发;另一条在中文包上触发 112 次,在俄语上一次也没有;第三条只匹配英语文本。每一条都是可预测、可修复的人为产物——只要知道它的存在。没有任何其他已发表的技能扫描器基准按语言切分结果。
  2. 文本攻击在除英语以外的所有语言中都能通过——或者在所有语言中都能通过。 用俄语、德语或中文写的“忽略你之前的指令”没有被任何一个引擎检出。范围蔓延在任何语言中都没有被任何引擎检出。
  3. 静态评分跟随包的大小。 代码文件数与评分之间的秩相关系数为 0.71。仅含 Markdown 的技能:中位数 8,大多为 SAFE。六个及以上代码文件:中位数 100,无一 SAFE,43 个中有 38 个为“DO NOT INSTALL”。40 个攻击样本:中位数 29,最高 51。

完整表格与图表 →

§3下一步

从基准到公开记录

评分卡是第一项产出。它通向的服务很简单:粘贴一个 GitHub URL,得到一个页面——各引擎的判定并排呈现,我们已知为语言人为产物的发现项被相应标注,还有版本历史和一个随每次提交自动更新的徽章。

第二阶段

技能页面

每个技能、每次提交一个页面:SkillSpector、Cisco,然后是 Socket 和 Snyk、各引擎的 LLM 模式,以及一个用技能自身语言阅读文本的 LLM 审阅者。发现项呈现为观察到的行为,而非标签。作者可以公开提出异议。

开发中
第二阶段

徽章

放进 README 的实时 SVG。每次 push 重新扫描。每个徽章都链接回对应记录。

![skillverdict](https://skillverdict.dev/badge/github.com/OWNER/REPO.svg)
第三阶段

面向智能体的 API

GET /api/v1/verdict?url=… 和一个 MCP 服务器,让安装技能的智能体先问一声。面向团队的策略:“只允许高于阈值的技能”。

计划中
第二阶段

技能页面上线时收到通知

第二阶段上线时发一封邮件,仅此而已。选择你的邮件服务;邮件已写好,直接发送即可。

技能页面上线时通知我

或写信至 andrey@skillverdict.dev。如果你维护一个扫描器并希望在发布前拿到原始结果,也用这个地址。