# Report Bug Fixing — Pentest Tahap 2

**Target:** https://sumasys.analyticalcenter.id/  
**Tanggal Pentest:** 6 April 2026  
**Tanggal Remediasi:** 29 Juni 2026  
**Overall Risk Level:** Medium (1 Medium, 11 Low)

---

## Ringkasan Temuan & Status Remediasi

| # | Temuan | Severity | Status |
|---|--------|----------|--------|
| 1 | CORS Misconfiguration | Medium | 🔧 In Progress |
| 2 | Unsafe CSP Header | Low | 🔧 In Progress |
| 3 | Robots.txt file found | Low | 🔧 In Progress |
| 4 | Missing Strict-Transport-Security | Low | ✅ Already Exists |
| 5 | Missing Referrer-Policy | Low | ✅ Already Exists |
| 6 | Missing X-Content-Type-Options | Low | ✅ Already Exists |
| 7 | Missing Content-Security-Policy (beberapa route) | Low | 🔧 In Progress |
| 8 | Internal Server Error (500) di /inline-staging | Low | 🔧 In Progress |
| 9 | Error message containing sensitive info | Low | 🔧 In Progress |
| 10 | Suspicious Comment (verbose error) | Low | 🔧 In Progress |
| 11 | Server Information Disclosure (.htaccess/.gitignore) | Low | 🔧 In Progress |
| 12 | Enumerable Parameter / IDOR (/item-ed) | Low | 🔍 Under Review |

---

## Temuan Tambahan dari Investigasi Kode

| # | Temuan Internal | Severity | Status |
|---|----------------|----------|--------|
| A | Route `/inline-staging` tanpa middleware auth | Critical | 🔧 In Progress |
| B | Route `/import-price-item` tanpa middleware auth | Critical | 🔧 In Progress |
| C | Privilege escalation di `adminUpdateRole` | High | 🔧 In Progress |
| D | `APP_DEBUG=true` di production `.env` | Critical | ⚠️ Perlu deploy config |
| E | Hardcoded PIN fallback `248624` | High | 🔧 In Progress |

---

## Detail Remediasi Per-Item

### 1. CORS Misconfiguration — Medium

**Endpoint:** `/` (semua)  
**Deskripsi:** Scanner menyuntikkan `Origin: null`, server membalas `Access-Control-Allow-Origin: *`

**Root Cause:**
- `config/cors.php` memiliki origin dengan trailing slash (format salah)
- Kemungkinan web server/proxy menambahkan header CORS wildcard

**File Diubah:** `config/cors.php`

**Perubahan:**
- Hapus trailing slash dari allowed_origins
- Tambahkan production origin `https://sumasys.analyticalcenter.id`

**Verifikasi:**
- Request dengan Origin valid → header ACAO sesuai
- Request dengan Origin invalid → tidak ada ACAO header

**Status:** ✅ Fixed

---

### 2. Unsafe CSP Header — Low

**Endpoint:** `/`  
**Deskripsi:** CSP mengandung `unsafe-inline`, `unsafe-eval`, tidak ada `default-src`

**Root Cause:** `SecureHeaders.php` middleware belum memiliki `default-src` dan masih mengizinkan `unsafe-inline`

**File Diubah:** `app/Http/Middleware/SecureHeaders.php`

**Perubahan:**
- Tambah `default-src 'self'`
- Tambah `upgrade-insecure-requests`
- Pertahankan `unsafe-inline` sementara (legacy frontend dependency)
- Dokumentasi rencana migrasi ke nonce

**Verifikasi:**
- Response header mengandung `default-src 'self'`
- UI tetap berfungsi normal

**Status:** ✅ Fixed

---

### 3. Robots.txt — Low

**Endpoint:** `/robots.txt`  
**Deskripsi:** File robots.txt terlalu permisif (Disallow kosong)

**File Diubah:** `public/robots.txt`

**Perubahan:**
- Tambah `Disallow` untuk path admin/internal

**Verifikasi:**
- robots.txt tidak mengekspos path sensitif

**Status:** ✅ Fixed

---

### 4. Missing Strict-Transport-Security — Low

**Endpoint:** `/import-price-item`  
**Deskripsi:** Response tidak menyertakan HSTS header

**Root Cause:** Middleware `SecureHeaders` sudah menambahkan HSTS header. Namun route `/import-price-item` berada di luar middleware group yang benar sehingga kemungkinan tidak melewati pipeline yang sama.

**File Diubah:** `routes/web.php` (route dipindahkan ke middleware group)

**Perubahan:**
- Route dipindahkan ke middleware group yang melewati global middleware stack

**Verifikasi:**
- Response dari `/import-price-item` mengandung `Strict-Transport-Security`

**Status:** ✅ Fixed (via route fix)

**Catatan:** `SecureHeaders` sudah terdaftar di global middleware (`$middleware` di Kernel.php), sehingga seharusnya berlaku ke semua route. Kemungkinan scanner menangkap response sebelum middleware diperbaiki.

---

### 5. Missing Referrer-Policy — Low

**Status:** ✅ Already Exists  
**Catatan:** `SecureHeaders.php` sudah set `Referrer-Policy: no-referrer` di global middleware.

---

### 6. Missing X-Content-Type-Options — Low

**Status:** ✅ Already Exists  
**Catatan:** `SecureHeaders.php` sudah set `X-Content-Type-Options: nosniff` di global middleware.

---

### 7. Missing CSP (beberapa route) — Low

**Status:** ✅ Fixed (via item #2 + route fix)  
**Catatan:** CSP sudah diset di global middleware. Route yang sebelumnya unprotected sekarang sudah dipindahkan ke middleware group yang benar.

---

### 8. Internal Server Error (500) di /inline-staging — Low

**Endpoint:** `/inline-staging?search=...`  
**Deskripsi:** Search query memicu HTTP 500

**Root Cause:** Typo alias SQL — `sc.item_code` seharusnya `si.item_code` (tabel di-alias sebagai `si`, bukan `sc`)

**File Diubah:** `app/Http/Controllers/MasterStokController.php` line 2520

**Perubahan:**
- `'sc.item_code'` → `'si.item_code'`

**Verifikasi:**
- Request `/staging-inline?search=test` → bukan 500
- Data terfilter sesuai search term

**Status:** ✅ Fixed

---

### 9. Error Message Containing Sensitive Info — Low

**Endpoint:** `/import-price-item`  
**Deskripsi:** Error response mengandung `$e->getMessage()` yang bisa membocorkan informasi internal

**Root Cause:** Catch block di controller langsung expose raw exception message ke user

**File Diubah:**
- `app/Http/Controllers/SettingStokController.php`
- `app/Http/Controllers/MasterStokController.php` (multiple catch blocks)

**Perubahan:**
- Ganti raw exception message dengan pesan generik
- Tambah `\Log::error()` untuk logging internal

**Verifikasi:**
- Error response hanya menampilkan pesan generik
- Detail error tetap tercatat di log server

**Status:** ✅ Fixed

---

### 10. Suspicious Comment (Verbose Error) — Low

**Endpoint:** `/admin/change-role/40` (GET)  
**Deskripsi:** Error message menampilkan "The GET method is not supported for route..."

**Root Cause:** Laravel default exception handler terlalu verbose saat `APP_DEBUG=true`

**Remediasi:**
- Set `APP_DEBUG=false` di production `.env`
- Custom error handling sudah ada di `Handler.php` untuk JSON requests
- Route sudah hanya menerima POST (correct behavior)

**Verifikasi:**
- GET ke route POST-only → response generik (bukan detail method info)

**Status:** ⚠️ Perlu `APP_DEBUG=false` di production

---

### 11. Server Information Disclosure — Low

**Endpoint:** `/.htaccess`, `/.gitignore`  
**Deskripsi:** File dotfile bisa diakses publik

**Root Cause:** `public/.htaccess` tidak memiliki rule deny untuk dotfiles

**File Diubah:** `public/.htaccess`

**Perubahan:**
- Tambah rule Apache untuk deny akses ke semua dotfiles
- Kecualikan `.well-known` jika diperlukan

**Verifikasi:**
- GET `/.htaccess` → 403 Forbidden
- GET `/.gitignore` → 403 Forbidden
- GET `/.env` → 403 Forbidden

**Status:** ✅ Fixed

---

### 12. Enumerable Parameter / IDOR (/item-ed) — Low

**Endpoint:** `/item-ed?id=...`  
**Deskripsi:** Parameter `id` bersifat enumerable, response 99% mirip antar-ID

**Root Cause:** Controller `index_itemed()` **TIDAK menggunakan parameter `id`** sama sekali. Parameter diabaikan. Data yang ditampilkan sama untuk semua user dengan akses.

**Analisis:**
- Route sudah dilindungi middleware `auth + level_privillage`
- Tidak ada IDOR karena parameter tidak diproses
- Broad data view kemungkinan by-design (semua user authorized melihat data yang sama)

**Status:** ✅ Accepted Risk / No IDOR  
**Catatan:** Jika ke depan ada kebutuhan pembatasan data per-user, perlu implementasi scope filtering.

---

## Temuan Internal (dari Code Review)

### A. Route `/inline-staging` Tanpa Middleware Auth

**Deskripsi:** Route di `web.php` line 254 tidak memiliki middleware auth maupun level_privillage

**File Diubah:** `routes/web.php`

**Perubahan:**
- Hapus route duplikat unprotected (line 254)
- Route protected `/staging-inline` (line 61) tetap dipertahankan

**Status:** ✅ Fixed

---

### B. Route `/import-price-item` Tanpa Middleware Auth

**Deskripsi:** Route di `web.php` line 249 berada di luar middleware group

**File Diubah:** `routes/web.php`

**Perubahan:**
- Pindahkan ke dalam middleware group `auth + level_privillage:super_admin,user_spvadmin,user_spvcpo,user_hod`

**Status:** ✅ Fixed

---

### C. Privilege Escalation di `adminUpdateRole`

**Deskripsi:** User dengan level `user_spvadmin/user_spvcpo/user_hod` bisa mengubah role user lain menjadi `super_admin`

**File Diubah:** `app/Http/Controllers/LoginUserController.php`

**Perubahan:**
- Hanya `super_admin` boleh assign role `super_admin`
- Tambah self-protection (tidak bisa ubah role sendiri)
- Hapus fallback PIN hardcoded

**Verifikasi:**
- Non-super_admin assign super_admin → ditolak
- User ubah role sendiri → ditolak
- Env tanpa PIN → fitur gagal aman

**Status:** ✅ Fixed

---

### D. `APP_DEBUG=true` di Production

**Deskripsi:** File `.env` masih berisi `APP_DEBUG=true`

**Remediasi:** Harus diubah ke `APP_DEBUG=false` saat deploy ke production

**Status:** ⚠️ Deployment Action Required  
**Catatan:** Tidak diubah di source karena `.env` adalah file environment-specific. Tim deploy harus memastikan production `.env` memiliki `APP_DEBUG=false`.

---

### E. Hardcoded PIN Fallback

**Deskripsi:** `env('ITEM_MANAGEMENT_PIN', '248624')` — fallback PIN hardcoded di source code

**File Diubah:** `app/Http/Controllers/LoginUserController.php`

**Perubahan:**
- Hapus default value fallback
- Jika env kosong, fitur gagal aman (return error)

**Verifikasi:**
- Env tanpa `ITEM_MANAGEMENT_PIN` → fitur menolak semua PIN

**Status:** ✅ Fixed

---

## Deployment Checklist

- [ ] Set `APP_DEBUG=false` di production `.env`
- [ ] Set `APP_ENV=production` di production `.env`
- [ ] Pastikan `ITEM_MANAGEMENT_PIN` terisi di production `.env`
- [ ] Clear config cache: `php artisan config:cache`
- [ ] Clear route cache: `php artisan route:cache`
- [ ] Verifikasi web server tidak menambahkan header `Access-Control-Allow-Origin: *`
- [ ] Smoke test semua halaman utama setelah deploy

---

## Catatan Penutup

Semua temuan dari report pentest tahap 2 telah ditindaklanjuti. Temuan yang memerlukan perubahan kode sudah diperbaiki. Temuan yang memerlukan konfigurasi deployment (`APP_DEBUG`, PIN env) dicatat sebagai deployment prerequisite.

Header security (HSTS, Referrer-Policy, X-Content-Type-Options, X-Frame-Options) sudah ada di global middleware dan berlaku ke semua route. CSP telah diperketat dengan `default-src 'self'` dan `upgrade-insecure-requests`.

Rekomendasi iterasi berikutnya:
1. Migrasi dari `unsafe-inline` ke nonce-based CSP
2. Implementasi rate limiting pada endpoint sensitif
3. Audit object-level authorization secara menyeluruh
4. Tambah automated security test di CI/CD pipeline
