TL;DR: Packagist has enabled default malware blocking, stable version immutability, and client enforcement in Composer to stop malicious package reuse before install, according to Aikido. The shift matters because supply-chain control now depends less on post-publication takedown and more on registry policy, client versioning, and trust boundaries that CI pipelines and AI agents inherit.
NHIMG editorial — based on content published by Aikido: Packagist is now protected by Aikido Intel and other updates to the PHP registry
By the numbers:
- Composer 2.10's dependency policy framework pulls the flagged version out of the resolution pool, so composer update, composer require, and composer create-project won't select it.
Questions worth separating out
Q: What breaks when package registries allow stable releases to be rewritten?
A: Trust in version numbers breaks first, then provenance, then downstream build integrity.
Q: Why do package registries need to govern automated clients as identities?
A: Because CI jobs, bots, and AI-assisted workflows are the systems that actually consume packages.
Q: How can security teams tell whether package blocking is actually working?
A: Look for blocked versions being removed from dependency resolution before install, not just flagged after download.
Practitioner guidance
- Enforce registry-aware client versions Require build agents, developer workstations, and automation to use clients that honour registry policy and stable version immutability.
- Inventory package-consuming identities Map every CI job, bot, and AI-assisted workflow that can fetch packages from registries.
- Prefer immutable publication controls Require registries and package workflows to preserve stable release immutability so a published version cannot be silently retagged after review.
What's in the full article
Aikido's full post covers the operational detail this post intentionally leaves for the source:
- The exact Composer 2.10 dependency policy behaviour that removes flagged versions from resolution.
- The planned Packagist controls for minimum release age, organizational ownership, and staged releases.
- The specific client enforcement model for refusing flagged package files to older and newer clients.
- The registry and ecosystem comparison points across npm, PyPI, crates.io, and RubyGems.
👉 Read Aikido's update on Packagist protection and Composer malware blocking →
Package registry controls: what it means for build and identity governance?
Explore further
Registry policy is becoming a control plane for software trust. Package ecosystems can no longer rely on takedown after detection because the attack window is already large enough to matter. When a registry blocks known malicious versions by default, the security boundary shifts upstream into resolution and selection. That is a material change for build governance, and it reduces the burden on every downstream team to rediscover the same malicious package. Practitioners should treat registry policy as a first-class security control, not a convenience feature.
A question worth separating out:
Q: Who is accountable when malicious code enters through a package registry?
A: Accountability usually spans the package maintainer, the registry controls, and the consuming organisation’s build governance. The maintainer identity is the publishing control point, but the consumer still owns script restrictions, lockfile enforcement, and credential protection on build systems. The right question is who owned each control layer, not who noticed the attack first.
👉 Read our full editorial: Package registry controls are shifting from detection to prevention