恶意 skill 往往不含「代码」
我们之前写过安装 skill 前要扫描。@DFIR_Radar 转述的 VirusTotal 分析补上了一个更细的角度:人眼看不到,agent 却逐字读到。
按帖中数据,VirusTotal 分析了 35,878 个提交的 skill,其中 6,637 个恶意 skill 里,62% 根本不含恶意代码——载荷就是写在 SKILL.md 说明文字里的自然语言指令。只有 90 个(约 1.4%)还会刻意隐藏这些文字。
三种藏法
- 空白行填充(56 个):在指令前塞 78 到 825 行「空行」(很多其实填满了空格),审查者滚到一半就停了,截断长输入的静态扫描器也读不到结尾。
- HTML 注释(28 个):GitHub、插件市场和编辑器的 Markdown 预览会隐藏
<!-- -->,但 agent 读的是原始文件。帖中举例有 skill 以「凭据轮换校验」为名,要求把 API key 和 token 发往外部地址,还明确要求 agent 不要告诉用户。 - 不可见 Unicode(6 个):Unicode tag 字符(U+E0000–U+E007F)、零宽字符(U+200B/200C/200D)在编辑器里显示为空,但部分模型会当文字处理。
更麻烦的是持久化
帖中提到,部分 skill 会让 agent 往 MEMORY.md、AGENTS.md、CLAUDE.md 等文件写内容。写进去的指令在 skill 删除后依然存在,持续影响之后的会话。
可执行清单
- 看原始字节,不看渲染预览:用
cat -A或编辑器的「显示不可见字符」打开 SKILL.md,一直翻到文件末尾。 - 先去掉零宽字符、检出 tag 字符,再做关键词扫描或交给 LLM 审查,否则「API keys」「Do not inform the user」这类规则会被混淆绕过。
- grep 可疑模式:
<!--、curl ... | bash、陌生域名、「不要告诉用户」。 - 把 CLAUDE.md、MEMORY.md、AGENTS.md 当受保护文件:在 Claude Code 里给这些路径的编辑写 ask 或 deny 规则,任何 skill 想改都得经过你。
- 发现可疑 skill 后,除了卸载,还要检查上述文件有没有被追加内容,并轮换可能暴露的密钥。
如果你想把 Claude Code 放在一台常开、整机独享的新加坡 Mac mini 上长期运行,可以了解 Zumac.Ai,咨询 Telegram @singatao。
