Dolibarr logo

Vladimir a eu l’occasion de tester la sécurité du logiciel de CRM Open Source Dolibarr lors d’un test d’intrusion d’un outil métier.

Dolibarr ERP CRM est un progiciel moderne pour gérer l’activité de votre entreprise ou fondation (contacts, fournisseurs, factures, commandes, stocks, agenda, comptabilité, …). Il s’agit d’un logiciel open source (écrit en PHP) et conçu pour les petites et moyennes entreprises, les fondations et les indépendants.

Réf : https://github.com/Dolibarr/dolibarr

Notre pentester a découvert une vulnérabilité critique exploitable par un attaquant non authentifié. Elle permet d’accéder à l’ensemble du fichier client d’un concurrent, ses prospects, ses fournisseurs, et potentiellement des informations d’employés si une fiche contact existe. Les notes publiques comme privées sont également présentes. Très facile d’exploitation, elle affecte les versions 16.x de Dolibarr.

EDIT (22/03/2023) : La version 16.0.5 de Dolibarr corrige la vulnérabilité pour la v16. (https://github.com/Dolibarr/dolibarr/blob/16.0.5/ChangeLog#L34).

EDIT2 (13/06/2023) : CVE-2023-33568 assignée.

Découverte de la vulnérabilité

Afin de réaliser des tests sur le logiciel en lui-même sans impacter la production du client, et en ayant accès à un maximum d’informations, le consultant s’est créé un environnement local de Dolibarr dans la version identifiée.

L’image conteneurisée https://hub.docker.com/r/tuxgasy/dolibarr permet d’avoir un environnement fonctionnel en quelques minutes avec Docker pour commencer à chercher des vulnérabilités. L’image tuxgasy/dolibarr:16 a été utilisée pour découvrir cette vulnérabilité.

Sans forcément chercher à entrer trop dans les détails du code de Dolibarr, l’auditeur a simplement listé tous les fichiers PHP accessibles depuis la racine du serveur web de manière à identifier ceux qui sont accessibles sans authentification :

find . -type f -name « *.php »

Un des scripts ainsi accessibles attire l’attention car sa réponse diffère des autres : https://github.com/Dolibarr/dolibarr/blob/16.0.4/htdocs/public/ticket/ajax/ajax.php.

La lecture du code PHP nous renseigne vite sur les paramètres minimums attendus : action et email.

En particulier, action doit être égale à « getContacts« .

Lorsque toutes les conditions sont réunies, la réponse suivante est retournée à l’utilisateur non authentifié :
Dolibarr ticket ajaxDolibarr intègre quelques protections et vérifie que les variables envoyées par les utilisateurs ne contiennent pas de motifs suspicieux (XSS, injections SQL) :

Dolibarr exemple WAF

Si les paramètres ont été protégés de cette manière, les injections sont donc en général plus complexes à exploiter.

Nous sommes donc pour le moment en présence d’un accès non authentifié aux détails d’un contact, seulement dans le cas où l’attaquant connaît l’adresse mail qui y est associé.

En creusant d’avantage dans le code PHP, le pentester atterrit sur la requête SQL appelée :

Requête SQL getContacts Dolibarr

On peut observer l’utilisation de l’opérateur SQL LIKE : avec un peu de chance le caractère ‘%‘ peut être utilisé pour transformer la requête et lui faire retourner tous les enregistrements !

Dolibarr vol non authentifié de la base de contacts

L’ensemble des détails des contacts sont retournés en une seule requête.

Un tri sur quelques champs démontre l’intérêt de la vulnérabilité :

Détail des contacts vulnérabilité Dolibarr

Un attaquant pourrait accéder à l’ensemble du fichier client d’un concurrent, ses fournisseurs, et potentiellement des informations employés si une fiche contact existe. Les notes publiques comme privées sont également présentes.

D’autres détails techniques sur la base de données peuvent y être récupérés :

Détails database vulnérabilité Dolibarr

POC et impact

Les versions 16.x de Dolibarr sont affectées. La version 17 désactive par défaut l’accès à cette page, il faut qu’une option Dolibarr spécifique soit renseignée pour qu’elle soit de nouveau accessible.

Le score CVSSv3 est de 7.5 (https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N&version=3.1), cependant la nature de la donnée et la facilité d’exploitation en font une vulnérabilité critique.

Commande Linux permettant de reproduire la vulnérabilité et afficher quelques champs arbitraires :

curl -sk ‘[URI_DOLIBARR]/public/ticket/ajax/ajax.php?action=getContacts&email=%’ | jq -r ‘.contacts[] | {id, socname, poste, email, phone_perso, phone_pro, note_public, note_private}’

Préconisations

Les outils métiers aussi centraux qu’un ERP/CRM se doivent d’être correctement sécurisés :

  • N’ouvrir les accès vers Internet que si strictement nécessaire (préférer un accès VPN)
  • N’utiliser que les plugins utiles à vos cas d’usages
  • Réaliser des revues de comptes régulières
  • Maintenir à jour les différents composants logiciels
  • S’assurer que votre politique d’accès est correctement implémentée (complexité des mots de passe, 2FA, …)
  • Implémenter, et maintenir, une politique du moindre privilège
  • Réaliser des tests d’intrusion réguliers (quelle que soit l’exposition de l’application)

De nombreuses instances Dolibarr sont exposées sur Internet : pour celles qui sont en version 16.x pensez à mettre à jour rapidement !

Communication avec l’éditeur

Le processus de divulgation coordonnée de Dolibarr est documenté à l’URL suivante: https://github.com/Dolibarr/dolibarr/security/policy.

La réponse a été (très) rapide. En revanche, l’écosystème Dolibarr pourrait gagner en sécurité en communiquant de manière claire et précise sur les vulnérabilités découvertes et corrigées à un endroit centralisé, comme les « Security Advisories » Github.

21/02/2023 : Premier mail envoyé par Vladimir en suivant le processus de Dolibarr

21/02/2023 : Réponse du développeur Eldy validant la vulnérabilité et indiquant que la fonctionnalité en cause sera désactivée avec Dolibarr 17

05/03/2023 : Publication de la version 17 de Dolibarr

14/03/2023 : Publication de cet article

🛡️ DSecBypass vous accompagne sur les audits de sécurité de vos applications métier. N’hésitez pas à nous contacter pour des informations complémentaires et/ou un devis personnalisé 📝.