必须全局执行composer config --global repo.packagist.org false彻底禁用packagist.org,否则私有源仅为备选;禁用后所有包须显式存在于已配置仓库中,否则报错,且需确保私有源提供有效的dist.shasum用于SHA256校验。

必须禁用 packagist.org 全局源,否则所有私有源配置都形同虚设。 一旦你没关掉它,攻击者只需发布一个拼写错误的包(比如 monolog/monologg),而你的 composer.lock 又没锁定 dist 文件哈希,就可能在下次 composer install 时被静默替换——这和你配了私有源完全无关。
怎么彻底禁用 packagist.org?别信“只配私有源”就行
很多人以为只要在 composer.json 的 repositories 里加了私有源,Composer 就只从那儿拉包。错。默认它仍会 fallback 到 packagist.org,除非你显式关掉。
- 最可靠方式是全局执行:
composer config --global repo.packagist.org false - 不要只在项目级配
"packagist.org": false—— 它会被全局配置覆盖,且容易漏配 - CI 流水线里必须加校验步骤:
composer config --list | grep 'repo.packagist.org',输出应为repo.packagist.org=false,否则直接失败 - 禁用后,任何未显式出现在你配置的私有源中的包,
composer install会立即报错,强迫你逐个确认引入来源
dist 文件 SHA256 校验才是真防线,lock 文件不防篡改
composer.lock 的 content-hash 和 packages 块哈希,只校验依赖树结构和版本号,不校验实际下载的 zip/tar.gz 内容。攻击者若黑进你的 Satis 或 Artifactory,篡改 Git tag 对应代码或替换 dist 包,lock 文件完全无感。
- 真正起作用的是
composer install --no-dev --prefer-dist --no-progress触发的 dist 文件 SHA256 校验 - 前提是私有源返回的
dist.shasum字段有效且未被绕过;Git 源默认走source(clone),跳过校验 - 强制走 dist:在
repositories配置中加"no-api": true,并确保服务端提供完整 dist 元数据 - Artifactory 用户注意:
Bypass checksum storage选项一旦开启,等于主动丢弃客户端传来的shasum,校验失效
自动安全拦截 + 插件白名单,双保险不能少
Composer 2.9 的自动拦截默认启用,但它只拦已知 CVE,不拦供应链投毒。必须配合插件授权机制,才能堵住执行链入口。
- 遇到漏洞包时,
composer update会中断并提示类似:Found 1 security vulnerability advisory affecting 1 package: abc/xyz (version: 2.5.0) - CVE-2024-12345 [High severity] - 可通过
composer config audit.block-insecure false关闭拦截(不推荐),或audit.block-abandoned true拦截已被遗弃的包 - 插件必须显式授权:
"allow-plugins": { "composer/installers": true, "drupal/core-composer-scaffold": true, "*": false } - 未列入白名单的插件,在
composer install时会拒绝执行,避免恶意代码落地
最常被忽略的一点:禁用 packagist.org 后,所有包的 dist shasum 必须由你控制的私有源生成并签名——如果源本身不可信,再严的客户端配置也白搭。边界不是设出来的,是守出来的。











