首页/文章/Skill 文件「看起来很干净」?恶意指令可能藏在几百行空白、HTML 注释和不可见字符里

Skill 文件「看起来很干净」?恶意指令可能藏在几百行空白、HTML 注释和不可见字符里

· Zumac.Ai

恶意 skill 往往不含「代码」

我们之前写过安装 skill 前要扫描。@DFIR_Radar 转述的 VirusTotal 分析补上了一个更细的角度:人眼看不到,agent 却逐字读到。

按帖中数据,VirusTotal 分析了 35,878 个提交的 skill,其中 6,637 个恶意 skill 里,62% 根本不含恶意代码——载荷就是写在 SKILL.md 说明文字里的自然语言指令。只有 90 个(约 1.4%)还会刻意隐藏这些文字。

三种藏法

  1. 空白行填充(56 个):在指令前塞 78 到 825 行「空行」(很多其实填满了空格),审查者滚到一半就停了,截断长输入的静态扫描器也读不到结尾。
  2. HTML 注释(28 个):GitHub、插件市场和编辑器的 Markdown 预览会隐藏 <!-- -->,但 agent 读的是原始文件。帖中举例有 skill 以「凭据轮换校验」为名,要求把 API key 和 token 发往外部地址,还明确要求 agent 不要告诉用户。
  3. 不可见 Unicode(6 个):Unicode tag 字符(U+E0000–U+E007F)、零宽字符(U+200B/200C/200D)在编辑器里显示为空,但部分模型会当文字处理。

更麻烦的是持久化

帖中提到,部分 skill 会让 agent 往 MEMORY.md、AGENTS.md、CLAUDE.md 等文件写内容。写进去的指令在 skill 删除后依然存在,持续影响之后的会话。

可执行清单

  1. 看原始字节,不看渲染预览:用 cat -A 或编辑器的「显示不可见字符」打开 SKILL.md,一直翻到文件末尾。
  2. 先去掉零宽字符、检出 tag 字符,再做关键词扫描或交给 LLM 审查,否则「API keys」「Do not inform the user」这类规则会被混淆绕过。
  3. grep 可疑模式:<!--、curl ... | bash、陌生域名、「不要告诉用户」。
  4. 把 CLAUDE.md、MEMORY.md、AGENTS.md 当受保护文件:在 Claude Code 里给这些路径的编辑写 ask 或 deny 规则,任何 skill 想改都得经过你。
  5. 发现可疑 skill 后,除了卸载,还要检查上述文件有没有被追加内容,并轮换可能暴露的密钥。

如果你想把 Claude Code 放在一台常开、整机独享的新加坡 Mac mini 上长期运行,可以了解 Zumac.Ai,咨询 Telegram @singatao。

来源

Zumac.Ai 新加坡 Mac mini M6,整机独享,¥999/月起,联系 Telegram @singatao。
查看方案与费用 · 帮助中心

返回首页 · 更多文章

Telegram 客服