使用 Docker Compose,可以在包含受影响 Composer 2.10.2 和 Perforce p4 客户端的隔离环境中进行验证。运行容器将禁用网络、设为只读、删除所有 capability,仅 tmpfs 的 /tmp 和 /work 可写。
# 构建镜像(p4 从官方发布渠道获取并校验 SHA-256)
docker compose build
# 直接验证 p4 的 rsh: 行为(默认)
docker compose run --rm poc
# 通过存在漏洞的 Composer 进行验证
docker compose run --rm poc /usr/local/bin/run-composer-poc.sh
最后一条命令会在容器内的临时工作区中执行 composer update --prefer-source。由于使用了非 Perforce server 的标记命令,Composer 本身可能会失败,但只要标记被创建,就会显示 [+] VULNERABLE 并正常退出。
这是针对 Composer 的 Perforce VCS 驱动中存在的 CVE-2026-84361 的本地验证 PoC。受影响的 Composer 在包 source.type 为 perforce 时,会将攻击者可控的 source.url 作为 p4 客户端的 P4PORT 传入。
p4 会将 rsh: / jsh: P4PORT 视为本地命令而非网络连接目标。因此,当安装不受信任的包元数据或 composer.lock 的 source 时,命令将以运行 Composer 的用户或 CI 账户的权限执行。
此 PoC 的载荷仅会在临时目录中创建一个空的标记文件。
发现者: saku0512 (GitHub)
仅限用于教育目的以及获得明确许可的环境中的安全验证。未经许可,不得在他人系统或 CI 环境中执行。
>= 1.0, < 2.2.30 以及 >= 2.3.0, < 2.10.3漏洞成立需要同时满足以下条件:p4 位于 PATH 中、攻击者能够控制 Perforce source 元数据、目标包从 source 安装。由于 Packagist.org 不允许 Perforce source 元数据,因此仅使用 Packagist 的场景不受影响。
p4 客户端php -v
p4 -V
默认情况下不会启动 p4,仅显示危险的 P4PORT 和将要执行的命令。
php poc.php
--execute 会将 rsh: P4PORT 传给 p4。载荷仅会在 sys_get_temp_dir() 下创建唯一标记,并默认进行清理。
php poc.php --execute
如果出现 [+] VULNERABLE,即可确认已通过 P4PORT 执行了本地命令。如需保留标记,可添加 --keep-marker。
随附的 composer.json 是攻击者分发 inline package repository 的最小示例。请在隔离环境中使用未修复的 Composer 和 p4 执行以下命令:
composer update --prefer-source
修复版本会在启动 p4 之前,将 source.url 作为无效的 Perforce port 予以拒绝。
请将 Composer 更新至 2.2.30 或 2.10.3 及以上版本。仅使用可信的仓库和 lock file,并在不使用 Perforce 的环境中从 PATH 中移除 p4。