内容提要
PyPI 现已拒绝向超过14天的旧版本上传新文件,以防止发布令牌泄露导致恶意文件注入。此变更源于2026年LiteLLM等包被攻击事件,经数据分析和PyCon讨论后实施。用户需发布新版本以支持新Python版本,未来将定义更明确的关闭语义。
延伸解读
背景:从攻击事件到政策落地
该限制源于2026年LiteLLM和Telnyx包因GitHub Action中的“可变引用”被攻破的事件。攻击者可能利用旧版本发布新文件注入恶意代码,而此前PyPI并未禁止这种行为。经过数据分析和PyCon US 2026 Packaging Summit的讨论,社区认为要求用户发布新版本以支持新Python版本是可接受的,最终推动了这一政策的实施。
影响:对发布工作流的具体改变
新政策意味着,如果发布超过14天,将无法再向该发布上传新文件。这会影响那些习惯在旧版本上补充新Python版本(如cp314)支持的开发者。根据PyPI对前15000个包的查询,只有56个项目在发布超过14天后才添加了3.14兼容的wheel,因此影响范围相对较小。开发者需要改为发布新版本,而不是修改旧版本。
注意:行为尚未正式定义
PyPI官方提醒用户不要依赖这一行为,因为目前还没有定义“不再接受新文件的发布”的明确语义,也没有API可以查询发布状态。这些语义将在PEP 694定义的“Upload 2.0 API”和“Staged Previews”标准化后确定。因此,在过渡期内,开发者应关注后续更新,避免基于当前限制做出长期假设。
Q&A
PyPI 为什么拒绝向超过14天的旧版本上传新文件?
为了防止发布令牌或工作流泄露导致旧版本被注入恶意文件,从而保护用户安全。
PyPI 拒绝向超过14天的旧版本上传新文件的具体规则是什么?
PyPI 现在拒绝向超过14天的旧版本上传新文件,但用户不应依赖此行为,因为尚未定义明确的关闭语义。
PyPI 的这项变更是在什么背景下提出的?
该讨论始于2024年1月PEP 740(数字证明)期间,并在2026年3月LiteLLM和Telnyx包被攻击后重启。
LiteLLM 和 Telnyx 包是如何被攻击的?
由于这些项目在使用Trivy GitHub Action时存在“可变引用”,导致发布令牌泄露,从而被攻击。
PyPI 在实施这项变更前做了哪些数据分析和讨论?
PyPI 数据库查询显示,在15000个包中只有56个在发布14天后才添加了cp314轮子;该话题在PyCon US 2026的Packaging Summit上讨论,与会者认为要求用户升级版本是可接受的。
这项变更对用户有什么影响?
用户需要发布新版本以支持新的Python版本,而不能在旧版本上添加新文件。
PyPI 未来将如何定义“关闭”语义?
未来将通过PEP 694标准化的“Upload 2.0 API”和“Staged Previews”来定义“关闭”语义,而不是当前的“开放”状态。