PostgreSQL JDBC 42.7.2 corrige une vulnérabilité par injection

Par:
fredericmazue

ven, 23/02/2024 - 11:39

PostgreSQL JDBC 42.7.2, 42.6.1, 42.5.5, 42.4.4, 42.3.9, 42.2.28 et 42.2.28.jre7 ont été mis à jour pour corriger la vulnérabilité etampillée CVE-2024-1597

L'injection SQL est possible lors de l'utilisation de la propriété de connexion autre que celle par défaut preferQueryMode=simple en combinaison avec un code d'application doté d'un code SQL vulnérable qui annule une valeur de paramètre.

Il n'y a aucune vulnérabilité dans le pilote lors de l'utilisation du mode de requête par défaut. Les utilisateurs qui ne remplacent pas le mode de requête ne sont pas concernés.

Pour exploiter ce comportement, les conditions suivantes doivent être remplies :

  1. Un espace réservé pour une valeur numérique doit être immédiatement précédé d'un moins (c'est-à-dire -)
  2. Il doit y avoir un deuxième espace réservé pour une valeur de chaîne après le premier espace réservé sur la même ligne.
  3. Les deux paramètres doivent être contrôlés par l'utilisateur.

Le comportement antérieur du pilote lors d'un fonctionnement en mode de requête simple insérait la valeur négative du premier paramètre et faisait en sorte que la ligne résultante soit traitée comme un --commentaire SQL. Cela s'étendrait jusqu'au début du paramètre suivant et entraînerait la consommation de la citation de ce paramètre par la ligne de commentaire. Si ce paramètre de chaîne inclut une nouvelle ligne, le texte résultant apparaîtra sans échappement dans le SQL résultant.

Lorsque vous travaillez en mode de requête étendue par défaut, cela ne posera pas de problème car les valeurs des paramètres sont envoyées séparément au serveur. Ce n'est qu'en mode requête simple que les valeurs des paramètres sont intégrées dans le SQL exécuté, ce qui provoque ce problème.

Par exemple :

PreparedStatement stmt = conn.prepareStatement("SELECT -?, ?");
stmt.setInt(1, -1);
stmt.setString(2, "\nWHERE false --");
ResultSet rs = stmt.executeQuery();

Le code SQL résultant en mode requête simple serait :

SELECT --1,'
WHERE false --'

Le contenu du deuxième paramètre est injecté dans la commande. Notez comment le nombre de colonnes de résultats et la clause WHERE de la commande ont changé. Un exemple plus élaboré pourrait exécuter d’autres commandes SQL arbitraires.