composer 不校验 vendor 目录完整性,篡改后 install 仍报 success;需手动检查 autoload.php 等关键文件哈希或内容,ci 中应加入 grep 和 tar 快照比对防护。

Composer 不会自动发现 vendor 被篡改,也没有内置命令能一键验证所有已安装文件的完整性。你得靠组合手段主动检查——否则恶意代码可能已在 autoload.php 里躺了三天,而 composer install 还在报“success”。
为什么 composer install 不报错,但 vendor 已被改写?
因为校验只发生在下载解压那一刻:Composer 拿 composer.lock 里的 dist.sha256 和刚下好的 zip 包比对,完事就丢。之后 vendor 目录彻底“脱管”:
- 缓存命中时直接复用本地 zip,跳过哈希重算
-
--prefer-source安装的包(比如 Git 克隆)根本不读dist.sha256 -
vendor/autoload.php是静态引导文件,内容就是require_once __DIR__ . '/composer/autoload_real.php';,被替换成eval($_GET['x'])也完全无感 -
vendor/composer/installed.json里虽有部分包的shasum字段,但它本身不被校验,且很多 dist 包根本没存这个字段
如何快速确认 vendor/autoload.php 是否被注入?
别信它是否存在,要查它是否干净。这个文件是攻击入口第一线,但 Composer 从不碰它:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 手动执行:
grep -q "eval\|system\|shell_exec\|base64_decode" vendor/autoload.php && echo "WARNING: suspicious code" || echo "OK" - 更稳妥的是固定内容比对:
sha256sum vendor/autoload.php应该始终等于:echo 'require_once __DIR__ . "/composer/autoload_real.php";' | sha256sum - CI 中建议加一步防护:
grep -q "autoload_real\.php" vendor/autoload.php || exit 1,防住最基础的替换
怎么手动比对 lock 和实际 vendor 的一致性?
没有一键命令,但可聚焦关键路径做轻量验证:
- 先确认结构层面一致:
composer show --locked --format=json | jq -r '.packages[] | "\(.name) \(.dist.reference // .source.reference)"' | sort > lock-ref.txt;再从vendor/composer/installed.json提取同字段生成installed-ref.txt;最后diff lock-ref.txt installed-ref.txt - 抽样验证高危文件哈希:
sha256sum vendor/composer/autoload_real.php—— 这个文件被改了会导致全部自动加载失效或执行恶意逻辑,但composer.lock根本不记录它的哈希 - 注意排除干扰项:
vendor/bin/含软链、vendor/composer/installed.json含时间戳,比对前必须忽略
CI 中低成本做 vendor 快照哈希比对
全量下载+解压+目录哈希太重,推荐 tar 快照法,稳定且跨平台:
- 首次生成快照:
tar --sort=name --owner=0 --group=0 --numeric-owner --mtime='UTC 2026-01-01' -cf vendor-snapshot.tar --exclude='./vendor/bin' --exclude='./vendor/composer/installed.json' vendor/ && sha256sum vendor-snapshot.tar > vendor-snapshot.sha256 - 每次构建后验证:
tar -cf vendor-current.tar vendor/ && sha256sum -c vendor-snapshot.sha256 - 关键点:必须排除
vendor/bin/(软链导致哈希不稳)、installed.json(含安装时间戳)、.git/(不该进 vendor)
真正危险的不是“文件少了”,而是“文件多了恶意代码却没人看”。vendor/autoload.php 和 autoload_real.php 这两个文件,既不在任何哈希校验链路里,又在每次请求时必然执行——盯住它们,比跑十遍 composer validate 都管用。










