-
Notifications
You must be signed in to change notification settings - Fork 13
Open
Description
Deskripsi Masalah
Endpoint /api/token dapat dipanggil tanpa autentikasi apapun. Siapapun bisa mendapatkan token API yang valid dan mengakses semua endpoint API yang diproteksi.
Berbeda dengan Issue #965:
- Issue [SECURITY] Token API Harus Expire & Support Rotasi/Revocation #965: Token tidak ada expired time (setelah token dibuat)
- Issue ini: Token bisa dibuat tanpa login (sebelum token ada)
Kondisi Saat Ini
// app/Http/Controllers/Api/Auth/AuthController.php (Baris 95-100)
public function token()
{
$user = User::whereUsername('synchronize')->first();
$token = $user->createToken('auth_token', ['synchronize-opendk-create'])->plainTextToken;
return response()->json(['message' => 'Token Synchronize', 'access_token' => $token, 'token_type' => 'Bearer']);
}Masalah:
- ❌ Tidak ada pengecekan apakah user sudah login
- ❌ Tidak ada pengecekan role/permission
- ❌ Tidak ada validasi apapun
- ❌ Siapa saja dengan akses internet bisa dapat token
Kondisi yang Diharapkan
- ✅ Hanya user dengan role
administratoryang bisa generate token - ✅ Semua request ke
/api/tokenharus melewati middlewareauth:sanctum - ✅ Setiap pembuatan token dicatat di activity_log
Cara Reproduksi (Bug)
# 1. Siapapun bisa call endpoint ini TANPA login
curl https://devopenkab.opendesa.id/api/token
# 2. Response akan berisi token valid
{
"message": "Token Synchronize",
"access_token": "1|abc123xyz...",
"token_type": "Bearer"
}
# 3. Token bisa dipakai untuk akses endpoint protected
curl -H "Authorization: Bearer 1|abc123xyz..." \
https://devopenkab.opendesa.id/api/v1/identitasDampak
| Dampak | Tingkat |
|---|---|
| Akses data pemerintah tanpa izin | 🔴 KRITIS |
| Modifikasi data via API | 🔴 KRITIS |
| Sinkronisasi OpenDK oleh pihak tidak berwenang | 🟠 TINGGI |
Solusi (BEST PRACTICE)
Karena endpoint ini untuk service account (bukan user manusia), gunakan API credentials dari environment variable.
Langkah 1: Tambahkan Middleware Auth
// routes/apiv1.php (Baris 42)
// UBAH DARI:
Route::get('/token', [AuthController::class, 'token']);
// MENJADI:
Route::middleware(['auth:sanctum', 'role:administrator'])->get('/token', [AuthController::class, 'token']);Langkah 2: Update Controller
// app/Http/Controllers/Api/Auth/AuthController.php
public function token(Request $request)
{
// Middleware sudah handle auth, tinggal generate token
$user = User::whereUsername('synchronize')->first();
if (!$user) {
return response()->json([
'message' => 'Synchronize user not found'
], 404);
}
// Revoke token lama (security best practice)
$user->tokens()->delete();
$token = $user->createToken('auth_token', ['synchronize-opendk-create'])->plainTextToken;
// Log untuk audit
activity()
->performedOn($user)
->causedBy(auth()->user())
->withProperties(['ip' => $request->ip()])
->log('token.generated');
return response()->json([
'message' => 'Token Synchronize',
'access_token' => $token,
'token_type' => 'Bearer'
]);
}Testing Checklist
Setelah fix, verifikasi:
- Request tanpa token → Return 401 Unauthorized
- Request dengan token user biasa → Return 403 Forbidden
- Request dengan token admin → Return 200 OK + token baru
- Token yang dihasilkan bisa akses endpoint
/api/opendk/data - Activity log mencatat pembuatan token
- Service account masih bisa sinkronisasi normal (tidak kena rate limit)
Referensi
Related Issues
- [SECURITY] Token API Harus Expire & Support Rotasi/Revocation #965 - Token API Harus Expire & Support Rotasi/Revocation (token expiration)
- [SECURITY] Terapkan CAPTCHA pada Login & Endpoint Auth untuk Batasi Bot/Bruteforce #969 - Terapkan CAPTCHA pada Login & Endpoint Auth (bruteforce protection)
🚨 PRIORITAS: SEGERA DIPERBAIKI
Vulnerability ini memungkinkan siapapun untuk:
- Mendapatkan token API valid tanpa login
- Mengakses semua endpoint API yang diproteksi
- Mengambil data pemerintah daerah
- Melakukan sinkronisasi OpenDK tanpa izin
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels