为什么你的“Skill Scanner”只是一种虚假安全感(甚至可能是恶意软件)

发布: (2026年2月12日 GMT+8 10:00)
14 分钟阅读
原文: Dev.to

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:

案例研究:我们让社区扫描器对抗真实恶意软件

我们测试了最流行的社区“技能扫描器”,使用一个自定义的“半恶意”技能,看看它们能否分辨友好与敌对。评估的工具包括:

  1. SkillGuard
  2. Skill Defender
  3. Agent Tinman

1. SkillGuard – 实际上是恶意软件的扫描器

我们的第一个对象是 SkillGuard(作者 c-goro)。宣传口号?轻量级的技能扫描器。实际情况?一个陷阱。

SkillGuard UI

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

Malicious payload attempt

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

SkillGuard removal notice

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 条发现)

Skill Defender scan results (replace with the actual image URL if available)

经验教训

扫描器对恶意技能的判定对扫描器本身的判定
SkillGuard恶意(自身)
Skill Defender干净(假阴性)危险(20 条发现)
Agent Tinman未显示未显示

此表突显了悖论:本应提供保护的工具本身可能成为风险的根源。

今天可以做的事

  1. 不要只依赖单一扫描器。 使用多个互补工具,并将它们的输出视为建议,而非最终结论。
  2. 采用基于行为的监控。 在运行时查找异常网络调用、意外文件写入或特权提升。
  3. 实现“深度防御”流水线:
    • 静态分析(regex/deny‑list)——捕获低挂果。
    • 语义分析(LLM‑based intent detection)——捕获细微的恶意意图。
    • 运行时沙箱——隔离技能执行并记录副作用。
  4. 建立“扫描器的扫描器”流程。 定期审计安全工具本身,最好由独立第三方完成。
  5. 教育开发者和产品负责人了解基于正则的扫描的局限性以及对 AI 代理进行威胁建模的重要性。

Final thought

AI 代理放大了经典的安全困境:语言表达越丰富,枚举所有不良模式就越困难。仅仅依赖 deny‑list(黑名单)就像试图通过禁止“枪支”一词来阻止所有可能的武器。相反,应当关注 意图上下文行为——并且记住,你所信任的工具需要再次 被信任

Scanner failure illustration

扫描器未能捕获实际威胁,因为我们在假 Vercel 技能中的渗漏代码未匹配其硬编码的“坏”字符串列表。然而,它却把 它自己 标记为危险,因为它的参考文件中正好包含了它用于扫描的那些“威胁模式”!

这就是经典的 “杀毒软件悖论”:扫描器看起来是恶意的,因为它知道恶意的样子,但它对任何新出现的威胁却视而不见。

转向对代理意图的行为分析

我们必须停止把 AI 安全视为“过滤不良词汇”。我们需要把它视为 行为分析

  • AI 代码就像金融债务:获取迅速,但如果你不理解条款(即提示的 意图),就会把自己逼向破产。
  • 正则表达式扫描器就像拼写检查器——它确保单词拼写正确。
  • 语义扫描器则像编辑器——它会问:“这句话有意义吗?它是否在告诉用户做危险的事?”

3. Ferret Scan:仍局限于正则表达式模式

我们还查看了 Ferret Scan,一个基于 GitHub 的扫描器。它声称使用“基于深度抽象语法树的分析”结合正则表达式。虽然比 ClawHub 原生工具显著更好,但它仍然难以处理自然语言攻击的细微差别。

Ferret Scan example

它可以捕获硬编码的 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 数据外泄技能,因为我们看到的是行为(向未知端点发送数据),而不仅仅是语法。

明天要问团队的三个问题

  1. “我们是否拥有所有 AI 代理使用的‘技能’的清单?”

    • 如果他们说 ,请询问他们是如何找到这些技能的。如果是手动的,那就已经过时。
    • 如果他们说 ,就分享 mcp‑scan 工具。
  2. “我们是在为这些技能扫描 意图,还是仅仅扫描 关键字?”

    • 挑战正则表达式思维。
  3. “如果一个受信任的技能明天更新了带有恶意依赖的版本,会发生什么?”

    • 推动持续的、而非一次性的扫描。

不要让“安全表演”给你一种虚假的安全感。代理很聪明;你的安全必须更聪明。

了解 Snyk 的 Evo 如何为代理 AI 带来统一控制

0 浏览
Back to Blog

相关文章

阅读更多 »

FunctionGemma 微调指南

2026年1月16日 在Agentic AI的世界中,调用工具的能力将自然语言转换为可执行的软件操作。上个月我们发布了…