-- 阅读之前记得关注+🌟,每天才能第一时间接收到更新 --
-- 公众号内容会定期同步到模安局网站https://moanju.org,欢迎桌面端访问收藏 --
6 月 5 日,南洋理工大学、四川大学、南开大学等机构联合发布论文《MalSkillBench: A Runtime-Verified Benchmark of Malicious Agent Skills》,系统提出了一个恶意 Skill 运行时验证基准。

https://arxiv.org/pdf/2606.07131
论文把恶意 Skill 拆解为 3 类攻击向量、15 类恶意行为、108 个有效攻击单元,并通过 Generate-Verify-Feedback 闭环生成和验证样本,最终构建了包含 3,944 个恶意 Skill 和 4,000 个良性 Skill 的基准集。

恶意 Skill 检测缺少可验证 ground truth
作者认为,当前恶意 Skill 检测面临三个评测缺口。
第一,公开 ground truth 不足。安全厂商会披露恶意样本数量和行为摘要,但通常不会公开完整样本;已有公开学术数据集规模较小。
第二,真实野外样本分布很窄,容易让检测器“看起来很强”,但实际只覆盖了少数攻击模式。
第三,不同检测工具使用各自的数据、指标和配置,无法公平比较。论文因此设计了一个统一 benchmark 和 evaluation harness,用同一批样本、同一套标签、同一组指标来横评检测器。
这也是 MalSkillBench 的定位:不是恶意样本集合,而是恶意 Skill 检测能力的度量基础设施。
三维分类体系:攻击向量 × 恶意行为 × 插入策略
标题里说的“3维攻击向量”,在论文中更准确的表达是 three-dimensional taxonomy,也就是三个正交维度:
维度 | 含义 |
|---|---|
攻击向量 v | 恶意逻辑从哪里进入 Skill |
恶意行为 b | 最终要实现什么攻击效果 |
插入策略 s | 恶意 payload 如何嵌入 Skill |
论文把一个恶意 Skill 形式化为:
Skill 本体 + 攻击向量 + 恶意行为 + 插入策略 + 运行时可观测证据
这里的关键不是“样本长得像不像恶意”,而是它是否能在 Agent 运行过程中触发预期行为,并留下可验证证据。
第一维:三类攻击向量
论文定义了三类攻击向量:CI、PI、MIXED。
1. CI:Code Injection
CI 指代码注入。恶意逻辑直接放在 Skill 的可执行脚本里,或者放在 SKILL.md 的 inline code block 中。
这类攻击最接近传统恶意包:比如数据外传、凭证窃取、远程代码执行、反弹 Shell、持久化等。
2. PI:Prompt Injection
PI 指提示注入。恶意逻辑藏在 SKILL.md 的自然语言说明里,让 Agent 改变行为。
它不一定直接包含恶意代码,而是让 Agent 自己去执行危险动作,或者改变 Agent 的身份、目标、输出策略和安全边界。
3. MIXED:混合攻击
MIXED 是论文中特别值得关注的类型。它把攻击链拆成两部分:SKILL.md 负责诱导 Agent 生成、下载或准备某个中间对象;脚本代码再消费这个对象,完成最终攻击。
也就是说,单看 markdown 不一定明显恶意,单看脚本也不一定明显恶意,攻击成立于二者的协同关系。论文明确指出,MIXED 攻击只有在 Agent 同时遵循 markdown 指令并执行协调脚本时才会显现。

第二维:15 类恶意行为
论文定义了 15 类恶意行为,其中 B1–B9 是主机侧/代码侧行为,可以通过 CI 或 PI 实现;B10–B15 是 Agent 推理与控制面行为,只能通过 PI 实现。
编号 | 行为 | 中文解释 |
|---|---|---|
B1 | Data Exfiltration | 扫描并外传文件或数据 |
B2 | Credential Theft | 窃取 API Key、SSH Key、密码、环境变量 |
B3 | Remote Code Execution | 下载并执行远程代码 |
B4 | Malware Delivery | 下载、安装并运行恶意二进制 |
B5 | Persistence | 写入 cron、bashrc、systemd 等持久化位置 |
B6 | Reverse Shell | 建立反弹 Shell |
B7 | Ransomware | 加密用户文件并勒索 |
B8 | Resource Abuse | 挖矿、DDoS、fork bomb 等资源滥用 |
B9 | Privilege Escalation | 滥用 sudo、SUID、容器逃逸等提权行为 |
B10 | Role Hijack | 通过 persona injection 替换 Agent 身份 |
B11 | Safety Bypass | 指示 Agent 忽略安全规则 |
B12 | Instruction Override | “忽略之前所有指令”类指令覆盖 |
B13 | System Prompt Leak | 诱导 Agent 泄露系统提示词 |
B14 | Goal Hijacking | 暗中改变 Agent 任务目标 |
B15 | Content Manipulation | 向输出中注入偏见、虚假或操纵性内容 |
这个分类的优点是把传统恶意软件行为和 Agent 原生控制面行为放进了同一个框架。
B1–B9 解决的是“Skill 会不会攻击主机环境”;B10–B15 解决的是“Skill 会不会攻击 Agent 的身份、目标和指令层级”。这也是后续实验中 PI 攻击更难生成、更难检测的根源之一。

第三维:插入策略
论文按照不同攻击向量定义了不同插入策略。
CI 有 4 种代码侧策略:
插入策略 | 含义 |
|---|---|
New Script File | 新增恶意脚本文件 |
Function Append | 在良性脚本后追加恶意函数 |
Function Inject | 在已有函数内部注入恶意逻辑 |
Inline Code Block | 在 SKILL.md 的代码块中嵌入恶意代码 |
PI 有 3 种自然语言策略:
插入策略 | 含义 |
|---|---|
Full Camouflage | 整个 Skill 目标都围绕攻击意图伪装 |
Partial Injection | 只有局部 1–3 句话携带攻击指令 |
Steganographic | 使用 HTML 注释、零宽字符、同形异义字符等隐写方式隐藏指令 |
MIXED 有 3 种跨层策略:
插入策略 | 含义 |
|---|---|
Download+Execute | markdown 指示下载文件,脚本执行 |
Config+Load | markdown 准备配置文件,脚本加载 |
Fetch+Run | markdown 指示拉取内容,脚本在内存中消费或执行 |
这样组合后,论文得到 108 个有效攻击单元:
CI:9 类行为 × 4 种插入策略 = 36
PI:15 类行为 × 3 种插入策略 = 45
MIXED:9 类行为 × 3 种插入策略 = 27
总计:36 + 45 + 27 = 108
论文明确给出覆盖矩阵公式:9×4 + 15×3 + 9×3 = 108 cells。

样本生成逻辑:Generate-Verify-Feedback 闭环
MalSkillBench 的样本不是简单让大模型“编一些恶意 Skill”,而是采用 Generate-Verify-Feedback 闭环。
整体流程包括四个模块:攻击 taxonomy 与知识库、生成 Agent、验证 Agent、最终 benchmark dataset。生成 Agent 面向每个 taxonomy cell 合成候选 Skill;验证 Agent 在沙箱中运行候选样本,失败样本会带着结构化反馈回到生成 Agent 重新生成。
1. 知识库:从真实攻击模式迁移
知识库分为两部分:
CI 知识库来自 IntelliGraph,包含 3,026 个确认恶意的 PyPI 包;
PI 知识库来自 WildJailbreak、CCS’24 in-the-wild jailbreak dataset、Deepset、Gandalf 等语料,共 20,961 个 payload。
这样做的逻辑是:代码侧恶意行为可以从传统恶意软件包中迁移,指令侧恶意行为则从 prompt injection 和 jailbreak 语料中迁移。
2. 良性模板:用真实 Skill 做伪装外壳
生成恶意样本时,论文不是从空白文件开始写,而是从 3,458 个良性 Skill 模板中采样。模板来自 SkillsMP,覆盖 blockchain、business、content-media、data-ai、databases、development、devops、documentation、lifestyle、research、testing-security、tools 等 12 类。生成样本会继承模板的名称、描述、类别和结构,用来模拟真实伪装。
3. 合成阶段:按攻击单元定向生成
对于目标单元 (v, b, s),系统先检索对应攻击样例,再选择一个良性模板,然后将攻击逻辑嵌入模板中。CI 要把恶意代码放入对应代码位置;PI 要保持脚本语法良性,只把对抗指令嵌入 markdown;MIXED 则要求 markdown 准备中间对象,再由脚本消费。
生成结果会被解析成完整 Skill bundle,包括 SKILL.md、scripts/、assets/,以及一个 _expected.json。这个 JSON 声明预期可观测行为:CI 和 MIXED 主要声明目标域名、文件路径、命令模式;PI 主要声明预期 Agent 响应或拒绝模式。
4. 运行时验证:不是看起来恶意,而是真的跑出来
验证 Agent 会把候选 Skill 部署到 OpenCode 的 Skill 发现路径中,在 Docker 容器里运行,并用 strace -f 和 inotifywait 监控整个进程树。它采集两类证据:一类是网络、文件、进程系统调用;另一类是 Agent 文本输出。
验证分两层:
第一层是确定性证据匹配。对 CI 和 MIXED,系统查网络连接、文件访问、execve() 等运行时事实;对 PI,系统检查输出中是否出现角色采纳、系统提示词泄露、攻击者指定内容或标准拒绝模式。
第二层是 LLM 语义判断。它用于弥补低层 trace 与高层行为之间的差距。对于 PI,LLM 判断 Agent 行为是否被触发、是否识别并拒绝注入、或是否完全无效。论文设置阈值为 0.7;只要 Layer 1 命中确定性证据,或 Layer 2 置信度超过阈值,样本就可以通过验证。
这一步是 MalSkillBench 和普通合成数据集的本质区别:它要求样本真的能在 Agent 运行时触发预期行为。

关键发现
发现一:代码承载型攻击比指令层攻击更稳定
RQ1 关注攻击可实现性:候选样本是否真的能在 Agent 运行时触发预期恶意行为。
论文共生成 3,757 个候选样本,其中 3,214 个通过运行时验证,总体实现率为 85.6%。所有 108 个攻击单元至少都有一个成功样本。不同攻击向量差异明显:CI 最高,为 94.5%;MIXED 为 91.9%;PI 最低,为 75.8%。
最难实现的单元集中在 PI-only 的推理行为上:Instruction Override 为 63.3%,Goal Hijacking 为 68.9%,Content Manipulation 为 69.3%,System Prompt Leak 为 70.4%。MIXED 中的 Privilege Escalation 也较难,只有 74.2%。

这个结果说明,代码侧攻击更容易验证,因为它会留下文件、进程、网络等硬证据。PI 攻击更依赖 Agent 是否采纳自然语言指令,结果受任务表述、指令位置和上下文影响更大。论文进一步指出,PI 递送的 B1–B9 操作型行为整体实现率为 88.2%,但 B10–B15 推理型行为只有 72.0%。
从插入策略看,CI 的四种策略都比较稳定,范围在 92.6% 到 96.6%;MIXED 也比较稳定,范围在 90.7% 到 93.2%;PI 差异最大,Full Camouflage 为 89.7%,Partial Injection 为 74.3%,Steganographic 只有 62.5%。

RQ1 结论可以概括为一句话:代码承载型攻击更容易构造和验证,指令层攻击尤其是隐写式、推理控制类攻击最难稳定触发。
发现二:真实野外恶意 Skill 分布非常窄
RQ2 分析 703 个真实野外恶意 Skill。
结果非常集中:607 个样本,也就是 86.3%,采用“伪装前置依赖”的方式;609 个样本,也就是 86.6%,映射到 Malware Delivery;569 个样本来自两个账号,占 81%;其中 247 个样本与加密货币盗窃相关,占 35%。
这说明真实野外样本更多反映的是少数攻击活动,而不是完整攻击空间。当前野外主流形态仍然是传统恶意软件投递,只是换成了 Agent Skill 作为分发与触发入口。论文的说法很直接:这更像是“conventional malware wearing an agent delivery frame”。
但论文也发现了一小部分真正 Agent-native 的攻击。野外样本中约 1.7% 针对的是 Agent 控制面,包括 session lifecycle、identity、goals、instruction hierarchy。这类攻击的目标不是文件或进程,而是 Agent 决定“我是谁、我要做什么、我应该听谁的”这套控制机制。
RQ2 结论是:野外样本不能单独作为评测基准。它们对真实攻击有价值,但分布太窄,会严重低估 PI 和 Agent 控制面攻击。

发现三:现有 Skill 检测器没有一个足够稳
RQ3 横评了 9 个 skill-specific tools,共 12 种检测配置。论文使用完整 benchmark,也就是 3,944 个恶意 Skill 和 4,000 个良性 Skill。
结果分成三类。
第一类是高召回但误报较高。Sentry Skill Scanner full mode 是整体最强配置,F1 为 88.6%,召回率为 98.4%,但误报了 937 个良性 Skill。Cisco Skill Scanner 的 LLM 模式召回率为 92.7%,但 precision 只有 71.4%,误报 1,465 个良性 Skill。
第二类是相对均衡。AI-Infra-Guard 的 F1 为 85.6%,召回率为 86.6%,误报 620 个良性 Skill。
第三类是保守型工具。Snyk Agent Scan 和 VirusTotal 误报很低,分别只有 82 和 4 个 false positives,但召回率只有 28.7% 和 21.6%。

论文对这个结果的解释很关键:LLM 型扫描器会同时读取 SKILL.md 和脚本,更容易推断任务框架和跨文件行为,所以召回更高;但很多良性 Skill 也会合法安装工具、执行 shell、请求 token,因此误报会上升。签名型工具只抓明确 payload,误报低,但对“看似合理的前置条件”或“自然语言义务”非常容易漏报。
更重要的是,论文发现只用野外样本评测会严重改变工具排名。VirusTotal 在完整 benchmark 上召回率只有 21.6%,但在 703 个野外样本上达到 87.9%,提升 66 个百分点;Snyk 也从 28.7% 提升到 77.2%。原因是野外样本高度集中在 B4 恶意软件投递和假依赖上,刚好匹配这类工具的证据模型。
RQ3 结论是:没有一个 skill-specific detector 足够稳定。完整 benchmark 和野外样本会给出几乎相反的排序,野外评测容易把 payload-centric 工具高估为通用恶意 Skill 检测器。

结论四:供应链扫描器和提示注入防御不能直接迁移
RQ4 测试的是一个很自然的想法:既然 Skill 同时包含代码和 prompt,那能不能直接复用供应链扫描器和 prompt injection 防御器?
论文的答案是否定的。
供应链扫描器中,OSSGadget 和 SAP-DT 召回率很高,分别为 97.3% 和 99.5%,但误报也非常高,分别误报 3,587 和 3,858 个良性 Skill。GuardDog 和 MalGuard-MLP 误报很低,分别只有 49 和 4 个,但召回率只有 15.4% 和 15.1%。
Prompt injection 防御也呈现同样分裂。DataSentinel、NeMo Guardrails、Attention Tracker 召回率分别为 99.7%、96.0% 和 100.0%,但误报分别达到 3,979、3,478 和 4,000 个良性 Skill。Llama Guard 3 和 MELON 更精确,但漏掉了大多数恶意样本。

论文进一步测试了简单组合:OR 组合可以提高召回,但误报爆炸;AND 组合可以压低误报,但召回崩塌。即使加入 skill-specific detector 作为 base,再用供应链工具和 prompt 工具辅助,也没有找到更好的工作点。比如 Sentry Full 加最佳 union pair 后,F1 几乎不变;如果追求 100% 召回,FPR 会升到 99.6%。严格三工具一致可以把 FPR 降到 1.2%–1.6%,但召回会跌到约 36%。

论文给出的根因判断很准确:供应链扫描器看的是包级证据,如依赖、危险 API、代码模式和二进制;prompt injection 防御看的是 jailbreak 形态文本。二者各自只看到了混合 artifact 的一半。恶意 Skill 的核心信号,经常是代码、指令和任务之间的关系,而不是某个局部特征。
RQ4 结论是:不能把供应链扫描器和提示注入检测器简单拼起来当 Skill 检测器。有效检测需要联合判断 advertised task、setup request、authority request、executable behavior 和 agent-control instruction 是否一致。
写在最后
这篇论文最后收束到一个判断:
恶意 Skill 的恶意性通常不在某一个文件、某一段代码、某一句 prompt 里,而在各组成部分之间的关系里。
一个依赖名、一条 shell 命令、一个 token 请求、一段角色设定,单独看都可能合理;只有放回 Skill 声称的任务中,才能判断它是不是越权、偏离或诱导。
论文明确指出,检测器需要把 advertised task、requested setup and authority、executable behavior、agent-control instructions 放在一起判断。
所以 MalSkillBench 的价值不是“收集了更多恶意样本”,而是把恶意 Skill 检测问题重新定义成了一个可验证的关系判断问题:
这个 Skill 声称要完成的任务,是否真的需要它请求的权限、执行的代码、引导的指令和改变的 Agent 行为?
这也是后续 Agent Skill 安全产品真正要解决的问题。
声明:本文来自模安局,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。