Pourquoi migrer maintenant : CVE-2026-45618 et fin de maintenance de la branche 1.x
CVE-2026-45618 est une vulnérabilité critique notée CVSS 10.0 dans LiquidJS, le moteur de gabarits utilisé par Uptime Kuma pour les templates de notifications. Les versions de LiquidJS antérieures à 10.26.0 sont affectées : en exploitant le filtre valueOf dans un gabarit — dans Uptime Kuma, le modèle de message d'une notification — un attaquant peut enchaîner une manipulation de prototype pour atteindre le constructeur Function de JavaScript et exécuter des commandes arbitraires sur l'hôte. Un proof-of-concept public démontre la lecture de fichiers système et l'exécution via child_process.execSync.
La branche 1.x n'a reçu aucun correctif : sa dernière version, 1.23.17 (octobre 2025), embarque LiquidJS 10.22.0, et le projet marque désormais les tags Docker 1 et latest comme dépréciés. Modifier un gabarit de notification demande un compte : un attaquant qui obtient un accès administrateur — par vol d'identifiants ou par bruteforce — dispose de cette surface. La branche 2.x intègre LiquidJS 10.26.0 depuis la version 2.4.0 (mai 2026) et continue de recevoir des correctifs : la 2.5.8 a par exemple corrigé une exécution de code authentifiée via Apprise (GHSA-v2p3-6f5h-6hhf) qui touche aussi toute la branche 1.x. La dernière version, 2.5.9, est sortie en octobre 2026. Continuer d'opérer une instance 1.x, c'est exposer chaque moniteur — et les clients qu'il surveille — à une surface d'attaque sans date de fermeture connue.
Impacts concrets d'une instance non migrée
- Exécution de code à distance : un attaquant qui peut modifier un gabarit de notification peut exécuter des commandes système sur le VPS hôte.
- Exposition du parc client : une agence qui héberge une instance partagée expose les configurations, les URL internes et les credentials de notification de tous ses clients.
- Responsabilité transférée : en cas d'incident sur une instance non maintenue, la négligence à migrer après la publication d'une CVE critique constitue un facteur aggravant.
- Accumulation de CVE : la branche 1.x ne recevra plus ni patch de sécurité ni mise à jour de dépendances — chaque nouvelle faille sur LiquidJS ou ses dépendances s'y accumule sans remède.
- Détection silencieuse : LiquidJS évalue les gabarits côté serveur ; une exploitation peut rester invisible dans les logs applicatifs d'Uptime Kuma.
Prérequis avant de commencer
Vérifiez les points suivants avant de lancer la migration. Une omission peut rendre le rollback impossible.
Ressources minimales recommandées. La documentation d'Uptime Kuma ne fixe pas de minimum chiffré : une petite instance tient sur un VPS d'entrée de gamme, mais la RAM et le disque croissent avec le nombre de moniteurs et l'historique conservé. La migration agrège la table des heartbeats : le mainteneur rapporte environ 7 minutes pour 20 moniteurs et 90 jours de données, et plusieurs heures sur un matériel lent — un VPS avec SSD NVMe réduit cette fenêtre.
Docker Compose v2. La commande requise est docker compose (plugin intégré), et non docker-compose (binaire autonome v1). Vérifiez avec docker compose version : attendez une version 2 ou ultérieure (la branche actuelle est la v5). Si la commande échoue, installez le plugin via le gestionnaire de paquets de votre distribution avant de continuer.
Accès root ou sudo. La procédure manipule des volumes Docker et des fichiers système ; un accès privilégié est indispensable.
Instance v1 opérationnelle. Confirmez la version courante via l'interface web (Paramètres → À propos). La migration suppose que l'instance démarre et que sa base de données est cohérente — si elle est déjà corrompue, restaurez une sauvegarde avant de procéder.
Sauvegarde obligatoire avant la migration
La migration v1 → v2 transforme le schéma de la base SQLite de façon irréversible. Sans sauvegarde valide, un rollback complet est impossible.
Identifier le volume ou le dossier de données. Si vous utilisez Docker Compose avec un volume nommé, son nom complet combine le nom du projet Compose et celui du volume, par exemple uptime-kuma_uptime-kuma-data. Confirmez avec docker volume ls | grep kuma. Si vous montez un dossier hôte (bind mount), repérez le chemin dans votre docker-compose.yml — typiquement ./data:/app/data.
Arrêter le conteneur avant la sauvegarde. Une base SQLite sauvegardée pendant une écriture active peut être corrompue. N'utilisez jamais le flag -v lors de l'arrêt : cela supprimerait le volume et son contenu.
Sauvegarde du volume de données
Arrêter Uptime Kuma
Arrêtez le conteneur sans supprimer le volume :
docker compose downAttendez la confirmation
Container uptime-kuma Stoppedavant de continuer.Sauvegarder un volume Docker nommé
Utilisez un conteneur busybox pour créer une archive compressée du volume :
docker run --rm \ --volume uptime-kuma_uptime-kuma-data:/app/data \ --volume $(pwd):/backup \ busybox \ tar czf /backup/uptime-kuma-v1-backup.tar.gz -C /app/data .Vérifiez la taille de l'archive avec
ls -lh uptime-kuma-v1-backup.tar.gz. Une archive de quelques octets seulement indique un problème de montage — corrigez avant de continuer.Sauvegarder un bind mount
Si vos données sont dans un dossier hôte (exemple :
./data) :tar czf uptime-kuma-v1-backup.tar.gz ./dataConservez cette archive hors du serveur (stockage objet, serveur distant) avant de passer à la migration.
Migration v1 → v2 : procédure pas à pas
Mettre à jour l'image dans docker-compose.yml
Ouvrez votre fichier
docker-compose.ymlet remplacez le tag de l'image :# Avant image: louislam/uptime-kuma:1 # Après image: louislam/uptime-kuma:2Si vous utilisez le tag
latest, préférez un tag de version explicite commelouislam/uptime-kuma:2.5.9(dernière version, octobre 2026) pour éviter les régressions lors d'une future montée de version automatique, et suivez les avis de sécurité du dépôt pour le faire évoluer. Évitez les tagsrootlesspour cette migration : le guide officiel les déconseille depuis une v1.Télécharger la nouvelle image
Récupérez l'image v2 avant de démarrer le service :
docker pull louislam/uptime-kuma:2Vérifiez que l'image est présente :
docker images | grep uptime-kuma.Démarrer le conteneur v2
Lancez le service. Docker Compose détecte le changement d'image et recrée le conteneur :
docker compose up -dAttendez la confirmation
Container uptime-kuma Started.Suivre la migration de la base de données
Au premier démarrage, Uptime Kuma migre le schéma SQLite vers le format v2. Cette opération peut durer de quelques secondes à plusieurs heures selon la taille de la base et la vitesse du matériel :
docker compose logs -f uptime-kumaN'interrompez pas le conteneur pendant cette phase. Attendez une ligne confirmant la fin de la migration avant de continuer.
Vérifier le healthcheck
Contrôlez que le conteneur est en état
healthy:docker compose psLa colonne
Statusdoit afficherhealthy. Si elle reste surstartingplus de deux minutes après la fin des logs de migration, consultez les logs pour identifier l'erreur.Confirmer la version active dans l'interface
Connectez-vous à l'interface web. Allez dans Paramètres → À propos et vérifiez que la version affichée commence par
2.. Confirmez que tous vos moniteurs sont présents et que leurs statuts correspondent à l'état réel de vos services.
Vérifications post-migration
Une migration réussie ne se limite pas à un conteneur qui démarre. Parcourez ces points avant de considérer l'opération terminée.
Moniteurs. Ouvrez le tableau de bord et comparez le nombre de moniteurs avec votre inventaire v1. Un moniteur manquant peut indiquer un problème de migration partielle — vérifiez les logs au niveau ERROR ou WARN.
Notifications. Déclenchez manuellement un test de notification pour chaque canal configuré (email, Telegram, webhook). En v2, les gabarits de l'e-mail (SMTP) passent d'un remplacement par expression régulière à LiquidJS : les variables deviennent sensibles à la casse et une variable inconnue est ignorée sans erreur. Profitez-en pour auditer le gabarit de chaque notification et supprimer tout contenu inattendu (balises {% %}, filtre valueOf) — c'est le vecteur de CVE-2026-45618.
Page de statut. Si vous exposez une page de statut publique, vérifiez qu'elle répond correctement et qu'elle liste les bons services. L'URL et le slug sont conservés après migration.
Certificats SSL. Les sondes TLS redémarrent leur cycle de vérification après migration. Un certificat proche de l'expiration avant la migration peut déclencher immédiatement une alerte : vérifiez la date réelle avant de traiter cela comme une régression.
Durcissement de l'instance après migration
Authentification obligatoire. En v2, l'authentification est activée par défaut. Vérifiez dans Paramètres → Sécurité que l'accès sans mot de passe est désactivé. Sur une instance fraîchement déployée sans compte configuré, l'interface est publiquement accessible pendant la configuration initiale : créez le compte administrateur dans les premières minutes suivant le premier démarrage.
Sous-domaine dédié derrière un reverse proxy. N'exposez pas Uptime Kuma sur un port direct (:3001). Placez-le derrière Nginx ou Caddy sur un sous-domaine dédié (status.votredomaine.com) avec TLS. Un ufw deny 3001 ne suffit pas : les ports publiés par Docker contournent les règles ufw. Publiez le port sur la seule boucle locale dans docker-compose.yml ("127.0.0.1:3001:3001") pour que seul le reverse proxy l'atteigne.
Fail2ban ou CrowdSec devant le proxy. Ajoutez une règle de détection de bruteforce sur les tentatives de connexion à l'interface. Le Hub de CrowdSec propose une collection communautaire timokoessler/uptime-kuma, avec un scénario de bruteforce. Consultez l'article Sécuriser votre VPS avec CrowdSec pour la procédure complète.
Isolation réseau. Placez Uptime Kuma dans un réseau Docker dédié. Il n'a besoin d'accéder qu'aux cibles qu'il surveille — pas aux bases de données de production ni aux APIs internes.
Dépannage : erreurs courantes
Volume incompatible ou base corrompue. Si les logs affichent SQLITE_ERROR: no such table ou database disk image is malformed, la base montée n'est pas valide ou la sauvegarde a été faite avec la base en cours d'écriture. Restaurez l'archive, arrêtez le conteneur proprement, et relancez la procédure depuis l'étape de sauvegarde.
Port 3001 déjà occupé. Une erreur port is already allocated ou address already in use sur le port 3001 indique qu'un processus utilise déjà ce port. Identifiez-le avec ss -tlnp | grep 3001 et arrêtez-le, ou modifiez le mapping dans docker-compose.yml (par exemple 127.0.0.1:3002:3001) et mettez à jour la configuration du reverse proxy.
Template de notification rejeté après migration. Si un canal de notification affiche une erreur de template, le gabarit contient une syntaxe que LiquidJS refuse ; en v1, l'e-mail SMTP n'utilisait pas LiquidJS mais un simple remplacement par expression régulière. Éditez le template concerné dans Paramètres → Notifications et supprimez ou corrigez les balises en erreur.
Certificat TLS affiché comme expiré. Les sondes TLS redémarrent leur cycle après migration. Vérifiez la date réelle avec echo | openssl s_client -connect your-domain.com:443 -servername your-domain.com 2>/dev/null | openssl x509 -noout -dates avant de traiter cette alerte comme un incident.
Conteneur en boucle de redémarrage. Si la migration échoue et que la politique est restart: always ou unless-stopped, Docker relance indéfiniment le conteneur. Passez à restart: "no" (entre guillemets en YAML), corrigez le problème dans les logs, puis restaurez la politique d'origine.
Ce que cette migration protège
Migrer vers Uptime Kuma 2.x ferme CVE-2026-45618 sur une surface directement accessible depuis l'interface d'administration. Pour une agence qui gère le parc de plusieurs clients depuis une instance partagée, cette surface est proportionnelle au nombre de comptes et de moniteurs configurés : chaque client supplémentaire élargissait le périmètre exposé.
La v2 apporte aussi des changements structurels qui réduisent la surface d'attaque à long terme : des images Docker rootless proposées en option (tags 2-rootless), des dépendances activement maintenues, et un délai de 14 jours avant l'intégration de nouvelles versions de dépendances npm (min-release-age=14 dans le .npmrc du projet) — pour limiter les attaques sur la chaîne d'approvisionnement.
Avec une offre Agency ServOrbit.com, vous créez et suivez les comptes cPanel de vos clients depuis un seul espace.