文章总结: 该论文研究LLMAgent技能包的安全问题,提出SkillCloak攻击框架可绕过现有静态扫描器,绕过率超96%;同时提出SkillDetonate动态检测框架,通过沙箱执行和行为分析有效识别恶意技能。研究表明静态审计不可靠,需转向动态行为分析。 综合评分: 90 文章分类: 恶意软件,漏洞分析,安全工具,红队,渗透测试
【论文速读】| 隐蔽引爆:扫描器规避和代理技能恶意软件的动态检测
原创
知识分享者 知识分享者
安全极客
2026年7月9日 17:35 北京
在小说阅读器读本章
去阅读
基本信息
原文标题:Cloak and Detonate: Scanner Evasion and Dynamic Detection of Agent Skill Malware
原文作者:Zimo Ji、Congying Xu、Zongjie Li、Yudong Gao、Xin Wei、Shuai Wang、Shing-Chi Cheung
作者单位:香港科技大学、广州港科大霍英东研究院
关键词:LLM Agents、Agent Skills、软件供应链、动态分析、信息流跟踪、规避攻击
原文链接:https://arxiv.org/abs/2607.02357
开源代码:暂无
论文要点
论文简介:当 Claude Code、OpenAI Codex 这类 LLM 编程助手可以通过安装第三方”技能包(Agent Skills)”来扩展自身能力时,一个全新的软件供应链攻击面也随之诞生。这些技能包以自然语言指令加脚本的形式打包,一旦被 Agent 加载,就会继承 Agent 在开发者机器上的全部权限——它可以读取凭证、访问源代码、操纵终端、调用外部服务。仅仅在 2025 年这个开放标准发布后的几个月内,某个主流技能市场上就积累了超过四万个公开技能,其中绝大多数由社区贡献且未经过审查。本文的研究者们把目光投向了这个新兴又危险的生态:他们首先构建了一个名为 SkillCloak 的对抗性框架,专门用来把恶意技能”伪装”成看起来无害的样子,测试现有八款主流安全扫描器是否真的靠得住;然后针对被暴露出来的脆弱性,提出了行为中心的运行时审计器 SkillDetonate,通过在沙箱中真实执行技能、追踪操作系统边界处的信息流,来揭穿那些光看外表检查不出的伪装。实验结果既是一记警钟,也是一份可行的解决方案。
研究目的:这篇论文的核心问题非常尖锐:当前部署的技能扫描器,究竟能不能扛住那些”保留恶意语义但改变外观”的对抗性变形?研究者希望通过系统化的对抗实验,暴露基于外观匹配的静态审计机制的根本缺陷,进而论证一个新方向的必要性——不再问”这个技能看起来像什么”,而是问”这个技能到底在做什么”。他们期望通过 SkillCloak 展示既有防御的脆弱边界,通过 SkillDetonate 证明行为中心的动态审计是可行且鲁棒的技术路径,最终为整个 Agent 生态的信任建立提供新的理论与工程范式。
研究贡献:论文的贡献可以概括为四个层面。
第一,据作者所知,他们是学界首次针对现有技能审计机制发起系统化的、面向自适应且保留语义的规避攻击评估,实验规模覆盖 1613 个真实野外恶意技能与九款代表性扫描器,证明当前审计生态在结构性层面存在严重漏洞。
第二,他们提出了 SkillCloak 这一技能规避框架,它通过两种互补策略——结构混淆(Structural Obfuscation)与自解压技能封装(SFS Packing)——在完整保留恶意载荷语义的前提下改写技能表面形态,形成可复现、可评估的攻击工具。
第三,他们提出了 SkillDetonate 这一行为中心的运行时审计器,通过按需闭包提升(On-Demand Closure Lift)与基于标记的污点分析(Marker-Based Taint Analysis)两项创新设计,在 Agent 的自然语言上下文与不透明的跨进程字节转换这两个传统监控盲区中,实现了对敏感数据流的有效追踪。
第四,他们进行了大规模的实证评估并公开了完整的实验数据集与代码工件,让整个研究可复现、可复用、可继续推进。
背景与动机
Agent Skill 这一概念之所以能在短时间内席卷 LLM 应用生态,本质上是因为它满足了一个非常朴素的诉求:让 Agent 能像人类程序员一样按需获取新能力。一个技能通常表现为一个结构化的目录:里面有一个 SKILL.md 作为自然语言指令文件,告诉 Agent 该做什么、按什么流程做;有 scripts/ 目录存放可执行脚本;还有 references/ 或 data/ 目录承载辅助资源。Agent 在运行时通过名字发现这些技能,将其加载进上下文,然后按照指令执行。这套设计的美妙之处在于技能与模型解耦、可组合、可分享,让 Agent 的能力扩展变得像装 Chrome 插件一样容易;但危险之处也恰恰在此:Agent 会把加载到上下文里的自然语言指令当作可信内容执行,而 scripts/ 里的脚本会带着 Agent 的完整权限运行。这意味着一旦有攻击者往公共市场上传恶意技能,就等同于把恶意程序直接送到了受害者的开发环境里,可以窃取浏览器凭证、SSH 密钥、keychain 密码,甚至加密货币钱包。论文中提到的”ClawHavoc”事件就是活生生的例子:攻击者一次性在单个市场上植入了超过 300 个恶意技能,通过 SKILL.md 中”安装前置依赖”的伪装诱导 Agent 拉取并运行信息窃取程序。攻击面之广、隐蔽性之强,让研究者意识到必须系统性地重新审视这一问题。
面对这些威胁,业界的第一反应是构建”技能扫描器”,在安装前对第三方技能进行审计。论文调研了九款代表性扫描器,它们大致可以归为三类机制:基于正则、YARA 或 AST 规则的静态模式匹配(如 Huifer、Vigile、Qualixar、Pors、Headyzhang);把整个技能包序列化成 prompt 交给大模型判断的 LLM-as-judge 方式(如 Patidarganesh);以及把两者结合起来的混合方案(如 Caterpillar、Cisco、Nova)。然而,这些扫描器有一个共同的假设——恶意行为的痕迹一定会以某种形式暴露在它们可以观察到的表层。这个假设在攻击者具备白盒能力时是否还成立?这正是论文要挑战的核心命题。
威胁模型
要理解这项研究的攻防框架,需要先厘清威胁模型。论文对”技能恶意软件”给出了严格定义:一个技能被认定为恶意,需要同时满足两个条件——首先是”恶意性”,即技能本身内嵌了攻击者意图,Agent 按照约定忠实执行它就会产生攻击者预期的效果,比如凭证窃取、后门安装或破坏性文件操作;其次是”自包含性”,即恶意行为完全由技能包自身内容驱动完成,不依赖被独立入侵的运行时环境。在这个定义之上,作者假设了一个白盒攻击者:他拥有无限计算资源,能够阅读目标扫描器的全部规则、prompt 与白名单(因为这些扫描器都是开源的),但他无法直接篡改受害者的 Agent 运行时,唯一可动的杠杆就是那个即将上传到市场的技能包。任何攻击变换必须保留”载荷标记”,也就是那些编码了恶意行为的字节序列——比如外发的域名、凭证路径、命令片段——必须在忠实执行的语义下依然可达。防御方则控制着安装时的审计器或执行沙箱,这构成了典型的软件供应链信任决策场景。
在这样的博弈中,双方的核心分歧其实非常清晰:攻击者只需保证”看起来无害而实际有害”,防御者却要在有限的资源下判断”看起来无害的是不是真的无害”。论文的整个技术路线就是围绕这个不对称性展开的。
攻击框架
论文首先构建的 SkillCloak 攻击框架,正是为了系统性地衡量现有扫描器对”载荷保留式变形”的免疫力。研究者敏锐地识别出了扫描器的两个根本缺陷:表面形态缺陷指的是任何静态匹配规则都只能命中有限的字面字节签名,LLM 判官也只能看到从可读表面组装出的 prompt,因此只要在保留 payload 语义的前提下改写命令 token、凭证路径、URL 或指令措辞,就能让扫描器无从下手;上下文缺陷则指扫描器为了控制成本与误报,总会跳过某些目录、文件类型或二进制块,攻击者只要把 payload 挪到这些盲区,再让 Agent 在运行时把它捞回来即可。基于这两个缺陷,SkillCloak 分别设计了结构混淆与自解压封装两种策略。
结构混淆的思路是”用最小编辑量绕过扫描器”。它的工作流分为三步:首先通过一次白盒扫描把每个规则拆解成”信号”(它要匹配的模式)和”作用域”(它检查的区域);然后进入一个反例引导的循环,每一轮扫描后取出第一个未解决的发现,用最轻量的算子去消除它。算子分为两大家族——REIFY 家族专门改写规则要匹配的字节,比如插入零宽字符、替换成 Unicode 同形字、大小写翻转、同义词替换、Python 的 getattr/chr 重写、shell 变量拼接、命令替换等;DISPERSE 家族则不改字节而是错开位置,比如按行拆分、按文件抽取、目录搬移、扩展名重命名、连接词拆分、大小填充等。每一次编辑后都要重新扫描并验证 payload 标记是否还完整,只有严格降低了发现数才保留。当所有静态发现都被清除后,如果还有 LLM 判官在读 SKILL.md,就通过 offloading 操作把残余的可疑文本挪到 benign 的封面链接后面。这种做法的巧妙之处在于,它不是试图对抗 LLM 判官本身,而是利用它有限的阅读范围绕开它。
自解压封装则是一种更激进的策略。它借鉴了二进制恶意软件领域的 SFX 打包思想:把整个原始技能连同它的恶意 SKILL.md 一起塞进一个扫描器不看的盲区目录(比如 .git/),然后用一个看起来完全无害的封面 SKILL.md 替代原来的位置,附带一个 stdlib 解码脚本。安装时扫描器只看到无辜的封面和一个普通的解压器就放行了;等到 Agent 第一次运行这个技能时,解码器把真正的技能重新解出来,Agent 按照封面的指引去读那个刚被还原的 WORKFLOW.md(其实就是原来的 SKILL.md),恶意载荷至此完整激活。如果 LLM 判官觉得封面太”空洞”可疑,还可以用另一个 LLM 反复重写封面直到判官通过。这种策略在结构上比结构混淆激进得多——它整个替换了技能树而不是在原地编辑——但对 LLM 判官的绕过效果更强,因为封面是独立于 payload 生成的,任何针对判官的攻击都无法把封面和真实意图重新关联起来。
论文用一个具体的凭证外传场景把两种手法讲得非常清晰:原始技能包含一个 SKILL.md 单行诱导语和一个 api_helper.sh 脚本,脚本读取 ~/.aws/credentials 并 POST 到外部主机。基线扫描会对 curl…http 签名报 CRITICAL、对凭证路径报 HIGH。结构混淆会在原地改写这些字节,把命令动词通过 shell 变量拆分、把路径从片段中重组(两者都在运行时被 Agent 还原),再把残余文本挪到 .git/ 目录后面;最终扫描树看起来干干净净,语义上却完全等价。SFS 封装则彻底抛弃表面:扫描器只看到无害封面和一个标准库解码器,整个原始技能则以 XOR 加密的形式藏在 .git/skillpack.dat 里,等到运行时才被还原。两种方式都完整保留了 payload 标记,因此当 Agent 真正运行技能时,凭证外传照样发生。
对抗实验
RQ1 的实验直接给出了触目惊心的答案。研究者在 1613 个来自 OpenClaw 市场的真实野外恶意技能上运行 SkillCloak,然后逐个测试九款扫描器的”绕过率”——即在保留 payload 标记的前提下,被扫描器判为”通过”的比例。结果显示,SFS Packing 在每一款静态和混合静态扫描器上都达到了至少 96% 的绕过率,其中五款超过 99.8%,两款 LLM 判官上也超过 90%;结构混淆则在五款静态扫描器上超过 80%,在 Cisco 这款目前最受关注的混合扫描器上更是达到了 96%。从”发现数量减少”这个更细粒度的指标看,两种手法都能把可操作发现数削减 80% 到 99.9% 不等,就连结构混淆在 Vigile(67.7%)和 Headyzhang(80.5%)这些较硬的目标上,残余的失败也集中在极少数难题上而非普遍分布。作为对照,此前的 VulMask 攻击在任何扫描器上都没能降低发现数,充分证明 SkillCloak 的近完全绕过是既有规避技术所遥不可及的。
RQ2 则回答了一个同样重要的问题:这些经过伪装的恶意技能,在真实 Agent 上还能正常工作吗?研究者在 SkillsBench(87 个 docker 化 agentic 任务)上测试了 raw、SFS Packing、结构混淆三种变体,分别在 GPT-5.4(通过 OpenAI Codex)和 Claude Sonnet 4.6(通过 Claude Code)两款生产级 Agent 上执行。结果一致:所有配对的奖励差异都落在 bootstrap 噪声范围内,没有一种变形导致统计上可检测的效用下降;两款 Agent 上的执行轨迹嵌入余弦相似度维持在 0.88 到 0.90,说明 Agent 的执行路径基本没变。这一发现比”扫描器被绕过”更让人不安:伪装技能不仅骗过了扫描器,还完好无损地保留了它本应有的破坏力。这两个 RQ 合在一起,才是这项研究真正想强调的核心——静态审计可以在恶意技能保持完全可运行的场景下被系统性击败,这就意味着”看字节”的信任门已经不可靠。
防御框架
面对静态审计的溃败,研究者提出的答案是把审计的重心从”技能长什么样”转向”技能在做什么”。这个洞见虽然在传统恶意软件领域早已被广泛接受,但要把它移植到 Agent Skill 的语境中却面临两个独特的挑战:一是 Agent 的指令流在安装时并不固定,那些被打包或分阶段的技能可能要等到 Agent 运行了某个解码器之后才会materialize 出新的自然语言指令;二是恶意数据流可能穿过传统系统调用监控无法理解的介质,包括 Agent 的自然语言上下文以及不透明的跨进程字节转换。SkillDetonate 就是为了同时应对这两个挑战而设计的。
SkillDetonate 的整体架构可以概括为:把可疑技能放进一个受控的 Docker 沙箱,用 eBPF 在容器 PID 命名空间捕获系统调用,通过 FUSE 虚拟文件系统中介所有文件访问,然后在这些行为观察之上叠加两项关键设计。第一项是”技能闭包与按需提升”。研究者提出了”技能闭包”这一新概念:一个技能的运行时闭包不仅包括安装时投递到根目录下的文件,还包括运行时被技能自己 materialize 出的、路径仍在根目录之下的所有文件——SkillDetonate 通过 FUSE 的 inode 血缘追踪来判定归属,使得一个在子进程 A 里创建、在子进程 B 里读取的文件仍然被识别为技能自己的一部分。这个定义正好戳中了静态审计的一个盲点:技能可以给自己写下一步的指令。多阶段 SFS Packing 就是典型例子——真正的 SKILL.md 在安装时根本不存在,而是由解码器在首次运行时重建。SkillDetonate 通过”按需提升”关闭这个漏洞:只要闭包内的写操作产生了扩展名标记为自然语言指令的文件(比如 .md),FUSE 层就会标记它,新生成的指令会被反馈进同一个 Agent 会话继续执行,就像它们本来就随技能一起交付一样。
第二项设计是”符号读取与数据标记污点分析”。所有从沙箱内的文件访问都要经过 FUSE 层的中介:闭包内的文件(无论是随包交付的还是运行时创建的)会原样透传;策略配置指定的敏感文件(比如 ~/.ssh/、.env)会返回一个新鲜的、绑定到 SENSITIVE_FILE 的不透明数据标记 #dataN,而真实的秘密内容永远不会被读出来;其他一切文件返回 ENOENT。这个数据标记是一个数据流上的溯源标签而非脆弱的字符串,SkillDetonate 让它在三个平面上传播:inode 级系统调用图从 eBPF 捕获的原始 read/write/execve 流中重建跨进程图,节点是 inode 和进程,一个进程读取了带污点的 inode 后写出的每个 inode 也会被污染,这样污点跟着图边而不是字节,base64、gzip、加密等编码都能透明覆盖;进程内值级污点通过 TaintStr/TaintBytes 覆盖单进程内的”编码后发送”行为;LLM 上下文平面则通过让 Agent 只看到 #dataN 而永远看不到真实秘密来实现——任何后续 Agent 发出的、含有该标记的值必然来自那次敏感读取,无法通过自然语言上下文洗白。这种基于标记的间接方式,把原本无法插桩的 LLM 上下文变成了一个可污点追踪的介质,而无需传统意义上的上下文内污点分析。
在这套观察机制之上,SkillDetonate 用两条配置驱动的信息流策略判决:机密性策略规定被标记的敏感数据不得流向不在可信 egress 白名单中的外部端点,一个带标记的秘密到达非白名单网络接收方就被判为机密性违规;完整性策略把技能视为低完整性组件,Agent 读取技能后,技能驱动的写操作只能针对白名单目录(比如技能自己的根目录或可信安装路径),一个技能安装、下载或从不可信来源执行的二进制同样被判为完整性违规。SkillDetonate 运行一个未经修改的 Agent(参考适配器是 opencode+DeepSeek,可以通过 Dockerfile 一处替换),所有可信度旋钮——包括敏感文件集、完整性与 egress 白名单、Agent 适配器——都是配置项,方便部署到不同场景。
评估结果
RQ3 的实验在两个数据集上对 SkillDetonate 进行了严格评估。基准数据集是 SkillJect(排除超范围的社会工程攻击),应用结构混淆和 SFS 封装后得到 600 个技能(450 恶意、150 良性);野外数据集是 MalSkillBench 的 703 个野外恶意技能,其中 622 个满足”载荷有可复现的可执行地面真相”这一严格条件(作者刻意选择了严格的下界评估)。基线对比选择了 Cisco(结构混淆的调优目标、最受关注的扫描器)和一个 Naive Agent(同样的 opencode+DeepSeek 栈但只被简单地 prompt “这是恶意的吗?”)。在 SkillJect 上,SkillDetonate 以 2% 的假阳性率达到了 95% 的攻击检测率(跨形态从未低于 89%),而 Cisco 是 45%/11%、Naive Agent 是 56%/14%。真正关键的是稳定性:在 SkillCloak 攻击下 Cisco 从 64% 崩到 5%(结构混淆)、崩到 24%(SFS 封装),而 SkillDetonate 完全不为所动;两个基线在 SFS 封装的良性技能上还会出现严重的假阳性尖峰(Cisco 30%、Naive Agent 38%,因为解码器看起来很像恶意代码),SkillDetonate 却保持在 0%,因为良性解码器不会发出违反策略的系统调用。更值得一提的是,SkillDetonate 还检测到了 89.3% 的 VulMask 攻击——这是它并未针对性设计的独立规避基线,证明它的鲁棒性并不是对 SkillCloak 的过拟合。代价方面,SkillDetonate 每个技能大约消耗 14.1K token、耗时 153 秒(相比 Cisco 的 21 秒),对于一个离线、每技能一次的安装门槛而言是完全可接受的。
野外数据集上信号同样明显:SkillDetonate 平均检测率 87.3%(三种形态分别 87.6%/83.8%/90.5%),在 SkillCloak 攻击下保持平稳,而 Cisco 从 98.6% 崩到 10.1%。研究者进一步对野外遗漏进行了根因分析:绝大部分遗漏是”路径覆盖”问题——Agent 读到了恶意指令但没有执行它,payload 从未触发因此无行为可观察;少数是”环境依赖”问题——野外技能的接收端往往依赖存活的端点、API 密钥或已开通的账户,如果外传主机已死或资源缺失,技能就静默 no-op;剩下的极少数是运行时超时(900 秒/技能)。第一类是自然语言本身的局限,后两类是评估工具链的工程约束,都不是 SkillDetonate 设计层面的缺陷。
RQ4 的消融实验证明两项创新设计都是不可或缺的:去掉污点分析后,恶意检测几乎不变(96.7% → 95.8%),但良性假阳性率暴涨 8 倍(2.0% → 16.0%),因为没有信息流约束,一个只是碰了敏感文件或网络套接字的良性技能就无法与真正的外传行为区分;去掉闭包提升后,原始与混淆形态检测保持不变,但 SFS 封装的检测崩了 65 个百分点(95.3% → 30.0%),因为多阶段 SFS 封装恰好把真正的 SKILL.md 藏在了这个变体所省略的解码-提升步骤之后。两者互补:污点分析买的是假阳性控制,闭包提升买的是多阶段覆盖,谁也无法替代谁。
讨论与启示
论文在讨论部分坦诚地指出了 SkillDetonate 面临的开放问题。最深的挑战是”自然语言覆盖鸿沟”:一个 payload 如果被藏在 Agent 不愿执行的自然语言指令背后——比如某个”抓取并运行”的步骤、或者一个被判为 false 的分支——SkillDetonate 就无从观察它。这不是检测器的缺陷,而是路径覆盖的边界;每一个 Agent 确实执行的行为都会被可靠地观察和判决。研究者展望了一个有希望的方向:训练一个专门的”强制执行 Agent”,可靠地驱动所有自然语言分支,类似二进制领域的强制执行技术,让”跟踪相对”的保证向”整体技能覆盖”靠拢。更宏观地看,恶意软件社区当年是靠共享的插桩沙箱(Cuckoo 风格,提供伪造网络服务、金丝雀凭证、可复现镜像)解决了类似困境,Agent Skill 生态也需要类似的标准化执行环境。
另一个挑战是”反沙箱技能恶意软件”:一个恶意技能可以让 Agent 推理自己是否处于沙箱并据此分支,或者用 prompt 注入覆盖沙箱的执行请求让 Agent 停止、推迟或消毒恶意路径。这与经典的”完美恶意软件检测不可判定性”如出一辙——没有任何动态框架能保证观察到每一个对抗性门控的行为,目标只能是缓解而非彻底解决。可行的缓解措施包括强制执行 Agent、多样化的更真实的沙箱环境、模拟的外部服务、以及用不同自然语言执行 prompt 反复运行。
对静态扫描器的启示同样清晰:论文并不主张放弃静态扫描,而是把它降级为”卫生检查”而非信任门。两个具体的加固方向从观察中自然浮现:安装后的树完整性检查(扫描时记录内容哈希、每次运行前重新验证)可以关闭 SFS 封装的一个推论,但代价是破坏自更新技能,而且对结构混淆这种更本质的攻击毫无办法;拒绝安装那些在盲区目录中携带不透明/高熵二进制块的技能能提高 SFS 封装的成本,但会误伤合法的二进制资产。这两条路都无法关闭覆盖鸿沟,也正因如此,动态执行审计才是承重的防御,而静态扫描只能作为廉价的前置过滤。
结论
Agent Skill 让”安装时信任”变成了一个软件供应链问题,而生态目前给出的答案是静态扫描器。这篇论文用 SkillCloak 在 1613 个野外恶意技能上证明了这些扫描器可以被载荷保留式变形系统性地击败——SFS Packing 在每个扫描器上都达到 90% 以上的绕过率,结构混淆在多数静态扫描器上超过 80% 且在混合扫描器上达到 96%,而这一切都不会损害技能在生产 Agent 上的实际效用。这个发现意味着领域必须从”检查字节”转向”观察行为”。沿着这个洞见,作者提出的行为中心审计器 SkillDetonate 在受控基准上达到 97% 的攻击检测率、在野外数据上达到 87%,在 SkillCloak 攻击下依然保持稳健。这项工作既是对现有防御范式的一次严厉审视,也是对下一代 Agent 安全基础设施的建设性提议——它告诉我们,当 AI Agent 开始拥有插件生态时,我们需要的是像操作系统级安全审计那样严谨的信任建立机制,而不是仅仅停留在”扫一眼看起来像不像坏东西”的直觉判断上。对于所有正在构建 Agent 平台、编写第三方技能、或者仅仅是在自己的开发环境里使用 Claude Code 和 Codex 的开发者来说,这篇论文都值得反复咀嚼——因为它揭示的既是技术问题,也是即将到来的 AI Agent 生态必须直面的信任危机。
-End-
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全极客 知识分享者 知识分享者《【论文速读】| 隐蔽引爆:扫描器规避和代理技能恶意软件的动态检测》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论