
Fin mars 2019, la société américaine Trustwave, spécialisée dans les services de cybersécurité et de protection contre les menaces, a publié un message sur une vulnérabilité du SGBD PostgreSQL, présent dans toutes les versions à partir de PostgreSQL 9.3 à la version 11.2. Cette vulnérabilité a été enregistrée dans la base de données de vulnérabilités de sécurité des informations CVE (Common Vulnerabilities and Exposures) sous le numéro CVE-2019-9193 . Ce message a fait grand bruit, car selon le système de notation de vulnérabilité CVSS (Common Vulnerability Scoring System), cette vulnérabilité a été notée 9.0 sur une échelle de 10 points.
Les vulnérabilités ont reçu les caractéristiques suivantes:
- Impact sur la confidentialité (influence sur la confidentialité) - la divulgation complète des informations entraîne la divulgation de tous les fichiers système.
- Impact sur l'intégrité (impact sur l'intégrité) - une perte complète de protection du système, par conséquent, l'ensemble du système est compromis.
- Impact sur la disponibilité - la disponibilité d'une ressource est complètement indisponible.
- La complexité d'accès est faible. L'utilisation nécessite très peu de connaissances ou de compétences.
- Authentification - nécessite qu'un attaquant se connecte au système, par exemple, via la ligne de commande ou via une session de bureau ou une interface Web.
- Accès obtenu - non.
- Type (s) de vulnérabilité (type de vulnérabilité) - exécution de code.
Voyons maintenant ce qui se passe réellement.
En 2013, de retour dans PostgreSQL 9.3, un commit a été ajouté, qui, par analogie avec la commande \ copy meta dans psql, vous permet de déplacer des données entre des tables PostgreSQL et des fichiers normaux dans le système de fichiers. COPY TO copie le contenu du tableau dans le fichier et COPY FROM - du fichier vers le tableau (ajoute des données à celles déjà présentes dans le tableau). Contrairement à la méta-commande \ copy, qui est implémentée sur le client, la commande COPY..TO / FROM est implémentée côté serveur. La commande COPY possède le paramètre PROGRAM optionnel «command», qui permet au serveur d'exécuter la «commande» et de transmettre la sortie standard au serveur PostgreSQL ou vice versa. C'est ce paramètre qui a provoqué la panique et le message sur la vulnérabilité, car selon Trustwave, cette commande vous permet d'exécuter du code arbitraire dans le contexte de l'utilisateur du système d'exploitation. Cependant, c'est exactement ce que les développeurs voulaient! À cette occasion, il y avait un message officiel du PostgreSQL Global Development Group (PGDG), ainsi que de la correspondance dans la liste de diffusion pgsql-general (CVE-2019-9193 à propos de COPY FROM / TO PROGRAM ) et des commentaires de principaux développeurs, par exemple Magnus Hagander, sur son blog .
Mais pour comprendre l'essence, les détails sont importants. Voici ce qui est écrit dans la documentation à ce sujet: « Notez que la commande est lancée via le shell de commande, donc si vous voulez passer des arguments à cette commande à partir d'une source non fiable, vous devez soigneusement vous débarrasser de tous les caractères spéciaux qui ont une signification spéciale dans le shell, ou pour les filtrer. Pour des raisons de sécurité, il est préférable de vous limiter à une ligne de commande fixe ou du moins de ne pas autoriser les utilisateurs à y saisir du contenu arbitraire . "
De plus, la documentation indique que seuls les superutilisateurs de bases de données sont autorisés à exécuter la commande COPY avec un fichier ou une commande externe, ou (dans la version 11 est apparue) les membres des rôles intégrés pg_read_server_files, pg_write_server_files ou pg_execute_server_program, car cela vous permet de lire / écrire des fichiers et d'exécuter n'importe quel programmes auxquels le serveur a accès. L'exécution d'une commande dans PROGRAMME peut être limitée par d'autres mécanismes de contrôle d'accès fonctionnant dans l'OS, par exemple SELinux.
Structurellement, il n'y a pas de limite de sécurité entre le superutilisateur de la base de données et l'utilisateur du système d'exploitation au nom duquel le processus serveur du serveur s'exécute. Les fonctions de COPY ... PROGRAM ajoutées dans PostgreSQL 9.3 n'ont rien changé à ce qui précède, mais ont ajouté une nouvelle commande dans les mêmes limites de sécurité qui existaient déjà. Par conséquent, le serveur PostgreSQL ne peut pas s'exécuter en tant que superutilisateur du système d'exploitation (par exemple, root).
La fonctionnalité COPY..TO / FROM ... PROGRAM offre elle-même des possibilités illimitées pour la manipulation des données, le post-traitement des données, la compression des données à la volée, etc. Et interdire l'utilisation de tels outils utiles serait une erreur. Des exemples de la construction COPY..TO / FROM ... PROGRAM sont donnés sur le blog de Michael Paquier.
Une conclusion importante qui découle de cette histoire est que lors de la conception et de la création de bases de données, il est nécessaire de se souvenir non seulement des caractéristiques fonctionnelles, mais également de la sécurité des informations et de suivre les règles suivantes:
Ainsi, nous avons compris que CVE-2019-9193 n'est pas une vulnérabilité. Mais vous ne devez pas vous détendre. Ne manquez pas d'informations sur les mises à jour et les nouvelles versions mineures qui corrigent les vulnérabilités identifiées , sans lesquelles aucun grand projet ne peut le faire.