Threat Detection Engine & Zero-Tolerance WAF
Mesin deteksi ancaman (PasaxService::inspect()) adalah jantung dari Web Application Firewall (WAF) mandiri di dalam paket ini. Mesin ini bertugas...
Mesin deteksi ancaman (PasaxService::inspect()) adalah jantung dari Web Application Firewall (WAF) mandiri di dalam paket ini. Mesin ini bertugas menganalisis seluruh lalu lintas HTTP yang masuk dan menentukan apakah suatu request bersifat berbahaya, mencurigakan, atau sah.
1. Target Inspeksi HTTP Request#
Setiap request diuraikan ke dalam beberapa area inspeksi spesifik (target):
path: URI path request (misal:/admin/../../../etc/passwdatau/wso.php).query: String parameter query URL mentah (misal:?id=1%20UNION%20SELECT).body: Payload mentah body request (JSON, form-urlencoded, multipart raw stream).input: Kombinasi seluruh parameter query dan form input yang telah di-decode oleh Laravel.filename: Nama berkas yang diunggah melalui formulir ($request->allFiles()).user_agent: String identifikasi browser/klien (User-AgentHTTP header).any: Seluruh target di atas digabungkan menjadi satu kesatuan inspeksi.
Proteksi Batas Ukuran (
max_inspect_length): Untuk mencegah serangan DoS berbasis konsumsi memori, teks yang diinspeksi dibatasi sepanjang maksimalPASAX_MAX_INSPECT_LENGTH(default: 4000 karakter). Jika ukuran body melebihi batas ini, pemotongan dilakukan secara aman tanpa merusak keabsahan regex.
2. Zero-Tolerance Instant Block vs Auto-Block#
Paket membagi respons ancaman menjadi dua mekanisme berbeda:
graph TD
Threat[Payload Terdeteksi] --> CheckZT{Apakah Cocok Signature<br/>Zero-Tolerance?}
CheckZT -->|YA| Instant[Blokir Instan 30 Hari<br/>Percobaan ke-1]
Instant --> Return403[HTTP 403 Forbidden]
CheckZT -->|TIDAK| RecordLog[Catat ke SecurityLog]
RecordLog --> CheckWindow{Akumulasi Kejadian<br/>>= 3 dalam 10 Menit?}
CheckWindow -->|YA| AutoBlock[Auto-Block 24 Jam]
AutoBlock --> Return403
CheckWindow -->|TIDAK| Allow[Izinkan Request Lewat<br/>atau Tolak jika critical]
A. Zero-Tolerance Instant Block (Blokir Instan)#
Sebagian payload serangan tidak pernah muncul dalam lalu lintas manusia normal. Sebagai contoh:
- Mengunggah berkas bernama
avatar.php%00.jpg(null byte attack). - Mengunggah berkas bernama
shell.php.png(double extension). - Melakukan path traversal ke webroot:
../../../../public/index.php. - Membuka berkas konfigurasi rahasia:
/.env,/.git/config,/.htaccess. - Menyuntikkan canary Server-Side Template Injection (SSTI):
{{7*7}}atau${7*7}. - Memindai dengan User-Agent pemindai kerentanan:
sqlmap,nikto,acunetix,nmap.
Aturan: Pelaku yang mengirim salah satu dari signature di atas LANGSUNG DIBLOKIR PADA REQUEST PERTAMA selama 720 jam (30 hari) tanpa perlu menunggu akumulasi ambang batas!
B. Progressive Threat Score & Sliding Window (Auto-Block)#
Serangan lain seperti dugaan SQL Injection samar (' or 1=1--), pola XSS (<script>), atau path scanning biasa bisa saja terjadi akibat kesalahan ketik atau input data pengguna yang valid.
Oleh karena itu, pola-pola ini dimasukkan ke dalam mekanisme Progressive Sliding Window:
- Setiap kali terjadi ancaman berlevel
highataucritical, catatan disimpan di tabelpasax_logs. - Sistem memeriksa berapa kali IP/perangkat tersebut memicu ancaman dalam kurun waktu
window_minutes(default: 10 menit). - Jika jumlah kejadian mencapai ambang, IP/perangkat secara otomatis diblokir selama
auto_block.duration(default: 24 jam).
Ambang per Tingkat (DB-backed): Ambang blokir kini ditentukan per tingkat ancaman —
auto_block.level_thresholdsdefault{critical: 1, high: 2, medium: 3, low: 5}. Blokir dipicu saatCOUNT(level) ≥ threshold(level)untuk tingkat mana pun dalam jendela. Nilainya dapat diubah langsung dari dashboard pengaturan (disimpan pada tabelpasax_settings, disemai oleh seeder default); kunci env lama (PASAX_AUTO_BLOCK_*) tetap didukung sebagai fallback senyap namun tidak lagi menguasai perilaku setelah sebaris settings tersedia.Sanksi Kombinasi: Kegagalan "gabungan" hanya dihitung bila ancaman berasal dari minimal 2 tingkat berbeda dan total kejadian melampaui
auto_block.combined_threshold(default 3) — serangan satu jenis berfrekuensi rendah tidak tersapu oleh aturan kombinasi.Lingkup Adaptif
auto:auto_block_scopemendukung 3 mode:device(isolasi perangkat spesifik),ip(seluruh Network Address Translation/IP), danauto— memakai blokir device bila identitasdevice_ideksplisit terdeteksi, dan fallback ke blokir IP saat fingerprint tidak tersedia.
3. Tingkat Bahaya Ancaman (Threat Levels)#
Setiap aturan diklasifikasikan ke dalam 4 tingkatan:
| Level | Deskripsi | Contoh Skenario | Aksi Bawaan |
|---|---|---|---|
critical |
Serangan fatal yang mengancam integritas server atau data | SQLi UNION SELECT, Remote Code Execution, SSTI, Null Byte |
Hitung untuk auto-block; jika block_suspicious_requests=true langsung tolak. |
high |
Percobaan eksploitasi aktif terarah | XSS tersimpan, Path traversal ../, probe .git/config |
Hitung untuk auto-block. |
medium |
Anomali input atau encoding yang tidak wajar | Encoding berlapis, double URL-decode, tag HTML mencurigakan | Dicatat ke log audit. |
low |
Scanner informasi umum atau probe pasif | Akses ke rute admin yang tidak ada, bot user-agent umum | Dicatat untuk analisis statistik. |
4. Standar Keamanan ReDoS (Regular Expression Denial of Service)#
ReDoS adalah serangan di mana penyerang mengirimkan string tertentu yang memicu algoritma regex engine untuk melakukan komputasi eksponensial (Catastrophic Backtracking), membekukan proses PHP-FPM dan membuat server CPU melonjak hingga 100%.
Aturan Baku Pembuatan Signature di Paket Ini:#
- Dilarang Menggunakan Kuantifier Bersarang:
- ❌
(a+)+atau([a-zA-Z0-9]+)*atau(.*[a-z])+ - ✅ Gunakan karakter set eksplisit dengan batasan:
[a-zA-Z0-9_]{1,100}
- ❌
- Gunakan Atomic Grouping atau Non-Backtracking Quantifiers:
- Gunakan
(?:pattern)dengan batas awal dan akhir yang jelas.
- Gunakan
- Uji Beban Wajib (
DetectorTuningTest):- Seluruh regex wajib diuji terhadap string acak sepanjang 100KB+ untuk memastikan waktu eksekusi berada di bawah 1 milidetik.