Analyse de la vulnérabilité de sauvegarde de base de données non authentifiée dans Craft CMS

Analyse de la vulnérabilité de sauvegarde de base de données non authentifiée dans Craft CMS

Alex Rollin
Alex Rollin
January 6, 2026
Dernière mise à jour : February 15, 2026
January 6, 2026

La sauvegarde de votre base de données Craft CMS contient tout : les identifiants des utilisateurs, les clés API, les données clients et l'historique complet du contenu de votre site. Si quelqu'un peut télécharger cette sauvegarde sans se connecter, vous lui avez remis les clés de toute votre application. Voici la vérité qui dérange : il n'existe pas de CVE unique pour « téléchargement non authentifié de sauvegarde de base de données » dans Craft CMS. La vulnérabilité n'est pas un bogue dans le code de Craft — c'est une erreur de déploiement qui laisse votre répertoire /storage/backups accessible à quiconque possède un navigateur web et des connaissances de base en URL. Cet article couvre exactement ce qui crée cette exposition, comment les vulnérabilités récentes de Craft CMS aggravent la situation, et les configurations serveur spécifiques dont vous avez besoin pour verrouiller vos sauvegardes. Vous obtiendrez des configurations Apache et Nginx fonctionnelles, une liste de vérification et une compréhension claire de pourquoi c'est plus important que jamais compte tenu de la vague d'exploits Craft CMS de 2024-2025.

Prérequis

Avant d'implémenter ces correctifs, vous aurez besoin de :

Accès au serveur requis :

  • Accès SSH à votre serveur web
  • Capacité de modifier les fichiers de configuration Apache ou Nginx
  • Privilèges root ou sudo pour les modifications au niveau du système

Connaissances requises :

  • Familiarité de base avec votre serveur web (Apache ou Nginx)
  • Compréhension des chemins de fichiers et de la structure des répertoires
  • Capacité de redémarrer les services du serveur web

Environnement Craft CMS :

  • Installation Craft CMS 3.x, 4.x ou 5.x
  • Accès à la structure de fichiers de votre projet
  • Connaissance de l'emplacement de votre répertoire storage/ par rapport à votre webroot

Outils que vous utiliserez :

  • Terminal/client SSH
  • Éditeur de texte pour les fichiers de configuration
  • cURL ou un navigateur web pour les tests

Comprendre le problème

Craft CMS stocke les sauvegardes de base de données, les journaux et les données d'exécution dans le répertoire storage/. Par défaut, la structure de projet de Craft garde ce dossier à l'extérieur du webroot public :

/var/www/project/
├── config/
├── storage/          ← Contient les sauvegardes, journaux, données d'exécution
│   └── backups/
├── templates/
├── vendor/
└── web/              ← Seul celui-ci devrait être accessible publiquement
    └── index.php

Le problème survient lorsque les déploiements placent storage/ à l'intérieur du webroot, ou lorsque les serveurs n'ont pas de règles bloquant l'accès direct. Un attaquant peut simplement demander :

curl https://votresite.com/storage/backups/craft_backup_2025-01-01-120000.sql

Et recevoir votre dump complet de base de données.

Ce n'est pas théorique. CVE-2025-54417 nécessite spécifiquement l'accès à /storage/backups comme partie de sa chaîne d'attaque. Les attaquants qui peuvent écrire des fichiers dans votre répertoire de sauvegarde et connaissent votre clé de sécurité peuvent exécuter du code arbitraire via le point de terminaison /updater/restore-db de Craft.

Implémentation étape par étape

Étape 1 : Identifier votre structure de répertoires actuelle

D'abord, déterminez si votre répertoire storage/ se trouve à l'intérieur ou à l'extérieur de votre webroot.

Connectez-vous à votre serveur et trouvez votre installation Craft :

# Trouvez votre installation Craft
find /var/www -name "craft" -type f 2>/dev/null

Vérifiez la relation entre storage/ et votre webroot :

# Depuis la racine de votre projet Craft
ls -la

Recherchez cette structure (sécuritaire) :

./config/
./storage/
./web/           ← La racine du document pointe uniquement ici

Ou cette structure (dangereuse) :

./web/
./web/config/
./web/storage/   ← Storage à l'intérieur du webroot

Étape 2 : Tester l'exposition actuelle

Avant d'effectuer des modifications, confirmez si vos sauvegardes sont actuellement accessibles.

Vérifiez si des sauvegardes existent :

ls -la storage/backups/

Testez l'accès HTTP direct depuis l'extérieur de votre serveur :

# Remplacez par votre domaine réel
curl -I https://votresite.com/storage/backups/

# Si vous connaissez un nom de fichier de sauvegarde
curl -I https://votresite.com/storage/backups/craft_backup_2025-01-01-120000.sql

Codes de réponse à surveiller :

  • 200 OK — Vos sauvegardes sont exposées (critique)
  • 403 Forbidden — Accès bloqué (bon)
  • 404 Not Found — Soit bloqué, soit le chemin n'existe pas (vérifiez lequel)

Étape 3 : Déplacer storage à l'extérieur du webroot (méthode privilégiée)

Notre expérience montre que déplacer storage/ entièrement à l'extérieur du webroot élimine complètement cette classe de vulnérabilité. Pas de règles serveur à maintenir, pas de configuration à mal faire.

Si vous pouvez restructurer votre déploiement :

Créez la nouvelle structure de répertoires :

# Depuis la racine de votre projet (au-dessus de web/)
mkdir -p /var/www/project/storage

Déplacez le contenu existant de storage :

mv /var/www/project/web/storage/* /var/www/project/storage/
rmdir /var/www/project/web/storage

Mettez à jour votre fichier .env ou config/general.php pour pointer vers le nouvel emplacement :

// config/general.php
return [
    '*' => [
        // Définir explicitement le chemin de storage à l'extérieur du webroot
        'basePath' => dirname(__DIR__) . '/storage',
    ],
];

Définissez la bonne propriété :

chown -R www-data:www-data /var/www/project/storage
chmod -R 750 /var/www/project/storage

Étape 4 : Bloquer l'accès au niveau du serveur web (méthode alternative)

Si vous ne pouvez pas déplacer storage/ à l'extérieur du webroot (hébergement partagé, contraintes de plateforme), bloquez l'accès via la configuration du serveur.

Pour Apache :

Créez ou modifiez /var/www/project/web/storage/.htaccess :

# Refuser tout accès au répertoire storage
Require all denied

Ou ajoutez à la configuration de votre hôte virtuel Apache principal :

<VirtualHost *:443>
    ServerName votresite.com
    DocumentRoot /var/www/project/web
    
    # Bloquer l'accès au répertoire storage
    <Directory "/var/www/project/web/storage">
        Require all denied
    </Directory>
    
    # Protection supplémentaire : bloquer les extensions de fichiers de sauvegarde partout
    <FilesMatch "\.(sql|sql\.gz|sql\.zip|bak)$">
        Require all denied
    </FilesMatch>
</VirtualHost>

Redémarrez Apache :

sudo systemctl restart apache2

Pour Nginx :

Ajoutez à la configuration de votre bloc server :

server {
    listen 443 ssl;
    server_name votresite.com;
    root /var/www/project/web;
    
    # Bloquer complètement le répertoire storage
    location ^~ /storage/ {
        deny all;
        return 404;
    }
    
    # Bloquer les extensions de fichiers de sauvegarde partout
    location ~* \.(sql|bak)$ {
        deny all;
        return 404;
    }
    
    # Votre configuration Craft existante
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

Testez et rechargez Nginx :

sudo nginx -t
sudo systemctl reload nginx

Étape 5 : Définir les permissions de fichiers

Quelle que soit la méthode choisie, resserrez les permissions de fichiers sur le répertoire storage :

# Définir les permissions des répertoires
find /var/www/project/storage -type d -exec chmod 750 {} \;

# Définir les permissions des fichiers
find /var/www/project/storage -type f -exec chmod 640 {} \;

# Assurer la bonne propriété
chown -R www-data:www-data /var/www/project/storage

Ces permissions garantissent :

  • Propriétaire (serveur web) : lecture, écriture, exécution sur les répertoires ; lecture, écriture sur les fichiers
  • Groupe : lecture, exécution sur les répertoires ; lecture sur les fichiers
  • Autres : aucun accès

Étape 6 : Configurer l'emplacement de stockage des sauvegardes

Pour une protection supplémentaire, configurez Craft pour écrire les sauvegardes dans un emplacement complètement à l'extérieur de votre projet web :

# Créer un répertoire de sauvegarde dédié
sudo mkdir -p /var/backups/craft
sudo chown www-data:www-data /var/backups/craft
sudo chmod 750 /var/backups/craft

Mettez à jour vos scripts de sauvegarde ou votre automatisation pour utiliser ce chemin. Si vous utilisez les commandes de sauvegarde intégrées de Craft :

./craft db/backup /var/backups/craft/

Erreurs courantes à éviter

Erreur 1 : Se fier uniquement au .htaccess sans vérifier qu'il fonctionne

Nous avons constaté que de nombreux environnements d'hébergement désactivent le traitement .htaccess pour des raisons de performance. Testez toujours que vos règles bloquent réellement l'accès plutôt que de supposer qu'elles le font.

Erreur 2 : Bloquer /storage/ mais pas /storage/backups/

Certaines configurations utilisent un matching de location qui ne s'applique pas aux sous-répertoires. Testez le chemin spécifique /storage/backups/, pas seulement le répertoire parent.

Erreur 3 : Utiliser des noms de fichiers de sauvegarde prévisibles sans contrôles d'accès

Le nommage par défaut des sauvegardes de Craft inclut des horodatages (craft_backup_2025-01-01-120000.sql). Ceux-ci sont faciles à deviner ou à énumérer. Même avec des contrôles d'accès, envisagez d'utiliser des noms de sauvegarde randomisés ou de stocker les sauvegardes avec des horodatages uniquement dans les métadonnées du nom de fichier.

Erreur 4 : Oublier l'indexation des répertoires

Si Options Indexes d'Apache est activé et que votre règle de blocage échoue, les attaquants peuvent parcourir /storage/backups/ et voir une liste de tous vos fichiers de sauvegarde. Désactivez l'indexation des répertoires :

<Directory "/var/www/project/web/storage">
    Options -Indexes
    Require all denied
</Directory>

Erreur 5 : Ne pas corriger les vulnérabilités Craft connexes

Bloquer l'accès aux sauvegardes réduit le risque, mais les CVE récents de Craft créent des chemins d'attaque supplémentaires. Un CVE-2025-32432 non corrigé donne aux attaquants l'exécution de code à distance, auquel cas ils peuvent accéder à n'importe quel fichier sur le serveur, peu importe les règles du serveur web.

Étapes de test et de vérification

Test 1 : Accès direct par URL

# Tester la racine de storage
curl -I https://votresite.com/storage/

# Tester le répertoire des sauvegardes
curl -I https://votresite.com/storage/backups/

# Tester un fichier de sauvegarde spécifique (utilisez un vrai nom de fichier si vous en connaissez un)
curl -I https://votresite.com/storage/backups/test.sql

Réponses attendues : 403 Forbidden ou 404 Not Found

Test 2 : Énumération des répertoires

# Vérifier si le listing des répertoires est désactivé
curl https://votresite.com/storage/backups/

Ne devrait pas retourner une liste de fichiers.

Test 3 : Vérification des permissions de fichiers

# Sur le serveur, vérifiez les permissions
ls -la /var/www/project/storage/
ls -la /var/www/project/storage/backups/

# Vérifier qu'il n'y a pas de permissions lisibles par tous (pas de 'r' dans le troisième groupe)
stat -c "%a %n" /var/www/project/storage/backups/*

Test 4 : Fonctionnalité Craft

Après avoir effectué les modifications, vérifiez que Craft fonctionne toujours correctement :

  • Connectez-vous au panneau d'administration de Craft
  • Naviguez vers Utilitaires → Rapport système
  • Vérifiez s'il y a des avertissements de permissions de fichiers
  • Exécutez une sauvegarde de test et confirmez qu'elle se termine avec succès
./craft db/backup

Test 5 : Scan de vulnérabilités externe

Utilisez la vérification serveur intégrée de Craft ou un scanner externe pour vérifier votre configuration :

# Le rapport système de Craft inclut des vérifications de sécurité
./craft utils/system-report

Correction des vulnérabilités connexes

Sécuriser vos sauvegardes est une couche de défense. Vous devez également corriger les CVE récents de Craft qui rendent les sauvegardes exposées plus dangereuses.

Mises à jour critiques requises :

  • CVE-2025-32432 (Critique 10.0) — Corrigé dans : 3.9.15, 4.14.15, 5.6.17 — RCE non authentifié via les transformations d'images
  • CVE-2025-54417 (Élevé) — Corrigé dans : 4.16.3, 5.8.4 — RCE via le point de terminaison de restauration de sauvegarde
  • CVE-2025-23209 (Élevé 8.0) — Corrigé dans : 4.13.8, 5.5.8 — RCE avec clé de sécurité compromise
  • CVE-2024-56145 (Critique 9.3) — Corrigé dans : 3.9.14, 4.13.2, 5.5.2 — RCE via la gestion argc/argv

Mettez à jour Craft CMS :

composer update craftcms/cms
./craft migrate/all
./craft project-config/apply

Après la mise à jour, effectuez une rotation de votre clé de sécurité si vous avez une raison de croire qu'elle a pu être exposée :

# Générer une nouvelle clé de sécurité
php -r "echo 'CRAFT_SECURITY_KEY=' . bin2hex(random_bytes(32)) . PHP_EOL;"

Mettez à jour votre fichier .env avec la nouvelle clé.

Conclusion

Protéger vos sauvegardes de base de données Craft CMS se résume à deux principes : garder les fichiers sensibles à l'extérieur du webroot, et bloquer l'accès à tout ce qui ne peut pas être déplacé. Les configurations serveur de ce guide adressent le risque d'exposition immédiat, mais elles fonctionnent mieux conjointement avec les correctifs Craft CMS actuels.

Travailler avec des équipes nous a appris que la sécurité des sauvegardes est souvent négligée parce qu'elle ne fait pas partie de l'application — c'est de l'infrastructure. Mais comme CVE-2025-54417 le démontre, les attaquants traitent /storage/backups comme un chemin direct vers l'exécution de code lorsqu'il est combiné avec d'autres vulnérabilités.

Si vous utilisez Craft CMS et n'avez pas audité l'exposition de votre répertoire storage, commencez par les tests curl de l'étape 2. Cette vérification de cinq minutes vous dit immédiatement si cet article s'applique à vous. Pour les équipes gérant plusieurs installations Craft ou cherchant à implémenter une gestion appropriée des sauvegardes dans le cadre d'une révision de sécurité plus large, nous pouvons vous aider à élaborer une approche qui couvre à la fois les correctifs immédiats et la surveillance continue.

Share this article