{"id":14596,"date":"2026-07-27T10:03:51","date_gmt":"2026-07-27T10:03:51","guid":{"rendered":"https:\/\/serisec.com\/index.php\/2026\/07\/27\/pypi-blocks-new-file-uploads-on-14-day-old-releases-to-prevent-package-poisoning-attacks\/"},"modified":"2026-07-27T10:03:51","modified_gmt":"2026-07-27T10:03:51","slug":"pypi-blocks-new-file-uploads-on-14-day-old-releases-to-prevent-package-poisoning-attacks","status":"publish","type":"post","link":"https:\/\/serisec.com\/index.php\/2026\/07\/27\/pypi-blocks-new-file-uploads-on-14-day-old-releases-to-prevent-package-poisoning-attacks\/","title":{"rendered":"PyPI Blocks New File Uploads on 14-Day-Old Releases to Prevent Package Poisoning Attacks"},"content":{"rendered":"<p>    PyPI Blocks New File Uploads on 14-Day-Old Releases to Prevent Package Poisoning Attacks<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n    <!-- no image --><br \/>\n \t<BR><br \/>\n<BR><\/BR><\/p>\n<div>\n<p class=\"wp-block-paragraph\">PyPI has introduced a new security measure that prevents users from uploading new files to package releases that are more than 14 days old. This change aims to stop attackers from adding malicious files to trusted Python package versions after compromising a maintainer\u2019s publishing token or release workflow.<strong> <\/strong><\/p>\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/cybersecuritynews.com\/pypi-cryptomining-malware\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python Package Index (PyPI)<\/a> has begun rejecting new uploads for releases older than 14 days. This restriction was integrated into the PyPI Warehouse codebase on July 8, 2022, and addresses a software supply-chain risk created by allowing \u201copen-ended\u201d releases.<\/p>\n<p class=\"wp-block-paragraph\">Previously, package maintainers could publish additional files to an existing release at any time. For example, a maintainer might upload a new wheel for a newer version of Python while keeping the same package version number.<\/p>\n<p class=\"wp-block-paragraph\">While this flexibility was useful for compatibility, it also presented an opportunity for attacks. If an attacker gained access to a PyPI API token, <a href=\"https:\/\/cybersecuritynews.com\/north-korean-hackers-abuse-mastra-npm-supply-chain\/\" target=\"_blank\" rel=\"noreferrer noopener\">compromised a CI\/CD pipeline<\/a>, or abused a trusted publishing workflow, they could upload a malicious wheel to an old release that developers considered safe.<\/p>\n<p class=\"wp-block-paragraph\">Since the version number would not change, identifying the malicious file during routine dependency updates would be more challenging. The new rule limits this risk. Once a release is older than 14 days, PyPI will no longer accept new file uploads for that version.<\/p>\n<p class=\"wp-block-paragraph\">PyPI has indicated that it has not been aware of attackers exploiting this specific vulnerability previously. However, the platform noted that no technical controls existed to prevent such scenarios, except for the understanding that attackers may not recognize the opportunity.<\/p>\n<h2 id=\"h-pypi-14-days-locks\" class=\"wp-block-heading\"><strong>PyPI 14 Days Locks<\/strong><\/h2>\n<p class=\"wp-block-paragraph\">The issue gained prominence after the compromise of popular <a href=\"https:\/\/cybersecuritynews.com\/litellm-package-compromised\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python packages LiteLLM<\/a> and<a href=\"https:\/\/cybersecuritynews.com\/telnyx-pypi-package-compromised\/\"> Telnyx<\/a> in 2022. These incidents highlighted how trusted automated release environments could be entry points for supply-chain attacks.<\/p>\n<p class=\"wp-block-paragraph\">With the new restrictions in place, a compromised maintainer account can no longer silently add a malicious file to a long-established release. Maintainers needing to publish support for a new version of Python will typically need to create and release a new package version instead.<\/p>\n<p class=\"wp-block-paragraph\">This change also simplifies incident response for both PyPI administrators and package users. Under the previous model, a package release could contain both legitimate and malicious files, depending on when each file was uploaded, leaving users uncertain about the safety of a particular release version.<\/p>\n<p class=\"wp-block-paragraph\">Before implementing this rule, PyPI reviewed historical publishing patterns to understand its potential effects. This analysis included projects that had added files after a release had already been published.<\/p>\n<p class=\"wp-block-paragraph\">A review of Python 3.10-compatible wheels across the top 15,000 packages found that only 56 projects uploaded a compatible wheel more than <a href=\"https:\/\/blog.pypi.org\/posts\/2026-07-22-releases-now-reject-new-files-after-14-days\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">14 days after the original release<\/a>, suggesting that requiring a new package version would have minimal impact on most maintainers.<\/p>\n<p class=\"wp-block-paragraph\">The proposal was also discussed at the Packaging Summit during PyCon US 2022, where participants reached a rough consensus that it would be acceptable for projects to increment their version number when adding support for new Python versions.<\/p>\n<p class=\"wp-block-paragraph\">PyPI has cautioned users not to rely on this behavior as a formal guarantee of a release state yet. There are currently no published API semantics that confirm whether a release is open or closed for uploads.<\/p>\n<p class=\"wp-block-paragraph\">Such definitions are expected to emerge through the proposed Upload 2.0 API and staged previews described in PEP 694. Until then, the 14-day limit serves as a practical security safeguard against a subtle but significant risk of package poisoning.<\/p>\n<p class=\"has-text-align-center has-background wp-block-paragraph\" style=\"background:linear-gradient(180deg,rgb(238,238,238) 87%,rgb(169,184,195) 100%)\"><strong>\u00a0Strengthen Your SOC by Accelerating Threat Detection &amp; Rapid Investigations.\u00a0-&gt;\u00a0<a href=\"https:\/\/any.run\/enterprise\/?utm_source=csn&amp;utm_medium=links&amp;utm_campaign=sandbox&amp;utm_content=enterprise&amp;utm_term=0626#contact-sales\" target=\"_blank\" rel=\"noreferrer noopener\">Integrate ANY.RUN With Your SOC\u00a0<\/a><strong><a href=\"https:\/\/any.run\/enterprise\/?utm_source=csn&amp;utm_medium=links&amp;utm_campaign=sandbox&amp;utm_content=enterprise&amp;utm_term=0626#contact-sales\" target=\"_blank\" rel=\"noreferrer noopener\">Now<\/a><\/strong>.<\/strong><\/p>\n<p>The post <a href=\"https:\/\/cybersecuritynews.com\/pypi-14-day-release-lock\/\">PyPI Blocks New File Uploads on 14-Day-Old Releases to Prevent Package Poisoning Attacks<\/a> appeared first on <a href=\"https:\/\/cybersecuritynews.com\/\">Cyber Security News<\/a>.<\/p>\n<\/div>\n<p> \t<BR><br \/>\n <BR><\/BR><br \/>\n    Abinaya<br \/>\n \t<BR><br \/>\n<BR><\/BR><br \/>\n<a href=\"https:\/\/cybersecuritynews.com\/pypi-14-day-release-lock\/\">Go to cyber-security-news<\/a><br \/>\n \t<BR><br \/>\n <BR><\/BR><\/p>\n","protected":false},"excerpt":{"rendered":"<p>PyPI Blocks New File Uploads on 14-Day-Old Releases to Prevent Package Poisoning Attacks PyPI has introduced a new security measure that prevents users from uploading new files to package releases that are more than 14 days old. This change aims to stop attackers from adding malicious files to trusted Python package versions after compromising a [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[129,63,937],"tags":[130],"class_list":["post-14596","post","type-post","status-publish","format-standard","hentry","category-cyber-security","category-cyber-security-news","category-python","tag-cyber-security-news"],"_links":{"self":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts\/14596"}],"collection":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/comments?post=14596"}],"version-history":[{"count":0,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/posts\/14596\/revisions"}],"wp:attachment":[{"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/media?parent=14596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/categories?post=14596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/serisec.com\/index.php\/wp-json\/wp\/v2\/tags?post=14596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}