原文发布时间:2026-04-14T09:57:28.000Z
请立即通过运行 composer.phar self-update 将 Composer 更新到 2.9.6 或 2.2.27(LTS)版本。新版本包含了对 Perforce VCS 驱动程序中两个命令注入安全漏洞的修复,这些漏洞也影响了未使用 Perforce 且未主动使用该驱动程序的用户。CVE-2026-40261 由 Koda Reef 报告,CVE-2026-40176 由 saku0512 报告。
据我们所知,这两个漏洞在披露之前均未被利用过。
漏洞成因
这两个漏洞都位于 Composer 的 Perforce VCS 驱动程序中,都涉及到在构建 shell 命令时对使用的值转义不足。即使你没有安装 Perforce 并且自己也不使用 Perforce,这两个漏洞仍然可能被利用。
CVE-2026-40176 影响了 Perforce::generateP4Command() 方法,该方法在构建 shell 命令时,未经正确转义就直接插入了用户提供的 Perforce 连接参数(port、user、client)。如果一个攻击者能够控制某个恶意 composer.json 中的仓库配置,声明了一个 Perforce VCS 仓库,那么他就可以通过这些值注入任意命令,从而在运行 Composer 的用户上下文中执行命令。即使未安装 Perforce,Composer 也会执行这些注入的命令。
VCS 仓库仅从你执行 Composer 命令的目录下的根 composer.json 文件以及 Composer 配置目录(例如 ~/.config/composer/composer.json)中加载。此漏洞无法通过作为依赖项安装的包中的 composer.json 文件进行利用。只有当你对包含攻击者提供的 composer.json 文件的不可信项目运行 Composer 命令时,你才会有风险——即使你没有安装 Perforce 并且也不以其他方式使用它。
CVE-2026-40261 影响了 Perforce::syncCodeBase() 方法,该方法将源引用参数附加到 shell 命令时未进行正确转义,允许攻击者通过包含 shell 元字符的特制源引用来注入任意命令。此外,Koda Reef 还注意到,Perforce::generateP4Command() 中导致上述 CVE-2026-40176 的不当转义也影响了源 url 字段。即使未安装 Perforce,Composer 也会执行这些注入的命令。
源引用和 url 是作为包元数据的一部分提供的。任何 Composer 包仓库都可以提供包元数据,声明 Perforce 作为源类型,并附带恶意的源引用或源 url。这意味着该漏洞可以通过任何由被入侵或恶意的 Composer 仓库提供的包进行利用。攻击不需要在客户端安装 Perforce,因为 Composer 无论如何都会尝试执行构建的命令。当从源码安装或更新恶意依赖(使用 --prefer-source,安装开发版本时默认选项)时,此漏洞可以被利用。
补丁
这两个问题已在 Composer 2.9.6(主线版本)和 2.2.27(2.2 LTS 长期支持版本)中修复。
临时缓解措施
对于 CVE-2026-40261,可以通过使用 --prefer-dist 或 preferred-install: dist 配置设置来避免从源码安装依赖,并且只使用受信任的 Composer 仓库。
对于 CVE-2026-40176,在运行 Composer 命令之前,请仔细检查 composer.json 文件。验证与 Perforce 相关的字段是否包含有效值,并且仅对来自可信源的项目运行 Composer 命令。
对 Packagist.org 的影响
我们扫描了 Packagist.org,没有发现任何试图利用此漏洞通过恶意 Perforce 信息进行攻击的包。作为预防措施,自 2026 年 4 月 10 日(星期五)起,Packagist.org 上已禁用 Perforce 源元数据的发布。
对 Private Packagist 的影响
我们扫描了 Private Packagist,没有发现任何试图通过恶意 Perforce 元数据利用此漏洞的包。自 2026 年 4 月 10 日(星期五)起,Private Packagist 上已禁用 Perforce VCS 驱动程序。
对于 Private Packagist 自托管客户,将在本公告发布后不久提供一个新版本。无论如何,都应立即更新 Composer 安装。发布公告邮件和 Private Packagist 自托管变更日志将详细说明如何运行命令以验证您的安装中没有元数据试图利用此漏洞。