AI 智能体软件包安全问题

4
分类技术博客
来源跳转
发表时间

内容

我仔细研读了最近发布的OWASP代理应用十大安全风险(2026年版),从中梳理出与软件包管理相关的场景。这些场景横跨所有十个风险类别,难以简单归类,因为一个拼写错误的MCP服务器可能同时构成名称攻击、注册攻击和元数据投毒向量。

软件包名称攻击

拼写错误(typosquatting)和命名空间混淆是软件包安全领域最古老的问题之一。代理系统使这些问题更加严重,因为它们通过程序化方式解析软件包,缺乏人类对名称的直观检查,无法察觉异常。

  • 攻击者在npm或PyPI上注册了一个与热门软件包仅差一个字符的MCP服务器软件包。当代理系统动态发现并安装工具时,会解析到拼写错误的软件包,并将其误认为是合法软件包。

  • 由于代理系统的工具注册表处理命名空间冲突的方式,名为"report"的恶意工具软件包会在合法的"report_finance"之前被解析,导致查询被错误路由和数据意外泄露。

  • 在代码生成过程中,大型语言模型可能会虚构不存在的软件包名称,而攻击者可以在PyPI或npm上注册这些名称并植入恶意负载。我去年曾详细探讨过slopsquatting这一现象。

注册中心和仓库攻击

MCP服务器、代理技能和插件与传统软件包一样,通过相同的注册中心分发:npm、PyPI、crates.io以及平台特定的应用市场。多年来困扰传统软件包管理器的信任问题(如维护者账户被入侵、恶意上传、清单混淆)同样适用于这些新场景。

  • 被攻陷的软件包注册中心会提供看似经过签名的清单、插件或代理描述文件,其中包含篡改过的组件。由于编排系统信任该注册中心,这些被污染的制品会在被发现前广泛传播。

  • 首个在野运行的恶意MCP服务器以npm软件包形式发布,伪装成Postmark邮件服务,在代理系统安装后秘密地将所有邮件副本抄送给攻击者,而安装该软件的代理系统对此毫无察觉。

  • 像A2A这样的代理发现服务充当了新的软件包注册中心,继承了相同的问题:攻击者可以使用克隆的模式注册虚假节点,拦截合法代理之间的协调流量,这与在公共注册中心上注册拼写错误软件包的方式类似。

  • 代理卡片(/.well-known/agent.json文件)实质上是另一种形式的软件包元数据。恶意节点可以在其卡片中夸大能力描述,导致主机代理将敏感请求路由到攻击者控制的端点,这类似于软件包在其清单中声称虚假功能。

元数据和描述符投毒

软件包元数据一直是信任边界:清单混淆(发布的元数据与实际软件包内容不符)和星标劫持(通过元数据宣称与热门仓库关联)是已知的攻击手法。代理工具的引入增加了新的维度,因为代理将元数据解释为指令而非仅仅是数据。

  • 嵌入在MCP服务器发布元数据中的隐藏指令会被主机代理解释为可信指导。在一个演示案例中,恶意MCP工具软件包在其描述符中隐藏命令,当被调用时会促使助手泄露私有仓库数据。

  • 通过RAG处理的软件包README可能包含隐藏指令载荷,悄无声息地引导代理滥用连接的工具或将数据发送到外部端点。传统安全工具很少检查README中的恶意内容,而README正是软件包元数据的一部分。

  • 作为软件包分发的流行RAG插件可以从第三方索引器获取上下文,如果向索引器注入精心设计的条目,可以逐渐污染该插件,长期影响代理行为,直至其在正常使用过程中开始泄露敏感信息。

依赖解析和锁定文件攻击

锁定文件操纵和版本固定规避是众所周知的供应链攻击手段。代理系统放大了这些风险,因为它们经常重新生成锁定文件、安装全新依赖项,并在不比对已知良好基准的情况下解析版本。

  • 在临时沙箱中执行"修复构建"任务时,代理系统会从非固定的依赖规范重新生成锁定文件,可能拉取到原始锁定文件中不存在的有后门次要版本。

  • 运行自动化依赖更新或编码会话的代理系统会在不验证已知良好锁定文件的情况下安装软件包。具有自动批准工具的编码代理运行npm install或pip install时可能被操纵,解析出不同于人类开发者选择的版本,或在安装时完全安装运行恶意代码的新依赖项。

安装时和执行时代码执行

安装脚本(npm中的postinstall,pip中的setup.py)多年来一直是恶意软件包的主要载体。OpenSSF软件包分析项目主要就是为了检测这种模式而存在。代理系统使情况更糟,因为它们以更广泛的权限和更少的审查运行安装,而不是终端前的开发者。

  • 恶意软件包安装会超出供应链攻击范围,当敌对代码在安装或导入时以代理拥有的任何权限执行时,这些权限通常很宽泛,因为代理需要文件和网络访问权限来完成工作。开发者在终端运行npm install时可能会注意到可疑的postinstall脚本。但作为"修复构建"或"修补服务器"任务一部分运行的代理则不会。

  • 在执行自动化依赖更新或自我修复任务期间,代理系统运行未经审查的npm install或pip install命令,任何带有恶意安装脚本的软件包都会以代理的全部权限执行,而人类对此毫不知情。这里的攻击面与传统安装脚本恶意软件完全相同,但安装和检测之间的时间窗口更长,因为没有人监督整个过程。

通过软件包泄露凭证和密钥

恶意软件包在安装时窃取凭证是npm、PyPI和RubyGems中已被充分记录的模式。代理系统扩大了影响范围,因为它们通常比典型开发者环境持有更多凭证,且在没有人工审查的情况下安装软件包。

  • npm上的被污染nx/debug版本被编码代理自动安装,启用了一个隐藏后门,窃取SSH密钥和API令牌。由于没有人类审查安装过程,这个单一恶意软件包发布演变为跨越代理工作流的供应链漏洞,其传播速度超过了传统事件响应的追踪能力。

  • 安装MCP服务器软件包或插件的代理系统授予这些软件包访问环境变量、API密钥和文件系统路径的权限。以合理名称发布的恶意软件包可以按照传统供应链攻击的方式窃取凭证,但访问权限范围更广,可涵盖代理被授权使用的所有内容。

依赖图中的级联故障

单个不良版本引发的级联破坏是软件包管理中的常见问题。2016年left-pad从npm下架时,数千个构建在几小时内崩溃。2022年colors.js发布 sabotaged版本时,松散版本固定的项目自动获取了该版本。在代理系统中,依赖图不仅包括代码软件包,还包括MCP服务器、插件和对等代理,传播速度更快,因为代理系统在等待人类注意到问题前就解析、安装并部署。

  • 由编排代理拉取的污染或有缺陷的软件包版本会自动传播给所有连接的代理,扩大漏洞影响范围。在传统软件包管理中,开发者可能会注意到构建失败并固定版本。但具有自动批准安装的代理只会继续运行,每个依赖编排器输出的下游代理都会继承被污染的依赖项。

  • 当两个或多个代理相互依赖其输出时,会形成放大初始错误的反馈循环。一个代理软件包树中的不良依赖更新会通过循环不断加剧:代理A安装损坏软件包,产生错误输出;代理B消费该输出并基于此做决策;错误在每个周期中被放大,直到系统大规模产生无意义结果。

技能和插件安装

代理编码平台为其技能、插件、钩子和扩展拥有独立的打包系统,而这些系统恰好表现出传统软件包管理器多年学习到的相同漏洞。OpenClaw提供了完美的案例研究,自2026年2月以来已累积238个CVE。恶意技能归档文件可在skills installhooks install期间使用路径遍历序列将文件写入预期安装目录之外(CVE-2026-28486, CVE-2026-28453),技能前言部分的name字段在沙箱镜像期间未经验证地被插值到文件路径中(CVE-2026-28457)。包含..的范围限定插件包名可完全逃逸扩展目录(CVE-2026-28447)。

OpenClaw还会从.OpenClaw/extensions/自动发现和加载插件而不验证信任,因此克隆包含特制工作区插件的仓库会在代理启动时立即运行任意代码(CVE-2026-32920)。传递给动态import()的钩子模块路径不受约束,给予任何有配置访问权限的人代码执行原语(CVE-2026-28456)。exec白名单默认信任可写的软件包管理器目录如/opt/homebrew/bin/usr/local/bin,因此能写入这些路径的攻击者(即能运行brew installpip install --user的人)可在白名单中种植木马二进制文件(CVE-2026-32009)。通过配置注入的环境变量如NODE_OPTIONSLD_PRELOAD会在网关启动时执行任意代码(CVE-2026-22177)。

如果你从事过软件包管理器安全方面的工作,这些都是熟悉的问题:归档文件中的路径遍历、文件路径中不受信任的输入、从工作目录自动加载、信任可变文件系统位置。代理编码平台正在从零开始重建软件包管理系统,并重新发现相同的漏洞。不同之处在于,旧漏洞的影响周期为几小时或几天,受限于人类审查安装、发现构建失败和固定版本。而代理系统压缩了这个时间线——它们在人类介入前就解析、安装、执行和传播,且权限比开发者通常拥有的要广泛得多。

评论

(0)
未配置登录方式
暂无评论