Le PGDG (PostgreSQL Global Development Group) a publié une mise à jour de toutes les versions supportées de PostgreSQL, incluant 17.2, 16.6, 15.10, 14.15, 13.18.
PostgreSQL 12 est maintenant en fin de vie et ne devait plus recevoir de correctifs, mais étant donné la nature d’un problème présent dans la précédente publication, le PGDG (PostgreSQL Global Development Group) publie aussi la version 12.22 de PostgreSQL 12.
Les versions 17.1, 16.5, 15.9, 14.14, 13.17, et 12.21 publiées précédemment ne doivent pas être utilisées.
Cette publication corrige également 4 vulnérabilités de sécurités et plus de 35 bogues reportés dans les mois précédents.
Pour la liste complète des changements, se référer à la section Notes de publication.
Note : fin de vie de PostgreSQL 12
Il s’agit de la dernière publication de PostgreSQL 12. PostgreSQL 12 est maintenant en fin de vie et ne recevra plus de correctifs de sécurité ou de bogues. Si vous utilisez PostgreSQL 12 en production, nous vous suggérons de planifier une mise à jour vers une version plus récente et supportée de PostgreSQL. Se référer à notre politique de version pour plus d’informations.
Correctifs et améliorations de cette publication
Les problèmes ci-dessous concernent PostgreSQL 17. Certains de ces problèmes peuvent toutefois concerner d’autres versions de PostgreSQL.
Cette publication :
- rétablit le fonctionnement de
ALTER ROLE .. SET ROLE
etALTER DATABASE .. SET ROLE
. Le correctif CVE-2024-10978 a accidentellement causé la non-application des rôles lorsqu’elle vient de sources non interactives, incluant les commandesALTER {ROLE|DATABASE}
et la variable d’environnementPGOPTIONS
; - rétablit la compatibilité de
timescaledb
et d’autres extensions compilées en utilisant une version de PostgreSQL précédent la publication du 14 novembre (17.0, 16.4, 15.8, 14.13, 13.16, 12.20, et précédents). Ce correctif rétablit la structure ResultRelInfo à sa taille précédente, ainsi les extensions affectées n’ont pas besoin d’être recompilées ; - corrige un cas où un slot de réplication logique pouvait revenir en arrière ;
- annule la suppression de journaux de transactions (WAL) encore utiles
pendant
pg_rewind
; - corrige un problème d’exécution concurrente avec la suppression d’entrée de statistiques partagées, ce qui pouvait entrainer la perte de données statistiques ;
- corrige une défaillance d’
ALTER TABLE
lors de la vérification du changement d’options de classe d’opérateurs d’un index, si la table dispose d’un index avec une classe d’opérateurs différente de celle par défaut.
Problèmes de sécurité
-
CVE-2024-10976 : Les sécurités au niveau ligne (RLS) de PostgreSQL dans une sous-requête ne tiennent pas compte des changements d’identifiant utilisateur.
- CVSS v3.1 Base Score: 4.2
- Supported, Vulnerable Versions: 12 - 17.
Une traçabilité incomplète des tables avec une sécurité niveau ligne (RLS) dans PostgreSQL permet à une requête réutilisée de modifier ou d’afficher des lignes différentes de celles prévues. Les CVE-2023-2455 et CVE-2016-2193 ont fixé la plupart des interactions avec une politique de sécurité au niveau ligne. Il s’agit des mêmes conséquences que ces 2 précédents CVE. En d’autres termes, cela conduit à l’application de politiques RLS potentiellement incorrectes dans les cas où des politiques RLS spécifiques à un rôle sont utilisées et où une requête donnée est planifiée dans le cadre d’un rôle, puis exécutée dans le cadre d’autres rôles. Ce scénario peut se produire dans le cadre des fonctions SECURITY DEFINER ou lorsqu’un utilisateur et une requête communs sont planifiés au départ, puis réutilisés dans le cadre de plusieurs rôles (SET ROLE).
L’application d’une politique incorrecte peut permettre à un utilisateur d’effectuer des lectures et des modifications qui ne seraient normalement pas autorisées. Ceci n’affecte que les bases de données qui ont utilisé
CREATE POLICY
pour définir une politique de sécurité des lignes (RLS). Un attaquant doit adapter son attaque au modèle de réutilisation du plan de requête d’une application particulière, aux changements d’identifiant de l’utilisateur, et aux politiques de sécurité des lignes spécifiques aux rôles. Les versions antérieures à PostgreSQL 17.1, 16.5, 15.9, 14.14, 13.17, et 12.21 sont affectées.Le projet PostgreSQL remercie Wolfgang Walther pour avoir signalé ce problème.
-
CVE-2024-10977 : la bibliothèque
libpq
de PostgreSQL conserve un message d’erreur d’un composant « man-in-the-middle ».- CVSS v3.1 Base Score: 3.1
- Supported, Vulnerable Versions: 12 - 17.
L’utilisation par une application cliente d’un message d’erreur de PostgreSQL permet à un serveur non fiable, selon les réglages SSL ou GSS courants, de fournir des octets arbitraires non-nuls à l’application utilisant la bibliothèque libpq. Par exemple, un attaquant MITM pourrait envoyer un long message d’erreur qu’un humain pourrait prendre par erreur pour le résultat d’une requête. Cela n’est probablement pas un problème pour les applications clientes pour lesquelles l’interface utilisateur indique de façon non ambigüe les limites d’un message d’erreur. Les versions antérieures à PostgreSQL 17.1, 16.5, 15.9, 14.14, 13.17, et 12.21 sont affectées.
Le projet PostgreSQL remercie Jacob Champion pour avoir signalé ce problème.
-
CVE-2024-10978 : PostgreSQL
SET ROLE
,SET SESSION AUTHORIZATION
est réinitialisé avec un mauvais identifiant.- CVSS v3.1 Base Score: 4.2
- Supported, Vulnerable Versions: 12 - 17.
Une mauvaise affectation des privilèges dans PostgreSQL permet à un utilisateur applicatif non privilégié de voir ou de modifier des lignes différentes de celles prévues. Une attaque nécessite que l’application utilise
SET ROLE
,SET SESSION AUTHORIZATION
, ou une fonctionnalité équivalente. Le problème survient lorsqu’une requête de l’application utilise des paramètres de l’attaquant ou transmet les résultats de la requête à l’attaquant. Si cette requête réagit àcurrent_setting('role')
ou à l’identifiant de l’utilisateur actuel, elle peut modifier ou renvoyer des données comme si la session n’avait pas utiliséSET ROLE
ouSET SESSION AUTHORIZATION
. L’attaquant ne contrôle pas quel identifiant incorrect s’applique. Le texte de la requête provenant de sources moins privilégiées n’est pas un problème ici, parce queSET ROLE
etSET SESSION AUTHORIZATION
ne sont pas des bacs à sable pour les requêtes non vérifiées. Les versions antérieures à PostgreSQL 17.1, 16.5, 15.9, 14.14, 13.17, et 12.21 sont affectées.Le projet PostgreSQL remercie Tom Lane pour avoir signalé ce problème.
-
CVE-2024-10979 : le changement d’une variable d’environnement de PL/Perl exécute arbitrairement du code.
- CVSS v3.1 Base Score: 8.8
- Supported, Vulnerable Versions: 12 - 17.
Un contrôle incorrect des variables d’environnement dans PostgreSQL PL/Perl permet à un utilisateur de base de données non privilégié de modifier des variables d’environnement sensibles (par exemple
PATH
). Ceci est souvent suffisant pour permettre l’exécution de code arbitraire, même si l’attaquant n’est pas un utilisateur du système d’exploitation du serveur de base de données. Les versions antérieures à PostgreSQL 17.1, 16.5, 15.9, 14.14, 13.17, et 12.21 sont affectées.Le projet PostgreSQL remercie Coby Abrams pour avoir signalé ce problème.
Corrections de bogues et améliorations
Cette mise à jour corrige plus de 35 bogues ayant été reportés durant les mois précédents. Les problèmes ci-dessous concernent PostgreSQL 17. Certains de ces problèmes peuvent aussi concerner d’autres versions de PostgreSQL.
Les correctifs sont :
- correction de l’attachement ou du détachement d’une partition de table avec une contrainte de clé étrangère. Après la mise à jour, les utilisateurs impactés par ce problème devront exécuter des étapes manuelles pour terminer la correction. Merci de consulter la section Mise à jour de cette note de publication pour plus d’information ;
- correction de l’utilisation de la
libc
comme collation par défaut lorsqueLC_CTYPE
estC
alors qu’LC_COLLATE
est une localisation différente. Ceci peut amener des résultats de requêtes incorrects. Si vous avez ces réglages dans votre base de données, il est nécessaire de réindexer les index impactés après la mise à jour. Ce problème ne concerne que PostgreSQL 17.0 ; - plusieurs corrections du Planner de requêtes, incluant
l’interdiction de joindre des partitions (
partitionwise join
) si les collations des partitions ne correspondent pas ; - correction d’une potentielle mauvaise réponse ou mauvaise erreur du
planner pour les actions
MERGE ... WHEN NOT MATCHED BY SOURCE
; - corrections de la validation de
COPY FORCE_NOT_NULL
etFORCE_NULL
; - correction d’un crash du serveur quand un appel à la fonction
json_objectagg()
contient une fonction volatile ; - vérification qu’il y a une dépendance enregistrée entre une table
partitionnée et une méthode d’accès non intégrée spécifiée dans
CREATE TABLE ... USING
. Ce correctif ne s’occupe que des tables partitionnées créées après cette mise à jour ; - correction d’un problème d’exécution concurrente lors de la validation d’une transaction sérialisable ;
- correction d’un problème d’exécution concurrente dans un
COMMIT PREPARED
qui pourrait nécessiter la suppression manuelle d’un fichier après la récupération d’un crash ; - correction de la vue
pg_cursors
pour se prémunir d’erreur en excluant les curseurs lorsqu’ils ne sont pas complètement configurés ; - réduction de la consommation mémoire du décodage logique ;
- correction pour empêcher les fonctions stables de recevoir des
valeurs de lignes périmées lorsqu’elles sont appelées à partir de
la liste d’arguments d’une instruction
CALL
et que leCALL
se trouve dans un bloc d’EXCEPTION
PL/pgSQL ; - correction d’un crash de JIT pour les systèmes ARM (aarch64) ;
- la commande
\watch
depsql
traite maintenant les valeurs inférieures à 1ms comme un 0 (pas d’attente entre les exécutions) ; - correction de l’impossibilité d’utiliser les informations
d’identification d’un utilisateur de réplication dans le fichier de
mots de passe (
pgpass
) ; pg_combinebackup
remonte maintenant une erreur si un fichier de sauvegarde incrémentale est présent dans un répertoire qui devrait contenir une sauvegarde complète ;- correction pour éviter de réindexer les tables et index temporaires
dans
vacuumdb
etparallel reindexdb
.
Cette publication met aussi à jour les fichiers de fuseau horaire avec
la publication de tzdata
2024b. Cette version de tzdata
modifie
les anciens noms de zones compatibles avec System-V pour dupliquer les
zones géographiques correspondantes ; par exemple PST8PDT
est
maintenant un alias pour America/Los_Angeles
. La principale
conséquence visible est que pour les horodatages antérieurs à
l’introduction de fuseaux horaires normalisés, la zone est considérée
comme représentant le temps solaire moyen local pour l’emplacement
nommé. Par exemple, dans PST8PDT
, une entrée timestamptz
telle que
1801-01-01 00:00
aurait auparavant été rendue par 1801-01-01 00:00:00-08
,
mais elle est maintenant rendue par 1801-01-01 00:00:00-07:52:58
.
Des corrections historiques ont également été apportées pour le Mexique, la Mongolie et le Portugal. Notamment, Asia/Choibalsan est maintenant un alias pour Asia/Ulaanbaatar au lieu d’être une zone séparée, principalement parce que les différences entre ces zones se sont avérées être basées sur des données peu fiables.
Mise à jour
Toutes les publications de mises à jour de PostgreSQL sont
cumulatives. Comme pour les autres mises à jour mineures, il n’est pas
nécessaire d’extraire et de recharger les bases de données ni
d’utiliser pg_upgrade
pour appliquer cette mise à jour ;
il suffit simplement d’arrêter PostgreSQL et de mettre à jour les binaires.
Si vous utilisez des tables partitionnées avec des contraintes de clés
étrangères pour lesquels vous avez fait des commandes ATTACH PARTITION/DETACH PARTITION
, vous allez avoir besoin de faire quelques
étapes après cette mise à jour. La correction s’obtient en exécutant
une commande ALTER TABLE ... DROP CONSTRAINT
sur la table désormais
autonome pour chaque contrainte défectueuse, et en ajoutant à
nouveau la contrainte. Si l’ajout de la contrainte échoue, vous devez
alors rétablir manuellement la cohérence entre les tables référentes
et référencées, puis créer à nouveau la contrainte.
Cette requête peut être utilisée pour identifier les contraintes défaillantes et construire les commandes pour les recréer :
SELECT conrelid::pg_catalog.regclass AS "constrained table" , conname AS constraint
, confrelid::pg_catalog.regclass AS "references"
, pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;' , conrelid::pg_catalog.regclass , conname) AS "drop"
, pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;' , conrelid::pg_catalog.regclass
, conname , pg_catalog.pg_get_constraintdef(oid)) AS "add"
FROM pg_catalog.pg_constraint c
WHERE contype = 'f'
AND conparentid = 0
AND (
SELECT count(*)
FROM pg_catalog.pg_constraint c2
WHERE c2.conparentid = c.oid) <> (
SELECT count(*)
FROM pg_catalog.pg_inherits i
WHERE (i.inhparent = c.conrelid
OR i.inhparent = c.confrelid)
AND EXISTS (
SELECT 1
FROM pg_catalog.pg_partitioned_table
WHERE partrelid = i.inhparent));
Étant donné qu’il est possible qu’une ou plusieurs des étapes ADD CONSTRAINT
échouent, vous devriez enregistrer la sortie de cette
requête dans un fichier puis exécuter chaque étape.
De plus, si vous utilisez PostgreSQL 17.0 et libc
comme fournisseur de collation par défaut, et que le paramètre
LC_CTYPE
vaut C
alors que le paramètre LC_COLLATE
a une valeur
locale différente, vous allez avoir besoin de reconstruire les index
basés sur du texte. Vous pouvez faire cela avec la commande REINDEX INDEX CONCURRENTLY
.
Les utilisateurs ayant sauté une ou plusieurs mises à jour peuvent avoir besoin d’étapes additionnelles après la mise à jour. Les notes de publication des versions précédentes fournissent les détails.
Pour plus de détails, se référer à la note de publication de versions.
Liens
- Téléchargements
- Notes de version
- Page sur la sécurité
- Politique de version
- Suivre @postgresql sur X/Twitter
- Faire un don
Si vous avez des corrections ou suggestions sur cette annonce de publication, merci de les envoyer à la mailing liste publique pgsql-www@lists.postgresql.org.