Skip to content

Agent Skill 文件安装前检测:SkillGate 的分层筛查方法 ​

摘要 ​

编码 Agent 的 Skill 通常是可被模型读取并遵循的 Markdown 指令文件。它不一定包含传统恶意代码,却可以要求 Agent 读取凭据、修改启动文件、植入生成代码或把任务转向攻击者基础设施。SkillGate 把这类文件视为高权限供应链制品,在安装进入 Agent 上下文前执行筛查。

论文在包含 1,650 个 Skill 文件的 SkillsBench 上报告 F1 为 0.817、召回率为 0.769、误报率为 1.13%。混合方案只把正则命中的局部片段交给 LLM 判定,较全文件 LLM 扫描减少约 77% 输入 Token。结果支持“静态高召回预筛 + 语义复核 + 安装策略”作为第一道控制,但不证明已覆盖真实生态中的新型混淆或持续更新攻击。

六个月回溯补充了真实生态测量:“Do Not Mention This to the User” 从两个社区 Registry 索引的 98,380 个 Skill 中,经静态初筛、隔离执行和人工复核确认 157 个恶意 Skill。它说明真实威胁同时包含可执行代码和自然语言指令,且单靠人工可见描述、正则或单次静态评分不足以支撑安装决定。

核心创新与差异 ​

原研究贡献是提出安装时安全网关:先用 530 个匹配模式筛查,再提取命中片段交给 LLM 判断,最后由策略引擎允许、提示或阻断安装;同时发布 SkillsBench 和代码。

本站分析认为,Skill 文件不是普通文档,而是能够改变 Agent 行为的可执行语义制品。现有恶意包扫描通常检查源代码和安装脚本,SkillGate 关注的是“自然语言指令是否会让 Agent 在后续任务中执行危险动作”,因此主归 A3.3 Tool、插件与 Server 分发安全,而不是运行时 Tool Use。

与全文件 LLM 审查相比,片段化判定降低了成本和无关上下文;与纯正则工具相比,LLM 可以结合上下文区分示例、文档和真实操作指令。但该组合仍受规则覆盖和判定模型稳定性制约。

威胁模型与攻击链 ​

攻击者能够向公共 Registry、Git 仓库或其他分发渠道发布 Skill 文件,并诱导开发者安装。攻击者不需要先攻陷模型服务或 Agent Runtime。

  1. 开发者从不可信来源安装 Skill。
  2. Agent 将 Skill 内容加载到本地指令或工具上下文中。
  3. 恶意指令要求读取云凭据、修改持久化配置、污染生成代码或访问外部服务。
  4. Agent 在后续正常任务中把这些指令当成可信工作规范执行。
  5. 数据泄露、持久化或代码完整性破坏发生时,行为可能被误归因为模型自主决策。

最先失效的是 Skill 制品的来源与安装审查。SkillGate 位于 Registry 到 Agent 的信任交接处;安装后的权限隔离、网络策略和运行审计仍需由其他控制承担。

实验设计与实际过程 ​

以下均为论文作者实验,本站未独立复现。SkillsBench 共 1,650 个文件,其中 150 个是人工构造的恶意样本,1,500 个是良性样本。默认流程对全部文件执行正则预筛,只把命中窗口发送给 GPT-5.4-mini 判定;三次运行用于测量 LLM 非确定性带来的波动。

对照包括 ClawVet、SkillScanner 和对所有文件执行完整 LLM 检查的 SkillScanner+LLM。指标包括 AUPRC、精确率、召回率、F1、MCC、误报率、LLM 调用次数、输入 Token 和延迟。

关键结果与实际影响 ​

方法AUPRC召回率F1MCC误报率LLM 调用
SkillGate0.8300.7690.8170.8031.13%540
ClawVet0.1440.8930.2580.22550.40%0
SkillScanner,代表性阈值0.1620.4800.2870.20618.67%0
SkillScanner + LLM0.2460.1800.2870.3310.73%1,650

SkillGate 每轮对 540/1,650 个文件调用 LLM,输入 Token 从全文件扫描的约 302 万降至约 69 万,减少 76.9%。按预筛安全路径与 LLM 路径加权后,平均每个 Skill 的筛查延迟约 818 毫秒。

这些数字说明分层筛查在作者基准上改善了准确性和成本,但 0.769 召回率也意味着约四分之一已知恶意样本未被识别。误报主要来自文档中的 Base64 示例和环境变量引用;LLM 非确定性又会使每轮误报集合变化。

半年回溯新增证据 ​

“Do Not Mention This to the User” 提供了与 SkillsBench 人工样本不同的真实生态证据。作者从 skills.rest 和 skillsmp.com 索引的公开 GitHub 内容收集 98,380 个 Skill;14 类静态模式命中 4,287 个候选,隔离容器中的多轮动态验证留下 762 个待人工复核项,最终确认 157 个恶意 Skill、632 个独立攻击行为,覆盖 13 种技术和 6 个攻击阶段。每个恶意 Skill 平均包含 4.03 个攻击行为,54.1% 的样本来自一个使用品牌仿冒模板批量发布的行为主体。协调披露后,两个 Registry 移除了全部 157 个被报告条目。

该研究的动态验证流水线在 150 个良性与 150 个恶意样本的平衡评测集上报告 99.6% 精确率,但不能据此估算整个生态的真实恶意率。两个 Registry 只是公开仓库索引,不代表安装量或实际执行量;未命中静态模式的 94,093 个 Skill 没有全部动态运行,休眠触发器、外部依赖和条件载荷仍可能漏检。因此 157/98,380 是作者确认的下限,不是生态发生率,Registry 移除也不等同于已从用户本地环境撤销。

2026 年 2 月的 Scary Agent Skills 给出端到端演示:研究者把不可见 Unicode Tag 指令加入正常 SKILL.md,Claude Code 在启用 Bash 自动批准的测试配置中读取隐藏指令并执行命令。该攻击直接针对人工文本审查的可见性假设。作者随后观察到 Claude Code 对同类字符出现检测和拒绝,但 claude.ai 的 Skill 路径当时仍可触发;这说明模型侧缓解随产品和时间变化,不能替代安装时规范化、不可见字符检测与执行权限控制。作者发布的 aid 扫描器能解码连续 Unicode Tag,但没有给出系统化召回率和误报率。

SkillJack 采用不同威胁模型:攻击者不发布 Skill,也不能写入 Skill 库,而是让恶意经验进入自进化 Agent 的提炼语料。最先失效的是经验晋升为行为制品时的来源传播与生命周期控制,不是 Registry 到 Agent 的安装审查,因此单独归入 A5.2。详见自进化 Agent 的经验到 Skill 持久后门。

两项扫描研究补充了静态文件检测的适用范围。SkillSentry 在 Honey World 中对启用/禁用 Skill 做配对执行,在三个公开基准上报告 HarmfulSkillBench 召回率 99.50%,两个混合基准平均 F1 为 96.26%、平均误报率为 3.24%;去掉 Honey Resource 后平均 F1 降至 85.48%,说明动态诱饵与差分执行提供了主要增量。Seeing Is Not Screening 针对图像承载的隐藏指令,报告基线扫描器攻击成功率为 78% 至 100%,执行语义扫描器 EXECSCAN 将三种攻击变体降至 8%、31% 和 17%,但自身误报率仍为 27.4%。两篇论文均为作者实验,尚无独立复现,模型、Skill 来源、模拟环境和攻击变体有限。

防护措施与验证方法 ​

  • 安装前验证发布身份、固定版本与摘要,再执行内容筛查;检测器不能替代来源证明。
  • 将“允许安装”和“允许读取凭据、联网、写入启动文件”拆成独立权限决定。
  • 对规则未命中但来源陌生、权限高或经过混淆的 Skill 提升到全文件人工审查。
  • 每次更新重新扫描并展示权限与指令差异,不沿用旧版本审批。
  • 运行时保留 Skill 版本、触发指令、工具调用和外联目标,支持归因与撤销。
  • 验证时同时报告恶意样本召回、良性误报、LLM 稳定性、安装延迟和对新混淆方法的覆盖。

局限与待验证问题 ​

证据等级为中等:论文有公开基准和代码,但恶意样本由研究者人工构造,不是从真实攻击活动采集;判定器只测试 GPT-5.4-mini,结果可能随模型版本和采样变化。规则对 RSA 数值编码、零宽字符等混淆存在已知漏检,也没有评测安装后更新或跨文件组合指令。

  • 真实 Registry 中的恶意 Skill 分布与人工样本相差多大?
  • 攻击者能否把危险目标拆到多个文件或外部资源,规避局部片段判定?
  • 本地小模型能否在不泄露私有 Skill 内容的条件下达到相近效果?
  • 检测结果如何与签名、权限声明、沙箱和撤销机制形成闭环?

参考链接 ​