SkillSieve 精读笔记

论文标题: SkillSieve: A Hierarchical Triage Framework for Detecting Malicious AI Agent Skills
arXiv: 2604.06550 | 2026-04-09
作者: Yinghan Hou(Imperial College London)· Zongyou Yang(UCL)— 同等贡献
关键词: AI agent 安全、供应链安全、恶意技能检测、LLM 分析、技能市场


目录

  1. 研究背景与问题定义
  2. 威胁模型
  3. 技术架构全图
  4. 方法设计详解
  5. 数据集构建
  6. 评估与对比实验
  7. 消融分析:SSD vs 单一Prompt
  8. 对抗鲁棒性测试
  9. 效率与边缘部署
  10. 陪审团动态分析
  11. 局限性与未来工作
  12. 核心贡献总结

1. 研究背景与问题定义

1.1 AI 技能市场的规模与风险

AI 编程 Agent(如 OpenClaw、Claude Code、Cursor)通过「技能(Skill)」扩展能力:

  • 一个技能包 = SKILL.md(自然语言指令)+ 可选的 scripts/ 目录(可执行代码)
  • ClawHub 截至 2026 年初托管 13,000+ 个技能,任何人可发布,无强制审查

已知攻击活动:

活动名称 时间 规模 方式
ClawHavoc 攻击活动 2026年1-2月 341个恶意技能(335来自同一团伙) 仿名攻击 + 跨文件逻辑分割 + Webhook外泄凭证
Atomic macOS Stealer 2026 若干 伪装成实用工具散发 AMOS 信息窃取程序
加密货币技能活动 2026 若干 窃取钱包密钥和交易所 API 凭证

漏洞率统计:

  • Snyk ToxicSkills 审计:13.4% 的技能含至少一个严重安全问题
  • 独立研究(42,447个技能):漏洞率 26.1%

1.2 现有方案的缺陷

技能包 = 代码(scripts/) + 自然语言(SKILL.md)
                │                        │
     形式化静态分析能处理          Regex 扫描能处理
     (SkillFortify)             (ClawVet)
                │                        │
         ✅ 高F1 (96.95%)          ✅ 零成本
         ❌ 看不懂自然语言          ❌ 跨文件分割即绕过

根本矛盾: 没有一种工具能同时处理"代码"和"自然语言指令"这两种模态。


2. 威胁模型

攻击者目标

  • 凭证窃取(API Key、Token、SSH Key、.env 文件)
  • 数据外泄(将本地数据发送至攻击者控制的服务器)
  • 远程代码执行(建立反向 Shell、下载额外载荷)
  • 社会工程学(诱使 Agent 授予更高权限)

5 类逃逸技术

编号 技术 描述
E1 编码混淆 Base64/Hex 编码恶意命令
E2 跨文件逻辑分割 恶意行为分散在 SKILL.md 和多个脚本中
E3 条件触发 仅在特定环境变量/用户名/时间条件下激活
E4 同形字替换 Unicode 视觉欺骗(仿名攻击)
E5 延时载荷 潜伏数天后才激活

防御者约束

  • 仅进行静态分析(不执行代码)
  • 可调用 LLM API 进行语义分析
  • 需平衡:高召回率 / 合理精确率 / 可控成本

3. 技术架构全图

                    ┌─────────────────────────────────┐
                    │         技能包 (Skill Package)    │
                    │  SKILL.md + scripts/*.py/.sh/.js  │
                    └──────────────┬──────────────────-┘
                                   │
                    ┌──────────────▼──────────────────-┐
                    │        LAYER 1:静态分流           │
                    │    ⏱ 平均 39ms  💰 零API成本       │
                    │                                   │
                    │  ┌──────────┐  ┌──────────────┐  │
                    │  │Module A  │  │  Module B    │  │
                    │  │Regex规则 │  │ AST特征提取  │  │
                    │  │~60条规则 │  │ tree-sitter  │  │
                    │  └──────────┘  └──────────────┘  │
                    │  ┌──────────┐  ┌──────────────┐  │
                    │  │Module C  │  │  Module D    │  │
                    │  │元数据信誉 │  │SKILL.md统计  │  │
                    │  │仿名检测  │  │ 表面特征     │  │
                    │  └──────────┘  └──────────────┘  │
                    │         ↓ 15个特征向量              │
                    │    XGBoost启发式加权评分器          │
                    │         风险分 r ∈ [0,1]           │
                    └──────────────┬──────────────────-┘
                                   │
               ┌───────────────────┼──────────────────────┐
               │ r < 0.3           │                       │
               ▼                   │ r ≥ 0.3               │
         ✅ 直接放行                │                       │
        (~86% 良性)               │                       │
                    ┌──────────────▼──────────────────-┐  │
                    │       LAYER 2:结构化语义分解       │  │
                    │  SSD (Structured Semantic Decomp) │  │
                    │  ⏱ 2-5s(4任务并行,取最长)        │  │
                    │                                   │  │
                    │  ┌──────────────────────────────┐ │  │
                    │  │  Task A(意图对齐)  w=0.35   │ │  │
                    │  │  声称功能 vs 实际指令是否一致   │ │  │
                    │  └──────────────────────────────┘ │  │
                    │  ┌──────────────────────────────┐ │  │
                    │  │  Task B(权限合理性)w=0.25   │ │  │
                    │  │  申请权限是否与功能相符        │ │  │
                    │  └──────────────────────────────┘ │  │
                    │  ┌──────────────────────────────┐ │  │
                    │  │  Task C(隐蔽行为检测)w=0.25 │ │  │
                    │  │  是否有隐藏指令/绕过安全机制   │ │  │
                    │  └──────────────────────────────┘ │  │
                    │  ┌──────────────────────────────┐ │  │
                    │  │  Task D(跨文件一致性)w=0.15 │ │  │
                    │  │  代码是否与SKILL.md描述一致    │ │  │
                    │  └──────────────────────────────┘ │  │
                    │  R2 = 0.35·sA+0.25·sB+0.25·sC+0.15·sD │  │
                    └──────────────┬──────────────────-┘  │
                                   │                       │
               ┌───────────────────┼──────────────────────┘
               │ R2 < 0.4          │
               ▼                   │ R2 ≥ 0.4
         ✅ 放行                   │
                    ┌──────────────▼──────────────────-┐
                    │       LAYER 3:多LLM陪审团裁决     │
                    │                                   │
                    │  3个不同厂商LLM(独立投票)         │
                    │  ┌──────┐ ┌──────────┐ ┌───────┐ │
                    │  │Kimi  │ │MiniMax   │ │DeepSeek│ │
                    │  │2.5   │ │M2.7      │ │-V3    │ │
                    │  └──────┘ └──────────┘ └───────┘ │
                    │       ↓ Round 1:独立投票           │
                    │  一致 ────────────────→ 裁决        │
                    │  分歧 ────→ Round 2:结构化辩论      │
                    │             ↓                      │
                    │  多数(≥2/3) → 裁决                  │
                    │  无多数 ────→ 人工复审               │
                    └──────────────┬──────────────────-┘
                                   │
                    ┌──────────────▼──────────────────-┐
                    │         可解释报告输出              │
                    │  攻击类型 + 三层证据链 + 建议行动   │
                    └─────────────────────────────────-┘

4. 方法设计详解

4.1 Layer 1:静态分流

Module A — Pattern Matching(正则规则)

约 60 条 Regex 规则,覆盖 5 类威胁:

类别 检测目标
反向 Shell 特征 bash -i, nc, /dev/tcp
凭证窃取模式 os.environ, .env, ~/.ssh 访问
数据外泄指示符 curl/wget 发送 POST 到外部域名
代码混淆标记 base64_decode, eval(atob()), hex 编码
Prompt 注入关键词 “do not tell”, “ignore previous”, “must”

规则以 YAML 格式存储,不区分大小写,可扩展

Module B — AST Feature Extraction(抽象语法树)

使用 tree-sitter 解析 Python/Bash/JavaScript,提取特征向量:

  • 系统调用次数
  • 网络操作次数
  • 环境变量访问次数
  • 动态执行调用(eval/exec/subprocess)
  • 编码字符串字面量数量
  • 字符串常量的 Shannon 熵(高熵 → 可能混淆)
Module C — Metadata Reputation(元数据信誉)

从 SKILL.md YAML frontmatter 提取:

  • 技能名与 Top-100 热门技能名的最小 Levenshtein 距离(检测仿名)
  • 是否申请敏感环境变量(含 keytokensecret 关键词)
  • 是否依赖危险二进制(curlwgetnc 等)
Module D — SKILL.md 表面统计(无需 LLM)
  • 指令总长度
  • 外部 URL 数量
  • 权限申请数量
  • 敏感文件路径提及(~/.env~/.ssh
  • 紧迫性语言密度(“immediately”、“must”、“do not tell”)
  • 指令长度与描述长度之比
分类器选择

从 31 个候选特征中选出 15 个,训练 XGBoost 分类器:

  • 训练集:1,401 个标注技能(608 恶意,793 良性)
  • 5 折交叉验证 F1:0.959(训练集内)
  • 但因训练集恶意样本分布偏斜(集中在 3 个已知恶意作者),对异质性强的测试集泛化差(F1=0.677)
  • 最终使用加权启发式评分器(F1=0.733),优于 XGBoost 泛化表现
  • 阈值 τ=0.3:r < 0.3 放行,r ≥ 0.3 升级 Layer 2

4.2 Layer 2:结构化语义分解(SSD)

核心洞察: 整体问"这个技能安全吗"→ 不可靠;分解为 4 个聚焦子问题 → 更准确且可解释。

四个并行子任务
任务 权重 检测目标 捕获攻击类型
Task A:意图对齐 0.35 名称/描述与实际指令是否匹配? 伪装攻击
Task B:权限合理性 0.25 所申请权限是否与功能必要? 过权限技能
Task C:隐蔽行为 0.25 是否有隐藏行动/绕过安全机制的指令? 社会工程
Task D:跨文件一致性 0.15 scripts/ 代码是否与 SKILL.md 描述一致? 分割逻辑攻击

意图对齐(Task A)权重最高(0.35),因为它是伪装攻击的最强判别器。

Prompt 设计结构

每个子任务 Prompt 包含五部分:

  1. 系统角色:安全分析师
  2. 完整技能内容(SKILL.md + scripts)
  3. Layer 1 的标记(作为上下文,引导 LLM 聚焦)
  4. 任务专属分析指令
  5. 严格的 JSON 输出 Schema(风险分 + 证据引用 + 等级评级)
聚合公式

R 2 = 0.35 ⋅ s A + 0.25 ⋅ s B + 0.25 ⋅ s C + 0.15 ⋅ s D R_2 = 0.35 \cdot s_A + 0.25 \cdot s_B + 0.25 \cdot s_C + 0.15 \cdot s_D R2=0.35sA+0.25sB+0.25sC+0.15sD

  • R 2 ≥ 0.4 R_2 \geq 0.4 R20.4 → 升级 Layer 3
  • 四个任务并行执行,总延迟 = max(单任务延迟) ≈ 2–5 秒

4.3 Layer 3:多 LLM 陪审团协议

核心洞察: 单个 LLM 对安全判断存在系统性偏差,且偏差方向因模型不同而异。

两轮协议

Round 1:独立投票

  • 3 个不同厂商 LLM 独立分析:Kimi 2.5(Moonshot AI)、MiniMax M2.7、DeepSeek-V3(百度千帆)
  • 每个陪审员输出结构化 JSON:SAFE / MALICIOUS + 置信度 + 攻击类型 + 证据 + 推理
  • 若三票一致 → 直接裁决

Round 2:结构化辩论

  • 若存在分歧 → 每个陪审员看到其他陪审员的推理和证据
  • 每人必须明确回应反方论点,维持或改变立场
  • ≥ 2/3 多数票 → 裁决;无多数 → 标记人工复审
可解释报告

恶意判决输出结构化报告:

  • 攻击类型分类
  • 三层证据链(L1 静态发现 → L2 语义发现 → L3 陪审员意见)
  • 建议行动(阻断 / 上报 / 升级)

5. 数据集构建

数据来源

来源 规模 说明
ClawHub 完整存档 49,592 个技能包 2026-04-04 快照,16,797 位作者
Snyk ToxicSkills 若干 已知攻击载荷的恶意技能样本
ClawHavoc 样本 若干 通过 prompt-security/clawsec 安全公告识别
人工标注集 400 个技能 89 恶意 + 311 良性,157 分歧由人工解决

标注体系

每个技能获得三个注释:

  1. 二元标签:良性 / 恶意
  2. 攻击类型多标签:7 类(Prompt 注入、凭证窃取、远程执行、数据外泄、仿名攻击、混淆、社会工程)
  3. 隐蔽等级:1(明文恶意命令)到 5(高级混淆 + 条件触发)

对抗样本

5 类逃逸技术各 20 个样本(共 100 个),统一使用凭证窃取载荷注入良性模板。


6. 评估与对比实验

6.1 实验环境

  • 硬件: Orange Pi AIpro(ARM64,4核,24GB LPDDR4X RAM,无 GPU)
  • 成本: $440(单板计算机,刻意选择低端硬件验证可行性)
  • Layer 2/3 LLM: Kimi 2.5(Moonshot AI)+ MiniMax M2.7 + DeepSeek-V3(百度千帆)

6.2 主要结果(Table 1)

测试集:400 个标注技能(89 恶意 + 311 良性)

方法 精确率 P 召回率 R F1 准确率 Acc 误报率 FPR
ClawVet(Regex) 0.329 0.584 0.421 0.642 0.341
SkillSieve L1(仅静态) 0.583 0.989 0.733 0.840 0.203
L1 + Single Prompt 1.000 0.596 0.746 0.910 0.000
L1 + SSD(本文) 0.752 0.854 0.800 0.905 0.080

关键观察:

  • ClawVet 精确率极低(0.329),大量误报,因为 Regex 不管上下文,随便匹配
  • Layer 1 单独 召回率接近完美(0.989),但误报率 20.3%(每5个良性就误标1个)
  • L1 + Single Prompt 精确率满分(零误报),但漏检 36 个恶意技能(召回仅 0.596)
  • L1 + SSD(本文) 在精度和召回间取得最佳平衡,F1=0.800

成本分析:

  • 86% 的技能在 Layer 1 免费解决
  • 剩余 14% 进 LLM 分析
  • 平均每个技能成本:$0.006(若全量 LLM 扫描则 $0.01/个)
  • Layer 2 修正了 Layer 1 标错的 63 个良性技能中的 38 个

7. 消融分析:SSD vs 单一 Prompt

同样使用 Kimi 2.5,L1+SSD vs L1+Single-prompt 的差距:

SSD 比单一 Prompt 多检测出 23 个真实威胁,以下 3 个典型案例说明原因:

案例 1:伪装 DeFi 工具(maxxit-lazy-trading)

  • Single Prompt 判断: “合法的 DeFi 交易自动化,使用了文档化的 API” → 标记为良性
  • SSD 发现:
    • Task B(权限合理性):技能申请了 OPENAI_API_KEY,但完全没有 AI 功能
    • Task C(隐蔽行为):检测到指令要求「抑制交易日志记录」

案例 2:伪身份服务(verified-agent-identity-5)

  • Single Prompt 判断: “合法的去中心化身份管理工具” → 标记为良性
  • SSD 发现:
    • Task A(意图对齐):描述声称是「身份验证」,但指令实际是让 Agent 收集和传输私钥

案例 3:区块链游戏包装(botcoin)

  • Single Prompt 判断: “有透明代币经济学的区块链游戏” → 标记为良性
  • SSD 发现:
    • Task D(跨文件一致性):setup 脚本执行了 SKILL.md 未描述的操作——将环境变量导出至外部端点

规律: Single Prompt 评估技能的「声称目的」并认为可信,而 SSD 对每个安全维度独立检查,捕获了整体判断遗漏的失配。


8. 对抗鲁棒性测试

Table 2:5 种逃逸技术的逐层拦截分析

逃逸技术 L1 分数 拦截层 L1 命中规则
编码混淆 0.35 L1 + L2 obfuscation
跨文件分割 0.40 L1 + L2 credential_theft
条件触发 0.70 L1 conditional_trigger
同形字替换 0.80 L1 + L2 prompt_injection
延时载荷 0.70 L1 time_delay

三种拦截模式:

强 L1 信号(score ≥ 0.70)

  • 条件触发 & 延时载荷含有独特代码结构(if os.environ.get(time.time() -),Regex 可靠捕获
  • Layer 2 确认但非必须

中等 L1 信号(score 0.35–0.40)

  • 编码混淆 & 跨文件分割静态信号较弱
  • Layer 1 标记但置信度低,需要 Layer 2 语义分析才能确认
  • Base64 解码后的命令或跨文件数据流才能被识别为攻击

复合攻击(score 0.80)

  • 同形字替换单独使用(纯名称攻击,内容良性)本可逃避内容分析
  • 但真实世界的仿名攻击往往将名称伪装与恶意载荷结合
  • 测试案例:隐藏的凭证窃取 → 同时触发元数据(非 ASCII 名称)和内容规则(prompt injection)
  • 复合信号极强,Score=0.80

大规模验证: 100 个对抗样本(每类 20 个),全部被正确检测,拦截率 100%


9. 效率与边缘部署

Table 3:效率对比

指标 ClawVet SkillFortify VirusTotal Code Insight SkillSieve
平均延迟/技能 ~1s ~5s ~3s 38.8ms†
平均成本/技能 $0 $0 ~$0.01 ~$0.006†
需要 GPU 否(可选)

† 分层架构均摊效果:86%×$0 + 14%×$0.04 ≈ $0.006/技能

全量扫描成本对比:

  • 49,592 个技能 × $0.01(单 LLM)= $496
  • SkillSieve 分层后:≈ $297(节省 1.7×)

Table 4:边缘部署结果(Orange Pi AIpro)

指标 数值
扫描总量 49,592 个技能
总扫描时间 1,863 秒(31 分钟)
平均延迟/技能 38.8 ms
P95 延迟 126.6 ms
标记可疑数量 6,871(13.86%)
解析失败 1,623(3.27%)
硬件成本 $440
Layer 1 API 成本 $0

关键发现:

  • Layer 1 标记的 13.86% 与 Snyk 独立审计的 13.4% 高度吻合,验证了分层过滤的准确性
  • 仅 6,871 个技能需要 LLM 分析(而非全部 49,592),节省 7.2 倍成本

Pattern 命中分布(Layer 1,49,592 个技能):

规则类别 命中次数
混淆(obfuscation) 35,705(主因:base64 编码字符串)
数据外泄 6,451
社会工程 2,652
凭证窃取 598
Prompt 注入 484
反向 Shell 33

已知恶意作者验证:

  • hightower6eu(354 个技能)被全部标记
  • 13 个已知恶意技能经 Layer 2 分析 → 全部正确分类为恶意(召回率 100%,平均置信度 0.91)
  • 技术特征:hightower6eu 用社会工程(伪 “openclaw-agent” 下载链接);moonshine-100rze 嵌入 Base64 编码的反向 Shell

10. 陪审团动态分析

在 Layer 2 置信度介于 0.25~0.75 的 20 个边界样本上运行完整三层流程:

Table 5:Layer 3 陪审团动态(20 个边界样本)

结果 数量
Round 1 一致(无辩论) 11
触发辩论(Round 2) 7
— 辩论后达成一致 3
— 多数票决定 2
— 争议升级人工 2

分析:

  • 辩论机制在 38.9% 的陪审会议中被触发(7/18)
  • 3 个案例中,异见陪审员在看到其他人的证据后改变立场,达成一致
  • 2 个被升级人工复审的案例(verified-agent-identity-5openviking-context-database)恰好是人工标注者也感到困难的案例 → 陪审团不确定性与真实歧义高度相关,而非模型失误

11. 局限性与未来工作

局限性 描述
运行时盲区 静态分析无法捕获运行时从远程 URL 动态拉取的恶意载荷
延时载荷最难 恶意逻辑在扫描时处于休眠状态,所有静态方法都面临此挑战
LLM 非确定性 Layer 2/3 依赖 LLM API,输出非确定(论文使用 temperature=0 缓解)
训练集偏斜 恶意样本集中于少数已知作者,XGBoost 模型泛化差,需要更多样化标注数据
评估集规模 400 个标注样本对安全场景而言仍有限
LLM 对抗绕过 攻击者可能针对性研究如何欺骗 LLM 判断

12. 核心贡献总结

三大技术创新

1. 分层分流架构(Hierarchical Triage)

  • 廉价静态分析过滤 ~86% 良性技能
  • 只对真正可疑的 ~14% 调用 LLM API
  • 成本从 $0.01/技能降至 $0.006/技能

2. 结构化语义分解(SSD)

  • 将"是否恶意"分解为 4 个聚焦子任务并行执行
  • 每个子任务独立可评估,提升可解释性
  • 比单一 Prompt 多捕获 23 个真实威胁(F1: 0.746 → 0.800)

3. 多 LLM 陪审团协议(Multi-LLM Jury)

  • 3 个不同厂商模型消除单模型盲点
  • 结构化辩论机制处理歧义案例
  • 陪审团不确定性与真实歧义高度相关

性能对比一览

F1 Score 对比(400标注测试集):

ClawVet          ████░░░░░░░░░░░░░░░░  0.421
SkillSieve L1    ████████████████░░░░  0.733
L1+SinglePrompt  ██████████████████░░  0.746
L1+SSD (本文)    ████████████████████  0.800
                 0                    1.0

开源资源

  • 代码、数据集、400 个标注测试集已全部开源
  • 49,592 真实 ClawHub 技能存档(2026-04-04 快照)

论文链接: https://arxiv.org/abs/2604.06550
生成时间: 2026-04-09

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐