-- 阅读之前记得关注+🌟,每天才能第一时间接收到更新 --

-- 公众号内容会定期同步到模安局网站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。