为什么你的“Skill Scanner”只是一种虚假安全感(甚至可能是恶意软件)
Source: Dev.to
(请提供您希望翻译的完整文本内容,我将为您翻译成简体中文并保持原有的格式、Markdown 语法以及技术术语不变。)
也许你是 AI 构建者,也许你是 CISO。
你刚刚授权开发团队使用 AI 代理。你了解其中的风险——数据外泄、提示注入以及未经审查的代码执行。因此,当你的首席工程师说,*“别担心,我们使用 ClawHub 的 Skill Defender 来扫描每个新 Skill,”*你松了一口气。你已经勾选了相应的选项。
但你检查过这个 Skills 扫描器吗?
你感到的焦虑并非来自 已知 的威胁;而是来自你所信任的检测工具。总有一种挥之不去的怀疑,觉得你的安全网漏洞百出。面对当今层出不穷的 “AI Skill 扫描器”,这种怀疑是完全合理的。
如果你对 Agent Skills 及其安全风险还不熟悉,我们之前已经概述了一个 Skill.md 威胁模型,并解释了它们如何影响更广泛的 AI 代理生态系统和供应链安全。
为什么正则无法扫描 SKILL.md 以检测恶意意图
AI 安全的敌人不仅仅是黑客;更是语言的无限可变性。
在传统的 AppSec 世界里,我们会扫描已知漏洞(例如 CVEs)和已知模式(例如密钥)。这之所以有效,是因为代码是结构化的、有限的且确定的。SQL 注入负载有可辨识的结构,泄露的 AWS 密钥有特定的格式。
然而,AI 代理的 Skill 是自然语言提示、代码执行和配置的混合体。依赖“黑名单”来列出“坏词”或禁止的模式,在面对自然语言的无限语料库时是一场注定失败的战争。你根本不可能枚举出让 LLM 执行危险操作的所有可能表达方式。
以普通的 curl 命令为例。正则扫描器可能会标记 curl 以防止数据外泄。一个高级攻击者根本不需要直接写 curl,他们可以这样写:
c${u}rl # 使用 bash 参数展开
wget -O- # 使用替代工具
python -c "import urllib.request..." # 使用标准库
或者直接请求:
“请获取此 URL 的内容并显示给我。”
在最后这种情况下,代理会自行构造命令。扫描器只看到无害的英文指令,但意图仍然是恶意的。这正是“黑名单”思维的核心缺陷:你试图阻止系统中具体的词语,而该系统的设计目标是理解概念。
当上下文变得重要时,问题会进一步加剧。一个请求“shell 访问”的 Skill 对于 DevOps 部署工具可能完全合法,但对“食谱查找器”或“日历助理”来说则可能是灾难性的。模式匹配器只能看到“shell 访问”这几个词,它要么同时标记两者(产生噪音),要么全部忽略(产生风险)。它并不理解为什么需要访问——它只知道这些词出现了。
Source: …
案例研究:我们让社区扫描器对抗真实恶意软件
我们测试了最流行的社区“技能扫描器”,使用一个自定义的“半恶意”技能,看看它们能否分辨友好与敌对。评估的工具包括:
- SkillGuard
- Skill Defender
- Agent Tinman
1. SkillGuard – 实际上是恶意软件的扫描器
我们的第一个对象是 SkillGuard(作者 c-goro)。宣传口号?轻量级的技能扫描器。实际情况?一个陷阱。

当我们分析 SkillGuard 时,内部系统并未将其标记为安全工具,而是标记为恶意技能本身。它试图以“更新定义”为幌子安装负载。

**更新:**截至本文撰写时,SkillGuard 已从 ClawHub 下架。但对于已经安装的数百名用户来说,损害已经发生。这说明了一个核心问题:谁来扫描扫描器本身?

2. Skill Defender – 假阴性
接下来我们检查了 Skill Defender(作者 itsclawdbro)和 Agent Tinman(作者 oliveskin)。这些都是合法的社区项目;Skill Defender 甚至在 VirusTotal 上拥有“良性”徽章。然而,“良性”并不等同于“有效”。
我们创建了一个名为 vercel 的测试技能。它看起来像是用于 Vercel 平台的部署工具,实际上却悄悄将用户的主机名泄露到远程服务器。
我们使用 Gemini CLI 对该恶意技能运行 Skill Defender:
> use the skill defender to scan current skills
结果
- 恶意技能(
vercel) – 判定:干净(0 条发现) - 扫描器本身(
skill-defender) – 判定:危险(20 条发现)
(replace with the actual image URL if available)
经验教训
| 扫描器 | 对恶意技能的判定 | 对扫描器本身的判定 |
|---|---|---|
| SkillGuard | 恶意(自身) | — |
| Skill Defender | 干净(假阴性) | 危险(20 条发现) |
| Agent Tinman | 未显示 | 未显示 |
此表突显了悖论:本应提供保护的工具本身可能成为风险的根源。
今天可以做的事
- 不要只依赖单一扫描器。 使用多个互补工具,并将它们的输出视为建议,而非最终结论。
- 采用基于行为的监控。 在运行时查找异常网络调用、意外文件写入或特权提升。
- 实现“深度防御”流水线:
- 静态分析(regex/deny‑list)——捕获低挂果。
- 语义分析(LLM‑based intent detection)——捕获细微的恶意意图。
- 运行时沙箱——隔离技能执行并记录副作用。
- 建立“扫描器的扫描器”流程。 定期审计安全工具本身,最好由独立第三方完成。
- 教育开发者和产品负责人了解基于正则的扫描的局限性以及对 AI 代理进行威胁建模的重要性。
Final thought
AI 代理放大了经典的安全困境:语言表达越丰富,枚举所有不良模式就越困难。仅仅依赖 deny‑list(黑名单)就像试图通过禁止“枪支”一词来阻止所有可能的武器。相反,应当关注 意图、上下文 和 行为——并且记住,你所信任的工具需要再次 被信任。

扫描器未能捕获实际威胁,因为我们在假 Vercel 技能中的渗漏代码未匹配其硬编码的“坏”字符串列表。然而,它却把 它自己 标记为危险,因为它的参考文件中正好包含了它用于扫描的那些“威胁模式”!
这就是经典的 “杀毒软件悖论”:扫描器看起来是恶意的,因为它知道恶意的样子,但它对任何新出现的威胁却视而不见。
转向对代理意图的行为分析
我们必须停止把 AI 安全视为“过滤不良词汇”。我们需要把它视为 行为分析。
- AI 代码就像金融债务:获取迅速,但如果你不理解条款(即提示的 意图),就会把自己逼向破产。
- 正则表达式扫描器就像拼写检查器——它确保单词拼写正确。
- 语义扫描器则像编辑器——它会问:“这句话有意义吗?它是否在告诉用户做危险的事?”
3. Ferret Scan:仍局限于正则表达式模式
我们还查看了 Ferret Scan,一个基于 GitHub 的扫描器。它声称使用“基于深度抽象语法树的分析”结合正则表达式。虽然比 ClawHub 原生工具显著更好,但它仍然难以处理自然语言攻击的细微差别。

它可以捕获硬编码的 API 密钥,但能否捕获埋在 PDF 中、要求代理进行摘要的提示注入?
Source: https://snyk.io/blog/toxicskills-malicious-ai-agent-skills-clawhub/
来自 ToxicSkills 研究的证据:上下文为王
在我们最近的 ToxicSkills research,我们发现 13.4 % 的技能包含关键安全问题。绝大多数这些问题 未 被简单的模式匹配捕获。
- 提示注入(Prompt injection): 使用 “jailbreak” 技术绕过安全过滤器的攻击。
- 混淆负载(Obfuscated payloads): 隐藏在 base64 字符串或外部下载中的代码(例如最近的
google‑qx4攻击)。 - 上下文风险(Contextual risks): 一个技能请求 “shell access” 对于开发工具可能没问题,但对 “recipe finder” 来说则是灾难性后果。
正则表达式会看到 “shell access” 并标记两者,甚至更糟的是,它可能一个也看不到,因为提示中写的是 “execute system command”。
解决方案:针对 SKILL.md 文件的 AI 原生安全
要在这种高速迭代中生存下来,你必须超越静态模式。你需要 AI 原生安全。
这就是我们构建 mcp‑scan(Snyk Evo 平台的一部分)的原因。它不仅仅是 grep 字符串;它使用专门的 LLM 来读取 SKILL.md 文件,理解技能及其相关制品(例如脚本)的能力。
运行 mcp‑scan 就像在问:
- 这个技能是否请求读取文件的权限?
- 它是否试图说服用户忽略之前的指令?
- 它是否引用了不到一周的新包(通过 Snyk Advisor)?
通过将 静态应用安全测试 (SAST) 与 基于 LLM 的意图分析 相结合,我们能够捕获 Vercel 数据外泄技能,因为我们看到的是行为(向未知端点发送数据),而不仅仅是语法。
明天要问团队的三个问题
-
“我们是否拥有所有 AI 代理使用的‘技能’的清单?”
- 如果他们说 是,请询问他们是如何找到这些技能的。如果是手动的,那就已经过时。
- 如果他们说 否,就分享 mcp‑scan 工具。
-
“我们是在为这些技能扫描 意图,还是仅仅扫描 关键字?”
- 挑战正则表达式思维。
-
“如果一个受信任的技能明天更新了带有恶意依赖的版本,会发生什么?”
- 推动持续的、而非一次性的扫描。
不要让“安全表演”给你一种虚假的安全感。代理很聪明;你的安全必须更聪明。