Peringatan Keamanan

Peringatan Keamanan: Bypass Autentikasi TokenGuard pada Laravel (CVE-2026-114509) dan Penghapusan Data Tanpa Izin (CVE-2026-114508)

Adam  ·  24 Okt 2026  ·  KUTIM-SA-2026-090  ·  TLP:CLEAR  ·  1 kali dilihat

Peringatan Keamanan: Bypass Autentikasi TokenGuard pada Laravel (CVE-2026-114509) dan Penghapusan Data Tanpa Izin (CVE-2026-114508)
Sumber: Artikel ini diterbitkan oleh KUTIM-CSIRT berdasarkan advisory resmi Laravel tanggal 19 Oktober 2026 (GHSA-f9x3-7vq9-cph6 dan GHSA-5wcm-3v2w-8362). Nomor CVE, skor, dan versi terdampak telah kami cocokkan dengan NVD dan catatan rilis Laravel di GitHub. Hingga artikel ini diterbitkan, BSSN/Id-SIRTII belum menerbitkan edaran untuk kerentanan ini. Dokumen asli: Laravel – Token-based API guard Auth Bypass (GHSA-f9x3-7vq9-cph6).

KUTIM-CSIRT mengimbau seluruh Perangkat Daerah di lingkungan Pemerintah Kabupaten Kutai Timur yang mengelola aplikasi berbasis Laravel untuk memeriksa konfigurasi autentikasi aplikasinya dan memperbarui Laravel ke versi 12.68.0 atau 13.29.0. Kerentanan CVE-2026-114509 memungkinkan penyerang masuk sebagai pengguna lain tanpa login, termasuk akun admin, pada aplikasi yang memakai guard bawaan TokenGuard dengan database MySQL atau MariaDB.

Celah ini sering tersembunyi di aplikasi lama. Proyek Laravel yang dibuat dengan versi 5.x hingga 8.x umumnya sudah membawa guard api ber-driver token di berkas config/auth.php bawaannya, walaupun tidak pernah sengaja dipakai pengembang. Aplikasi yang hanya memakai Laravel Sanctum, Laravel Passport, atau login berbasis sesi tidak terdampak CVE-2026-114509.

Ikhtisar

CVE & SkorJenis Kerentanan
CVE-2026-114509
Critical
CVSS 4.0: 9,2
Bypass autentikasi pada TokenGuard: kredensial yang bukan string dapat cocok dengan pengguna yang tidak semestinya (CWE-287, CWE-1287)
CVE-2026-114508
Medium
CVSS 3.1: 6,5
Penghapusan data tanpa izin: request ke endpoint baca dapat memicu operasi destruktif pada tabel relasi (CWE-470)

Dampak

  • Pengambilalihan akun tanpa autentikasi (CVE-2026-114509). Penyerang mengirim nilai token yang dirancang khusus (bukan string) ke rute yang dilindungi guard token. Pencarian di database lalu cocok dengan salah satu pengguna yang ada, dan penyerang diperlakukan sebagai pengguna itu. Bila pengguna yang tercocokkan adalah admin, penyerang dapat membaca, mengubah, atau menghapus data melalui API aplikasi.
  • Kehilangan data permanen (CVE-2026-114508). Pengguna yang hanya punya hak baca dapat mengosongkan isi tabel yang berelasi, sehingga layanan terganggu dan integritas data rusak.

Sistem yang Terdampak

CVE-2026-114509 hanya dapat dieksploitasi bila semua syarat berikut terpenuhi:

  1. Ada guard dengan 'driver' => 'token' di config/auth.php.
  2. Ada rute yang memakai guard tersebut, misalnya middleware auth:api di routes/api.php.
  3. Database memakai MySQL atau MariaDB, dan tabel pengguna memiliki kolom token (bawaannya api_token).
  4. Versi laravel/framework belum diperbaiki.

Bila salah satu syarat tidak terpenuhi, misalnya kolom api_token tidak ada, eksploitasi gagal. Namun konfigurasi tersebut tetap sebaiknya dibereskan, karena perubahan skema database atau rute di kemudian hari dapat membuatnya rentan.

Cabang LaravelTerdampak → Versi Perbaikan
Laravel 13.xCVE-2026-114509: semua versi sebelum 13.29.0
CVE-2026-114508: semua versi sebelum 13.27.0
→ 13.29.0 menutup keduanya
Laravel 12.xCVE-2026-114509: semua versi sebelum 12.68.0
CVE-2026-114508: 12.45.0 hingga sebelum 12.68.0
→ 12.68.0 menutup keduanya
Laravel 11.x dan lebih lama (5.x–10.x)CVE-2026-114509: semua versi
→ tidak ada rilis perbaikan resmi (masa dukungan keamanan sudah berakhir). Terapkan langkah sementara di bawah dan rencanakan migrasi

Detail Teknis

CVE-2026-114509. TokenGuard mengambil token dari parameter api_token (query atau body), header Authorization: Bearer, atau password HTTP Basic. Sebelum diperbaiki, guard hanya memeriksa bahwa token tidak kosong, tanpa memastikan tipenya string. Bila penyerang mengirim api_token dalam bentuk array berisi angka, Laravel menyusun kueri WHERE api_token IN (...). Pada MySQL dan MariaDB, perbandingan string dengan angka mengubah string menjadi angka, sehingga token yang tidak diawali digit dianggap bernilai 0 dan cocok. Pengguna pertama yang tercocokkan menjadi identitas penyerang. Perbaikan di 12.68.0 dan 13.29.0 menambahkan pemeriksaan is_string() sebelum kueri dijalankan.

CVE-2026-114508. Menurut advisory Laravel, cara framework memproses permintaan penyertaan relasi (relationship inclusion) pada endpoint baca tertentu dapat dibelokkan sehingga menjalankan operasi destruktif pada tabel relasi, bukan sekadar mengambil data. Advisory tidak merinci fitur atau parameter yang terlibat. Celah ini hanya ada di Laravel 12.45.0 ke atas dan 13.x, sehingga aplikasi lama tidak terdampak.

Rekomendasi

Langkah utama: perbarui Laravel. Advisory Laravel tidak menyediakan langkah pengganti (workaround).

  1. Periksa versi dan konfigurasi setiap aplikasi Laravel, termasuk yang ada di kontainer, panel hosting, dan folder cadangan yang masih dilayani web server:
    • composer show laravel/framework | grep versions atau composer audit
    • grep -n "'driver' => 'token'" config/auth.php
    • grep -rn "auth:api" routes/
  2. Perbarui dengan composer update laravel/framework ke 12.68.0 atau 13.29.0 (atau lebih baru). Uji aplikasi di lingkungan staging sebelum menerapkannya di produksi.
  3. Bersihkan sisa konfigurasi. Bila guard token tidak dipakai, hapus guard tersebut dari config/auth.php beserta rute yang memakainya (misalnya rute contoh /api/user dari kerangka bawaan). Bila autentikasi token memang dibutuhkan, beralihlah ke Laravel Sanctum, yang tidak terdampak.
  4. Jalankan ulang cache konfigurasi setelah perubahan: php artisan config:clear lalu php artisan config:cache. Restart PHP-FPM dan queue worker agar konfigurasi baru dipakai.

Langkah sementara untuk aplikasi yang belum dapat diperbarui, termasuk Laravel 11.x dan lebih lama. Tambahkan middleware yang menolak token yang bukan string dan pasang sebelum middleware autentikasi pada grup rute API:

// app/Http/Middleware/TolakTokenNonString.php
namespace App\Http\Middleware;

use Closure;

class TolakTokenNonString
{
    public function handle($request, Closure $next)
    {
        $token = $request->input('api_token');
        if ($token !== null && ! is_string($token)) {
            abort(401);
        }
        return $next($request);
    }
}
  • Di WAF atau reverse proxy, blokir request yang memuat api_token[ atau api_token%5B pada URL maupun body, serta body JSON yang mengirim api_token sebagai array.
  • Batasi akses ke rute API yang terdampak hanya dari jaringan internal atau VPN sampai pembaruan diterapkan.

Periksa tanda-tanda serangan. Telusuri log akses web server untuk permintaan berisi api_token[, api_token%5B, atau api_token%255B, misalnya:

grep -E "api_token(\[|%5B|%255B)" /var/log/nginx/access.log*

Log akses biasanya tidak mencatat isi body JSON, sehingga hasil kosong bukan bukti aplikasi aman. Periksa juga aktivitas API yang tidak wajar atas nama pengguna tertentu (perubahan data, unduhan massal) sejak pertengahan Oktober 2026. Bila menemukan indikasi, jangan menghapus log atau data sebelum berkoordinasi. Laporkan melalui formulir laporan insiden.

Catatan Status Eksploitasi

Hingga 24 Oktober 2026, kedua CVE ini belum tercantum dalam katalog KEV CISA, dan KUTIM-CSIRT belum menemukan laporan eksploitasi yang terkonfirmasi. Namun mekanisme CVE-2026-114509 sudah dibahas terbuka di berbagai tulisan teknis dan mudah direproduksi, sehingga aplikasi yang memenuhi syarat di atas sebaiknya segera diperbaiki. Artikel ini akan diperbarui bila status eksploitasi berubah.

Referensi