Composer 2.11.0 升级笔记:lock 里的 token、eMudhra 证书链与 cooldown
Composer 2.11.0 于 2026-10-29 发布(2.11.0-RC1 为 10-22)。这个版本以安全修复为主,另有若干会直接影响 CI 流水线和私有仓库的行为变化。下面按影响面从大到小记录。
一、API token 曾被写进 composer.lock
GHSA-fm2w-xgf2-f9fh:内联仓库(直接在 composer.json 的 repositories 中写 options.http.header)的 HTTP 头会被序列化进 composer.lock。这类 header 里通常放的是 Authorization: Bearer 一类的私有源凭据。
lock 文件一般提交进 Git,因此升级后要做的第一件事是检查历史:
grep -n -iE '"(header|headers|authorization|token|bearer)"' composer.lock
命中即视为凭据已泄露,需要轮换 token;改从 auth.json 或 COMPOSER_AUTH 提供凭据,再重新生成 lock。已经进入 Git 历史的提交,即使后续删除也仍然可用,按泄露处理即可。
二、拒绝 eMudhra 中间证书签发的 TLS 链
#13146:Composer 现在会拒绝使用被入侵的 eMudhra 中间证书的 TLS 连接,即使系统 CA 存储信任其根证书。内网自建源或镜像如果挂在这样的证书链上,升级后会直接 TLS 握手失败。
正确做法是换掉证书链,而不是关掉 secure-http 或跳过校验。
三、cooldown 策略与 policy 联动
#12692、#13098~#13102、#13153 新增 cooldown:在一段可配置时间内不使用新发布的包版本,避免刚被投毒的版本立刻进入依赖树。
它和 2.10.0-RC2 引入的 policy 配置块配合使用:policy 统一控制 update/install/audit 的安全策略,取代并弃用大部分 audit 配置,默认在 install 时阻止恶意包。2.11 为自定义策略加了 block-scope 选项(#12990),使其在 install 阶段也能阻断。
相关修复:policy 变化时 lock 未被标记为过期的问题已修(#13149);composer.lock 带 content-hash 冲突标记时,install 会直接失败(#13105)。
四、BC break:source-fallback 被移除
2.10 已经禁用了 dist/zip 安装失败时自动回退到 source checkout,只保留一个显式配置项 source-fallback;2.11 把这个配置项也删掉了。dist 安装失败不会再悄悄改走源码,而是直接报错。
依赖 dist 分发的私有包如果 dist 暂时不可用,流水线会失败而不是兜底成功。确实需要从源码安装的包,应在仓库配置里走 source / vcs 类型。
五、其他安全修复
secure-http之前漏拦不严格合法的 URL,以及使用 git::语法的非安全 URL(#13144)。- 仓库选项里的自定义 HTTP header 曾被发送到名字以仓库主机名开头的其他主机的 dist URL(#13142),例如 dist 指向
repo.example.com.other.tld时 header 也会带上。 - 传给
@composer脚本的额外参数未转义,带引号的参数会被按空格切分(#13169)。 vendor/composer/installed.json中的包名在 install/reinstall 时可逃逸出 vendor 目录(GHSA-c968-33g3-wh7p)。- bin 代理中由包控制的 bin 路径与 shebang 未转义;含 shell 元字符的 bin 路径现在被直接拒绝(#13056)。
- svn 密码不再出现在 debug 输出(#13171);hg 与 fossil 错误输出中的 URL 内嵌凭据被脱敏(#13172)。
六、CI 里能感觉到的变化
- 支持 429 响应与
Retry-After,仓库要求时自动等待重试(#13082)。 - 不再请求 HTTP/3(#13096),近期 curl 版本下每次新连接都会带来延迟。
audit新增--direct/-D,只审计直接依赖(#13121)。- 新增
strict-psr-autoloader配置项,等价于命令行开关(#12893)。 - autoload dump 若包含仅大小写不同的路径会给出警告(#13085),这类项目在大小写不敏感的文件系统上本来就有风险。
- 其他修复:SSH URL 在 git 命令中丢用户导致 2.10.3 以来认证失败(#13081)、GitLab CI job token 认证(#12916)、项目
auth.json或COMPOSER_AUTH的 custom-headers 覆盖而非合并全局配置(#13141)、User-Agent中加入 AI coding agent 标识(#13073、#13087)。 - 依赖解析的性能与内存占用有改进(#13174),
outdated与show --latest并行加载元数据(#13113)。
升级检查命令
composer --version
composer audit
composer audit --direct
grep -n -iE '"(header|headers|authorization|token|bearer)"' composer.lock
composer config --list | grep -iE 'policy|cooldown|secure-http|source-fallback'
最后一条用于确认旧配置:source-fallback 若仍留在 composer.json 或全局配置里,2.11 不再识别,需要删除;policy 与 cooldown 的取值也要按团队容忍度确认一遍,尤其是私有源和 CI 缓存同时存在的情况。