Pip 26.1 已发布,带来了两项功能,解决了 Python 打包生态中长期存在的痛点:依赖冷却(Dependency Cooldown),即在软件包发布后的等待期内禁止安装;以及对 PEP 751 规定的 pylock.toml 锁定文件的实验性支持。此外还修复了两个 CVE 漏洞,并停止支持 Python 3.9。
Pip 提交者 Richard Si 写道:
在当今世界,针对上游依赖项目的供应链攻击愈发频发,开发者亟需一种方式为自己争取时间来检测和应对这些安全事件。
冷却机制的原理很简单。假设攻击者入侵了一个上游软件包,在正常情况下,所有执行 pip install 的 CI 流水线和开发者工作站在几小时内就会拉取到恶意版本。而启用 --uploaded-prior-to=P7D 参数后,pip 只会拉取在 PyPI 上已存在至少七天的版本。这为社区留出充足时间,在恶意版本接入构建流程前及时发现入侵行为。
该功能直接借鉴了 William Woodruff 极具影响力的文章《我们都应该使用依赖冷却》。Woodruff 分析了十起著名的供应链攻击,得出了令人信服的结论:
10 起攻击中有 8 起的可利用时间窗口期不足一周。设置 7 天的冷却期便能阻止绝大多数攻击到达终端用户。将冷却期延长至 14 天可以阻止几乎所有攻击(其中的一起除外)。
近期发生的事件既说明了冷却机制的必要性,但也体现出它的局限性。Essential Plugin 供应链攻击植入了一个后门,潜伏了八个月,最终在 40 万个 WordPress 安装环境中激活。XZ Utils 后门更是历经两年时间积累信任,攻击者才正式发起行动。七天的冷却期无法阻止这些特定攻击,但能拦截更为常见的模式——即被入侵的软件包在发布后的几小时内就被拉入 CI 流水线。
Si 指出了一个重要的利弊权衡:冷却期也会耽误正规的安全漏洞修复。使用此功能的团队应将其与 Dependabot 或 pip-audit 配合使用,确保关键补丁不会被卡在冷却窗口之后。
另一项重大新增功能是对 pylock.toml 的实验性支持。PEP 751 早在一年前就将该锁定文件格式制定为正式标准,但在此之前,只有 uv 工具支持通过该文件安装依赖。现在启用 -r 参数可读取 pylock.toml 文件,意味着 pip install -r pylock.toml 是开箱即用的。现在 pip 作为默认包管理器随每个 Python 安装一起提供,pylock.toml 便拥有了全面普及的可行路径。
Datasette 的作者 Simon Willison 立即测试了该功能,并演示了如何生成一个 519 行的 pylock.toml,锁定 Datasette 和 LLM 及其所有依赖,并顺利通过该文件完成安装。Willison 还重点介绍了依赖冷却功能,展示了 --uploaded-prior-to P4D 如何正确返回他的 LLM 软件包的旧版本,而不是他三天前发布的版本。
pip 团队将锁定文件支持作为实验性特性,保留未经通知便可对其进行修改或移除的权利。pip sync 命令计划作为操作锁定文件的核心最终接口。Stéphane Bidoul 主导了该功能的实现,并将 pylock.toml 支持合并到了 packaging 库,让更广泛的生态都能从中获益。
在 Reddit 平台上,Python 社区普遍认可新增的锁定文件功能,不过鉴于 uv 工具如今普及速度极快,众人也在热议 pip 的这个实现的实际意义。一位评论者还提出了对于 uv 所属企业权属方面的治理层面顾虑:
很高兴看到 pip 在持续稳步优化。尽管 uv 很棒,但我认为目前还不能对其完全放心,毕竟 Astral 公司已被 OpenAI 收购。
也有网友认为,pip 具备极高的通用性,它对锁定文件的支持对于非企业场景下普及使用 uv 而言至关重要:
uv 让我觉得失去了太多自主把控的能力。我不确定它能否在客户部署环境中正常使用,就算无法使用,我也不想让客户额外安装 uv。而 pip 在所有
python...-slimDocker 镜像里都能直接使用,升级也十很容易。
本次发布还新增了两个安全补丁。CVE-2026-3219 修复了一处漏洞,该漏洞会导致 pip 将 .tar.gz 归档误认为 zip 文件,使攻击者能够混淆恶意代码。CVE-2026-6357 关闭了由 pip 自检过程中因延迟导入引发的代码执行漏洞。内置的 urllib3 也从 1.x 升级到了 2.6.3,顺带修复了另外三个 CVE 安全漏洞。
Pip 26.1 现已可用,可通过 pip install --upgrade pip 升级。
查看英文原文:https://www.infoq.com/news/2026/05/pip-261-dependency-cooldowns/





