Model Keamanan
Threat model
Section titled “Threat model”Target utama: bot/scanner otomatis, pengintaian (recon), percobaan kredensial, path traversal, percobaan exploit, dan penyalahgunaan request.
| Threat | Contoh | Respons default |
|---|---|---|
| Sensitive file probing | /.env, /.git/config, /.aws/credentials |
High/Critical: blok + ban sementara |
| Credential probing | .git-credentials, wp-config.php |
Critical: blok + ban |
| RCE probing | php://input, auto_prepend_file |
Critical: blok + ban lebih lama |
| Path traversal | ../, %2e%2e, encode ganda |
Skor berbasis confidence |
| Enumeration | banyak URI unik/404 singkat | Behavior score + challenge/ban |
| SQLi / XSS / LFI | union select, <script, file:// di body/query |
Pack injection: challenge/ban |
| Scanner tool | sqlmap/nikto/gobuster | Sinyal tool UA + behavior |
| Fake crawler | User-Agent: Googlebot dari IP tak terverifikasi |
Verifikasi IP → skor + unverified_crawler_claim; challenge hanya bila bots.mode=challenge |
| Fake browser bot | UA normal tapi pola otomatis | Behavior engine + challenge |
| Abuse login/form | burst pada endpoint valid | Rate limit per-path + skor |
Asumsi penting: bot modern bisa memalsukan User-Agent & header → UA tidak pernah menjadi sinyal tunggal untuk memblokir. Crawler hanya dipercaya setelah IP-nya terverifikasi.
Security boundary
Section titled “Security boundary”Internet → Cloudflare/Edge WAF → Hosting WAF/ModSecurity → Ganadev Shield → Router → ControllerGanadev Shield bekerja setelah request masuk runtime PHP. Bukan pengganti CDN/WAF, malware scanner filesystem, antivirus host, network firewall, atau proteksi logic flaw bisnis.
Keamanan implementasi
Section titled “Keamanan implementasi”- Tidak ada
eval, unsafeunserialize, atau dynamic code execution. - SQL di-parameterisasi via ORM/query builder.
- Admin default nonaktif + wajib authorization gate.
- Verifikasi challenge server-side + rate-limit + CSRF.
- Redirect challenge dibatasi same-origin (anti open-redirect).
- Secret query di-mask (
***) sebelum disimpan disecurity_events. - Rule regex di-guard terhadap ReDoS.
- Cookie trusted: encrypted, HttpOnly, Secure, SameSite=Lax, terikat UA+prefix IP, tidak bypass rule critical.
- Body request diperiksa (maks 64KB,
multipart/*di-skip) tapi tidak pernah di-log. fail_modekonfigurabel (open/closed).
Batasan yang diketahui
Section titled “Batasan yang diketahui”- Signature tidak menangkap 0-day: pola baru lolos sampai rule ditambahkan. Gunakan
observe+shield:replay- corpus untuk validasi sebelum enforce.
- Verifikasi crawler butuh IP asli: di belakang proxy/LB/CDN tanpa trusted proxies, IP yang terlihat adalah
IP proxy → crawler sah bisa gagal verifikasi. Setel trusted proxies; fallback via
bots.verification.ip_ranges. - Verifikasi crawler gagal tertutup: hasil negatif di-cache selama
ttl_hours(default 24 jam) dan resolver tidak punya kontrol timeout, jadi satu gangguan DNS dapat berdampak pada crawler sah dalam modebots.mode=challenge. Lihat Perilaku & Bot. - Rate limit per-IP, bukan per-token: counter perilaku di-key dengan IP. Banyak klien M2M di belakang satu IP
(gateway, worker, NAT) akan saling berdesakan, dan satu akun yang menyalahgunakan limit akan memakai kuota
bersama seluruh traffic di IP tersebut. Shield tidak mengecualikan traffic terautentikasi dari penghitung
ini, karena middleware berjalan global, jadi sebelum autentikasi Laravel tersedia. Untuk endpoint yang memang
bukan human-facing, daftarkan di
rules.skip_paths. - Body JSON ikut diperiksa:
inspection.body.enabledmemeriksa body apa pun selainmultipart/*, termasukapplication/json. Rulepayload.*bisa false-positive pada JSON yang sah (source code, SQL, markup), dan hanyamultipart/*yang di-skip. Mitigasi yang tersedia:rules.skip_pathsper endpoint, atau matikaninspection.body.enableduntuk payload yang memang tidak perlu diperiksa. Shield belum punya gating per-content-type. - Rule
containsbisa terlalu luas: pola seperti.env,/.git,phpunit, dancomposer.jsoncocok pada path mana pun yang memuat substring itu, termasuk konten repo seperti.githubatau.gitignore. - Injection pack bisa FP pada teks bebas: aplikasi dengan editor kode/forum sebaiknya daftarkan path-nya di
rules.skip_paths, atau matikanrules.packs.injection/inspection.body.enabled, atau biarkan rule di band challenge (user sah masih lolos). - Verifikasi crawler tidak membedakan
unavailabledariunverified: saat resolver bermasalah, hasil negatif di-cache selama TTL penuh (24 jam secara default), sehingga crawler asli diperlakukan sama dengan pemalsu.bots.verification.ip_rangesadalah fallback yang tidak bergantung pada DNS. Lihat Perilaku & Bot. - Ban cache bisa tertunda: ban yang kedaluwarsa alami masih terlihat di cache ≤ TTL (default 30s).
- Unique-URI burst diperkirakan dari jumlah request per window (bukan dedup set URI).
- Trusted proxy wajib dikonfigurasi di produksi (lihat Instalasi).
Strategi false-positive
Section titled “Strategi false-positive”- Rule baru diuji lewat replay corpus sebelum dipromosikan.
- Sinyal lemah tidak langsung ban; eskalasi butuh pelanggaran nyata.
- Mode
observeuntuk rule baru; threshold bisa dinaikkan. - Allowlist host/path/IP tersedia; bypass rule critical harus eksplisit.
- Manual release & challenge pass rate menjadi sinyal FP.
Powered by PT Ganadev Multi Solusi