Ce qui se passe
Composer 2.11.0 introduit une politique de cooldown : vous fixez une durée, et Composer écarte toute version
publiée depuis moins longtemps que cela. L'idée est simple : si quelqu'un publie une version malveillante d'un paquet
dont vous dépendez, elle a des chances d'être signalée et retirée avant que votre composer update ne la voie. La 2.10
avait déjà ajouté des politiques qui bloquent les versions visées par un avis de sécurité ou un logiciel malveillant
connu ; le cooldown couvre le trou entre la publication et ce signalement.
Le réglage
La politique est désactivée par défaut. On la déclare dans composer.json :
{
"config": {
"policy": {
"cooldown": {
"period": "1 day"
}
}
}
}period accepte une chaîne ("6 hours", "7 days" ; unités second, minute, hour, day, week) ou un entier
en secondes. Ce qu'il faut savoir :
- elle joue pendant
composer updateetcomposer require;composer outdatedetcomposer show --latestaffichent la dernière version autorisée et marquent les plus récentes comme en attente ; - elle ne joue pas sur
composer install, qui installe ce que le fichiercomposer.lockcontient ; les versionsdev-*et les paquets de plateforme (PHP, extensions) ne sont jamais écartés ; - un
composer updatecomplet remplace une version verrouillée encore en carence par une plus ancienne, et échoue si aucune ne convient à vos contraintes ; - une liste
ignoreexempte des paquets, avec motif, contrainte de version et jokers (par exemple"mycompany/*"pour vos propres paquets) ; - pour un correctif urgent :
composer update --no-cooldown vendor/paquet. L'option existe aussi surrequire,removeetcreate-project, et ne lève que le cooldown, pas les politiques d'avis, de malware ou personnalisées ; - en CI, la variable
COMPOSER_POLICY_COOLDOWN_PERIODfixe ou remplace la durée ;0la désactive pour l'exécution.
La date retenue est le published-time que Packagist.org attribue à chaque version, pas le champ time du
composer.json, que l'auteur du paquet maîtrise. Un dépôt qui ne fournit pas published-time pour une version
nécessaire fait échouer la commande en nommant le paquet ; pour un dépôt de confiance, require-published-time: false
retombe sur time. Les dépôts VCS, path et artifact utilisent toujours time. Private Packagist gère déjà cette
politique, et un administrateur peut la fixer pour toute l'organisation.
Les six correctifs de sécurité
- GHSA-c968-33g3-wh7p : à l'installation, Composer n'écrit plus hors du dossier
vendorquand un nom de paquet devendor/composer/installed.jsony pointe ; - GHSA-fm2w-xgf2-f9fh : les en-têtes HTTP des dépôts inline (jetons d'API) ne sont plus écrits dans
composer.lockni dansinstalled.json; - les certificats intermédiaires eMudhra, qui ne sont plus de confiance, sont refusés même si le magasin système fait confiance à leur racine ;
- les proxys de binaires échappent chemins et shebangs fournis par le paquet, et refusent les métacaractères shell ;
secure-httpattrape aussi les URL invalides et la syntaxe<transport>::<adresse>de git ;- les options d'un dépôt (en-têtes personnalisés) ne partent plus vers des URL de distribution dont l'hôte commence seulement par le nom du dépôt.
Ce qui casse
Si le téléchargement de l'archive (dist) échoue, Composer ne se rabat plus sur un clone du dépôt source, et l'option
provisoire source-fallback (dépréciée en 2.10) disparaît. Si un paquet ne s'installe que depuis les sources, réglez
preferred-install sur source pour lui, ou utilisez --prefer-source. Autre effet : modifier la config policy
marque le fichier de verrouillage comme périmé, d'où un avertissement jusqu'à la prochaine mise à jour du lock.
Comment s'y prendre
composer self-update.- Ajouter un cooldown d'un jour sur un projet, lancer
composer updateen CI et lire les paquets écartés. - Prévoir
--no-cooldowndans la procédure de correctif urgent, etignorepour vos paquets internes. - Au passage,
composer audit --direct(-D) n'audite que les dépendances directes.
Source : Laravel News, qui renvoie à l'annonce de Packagist et aux notes de version de Composer 2.11.0. Source en anglais.