Threat modeling adalah cara terstruktur buat menebak ancaman ke sistemmu sebelum penyerang menemukannya. Daripada nebak-nebak "kira-kira apa yang bisa dibobol", kamu pakai daftar pertanyaan yang sama untuk tiap bagian sistem. Bayangin kamu mau nutup rumah sebelum pergi: kamu keliling ke tiap pintu dan jendela dan nanya hal yang sama, "ini bisa dibuka dari luar gak?" STRIDE adalah daftar keliling itu untuk software.
🧪 Tebakan cepat: penyerang mengirim ulang request terus-menerus sampai server kehabisan tenaga dan tumbang. Huruf STRIDE mana ini? Tebak dulu, jawabannya ada di bagian "Enam huruf STRIDE".
Enam huruf STRIDE
STRIDE adalah model dari Microsoft yang membagi ancaman jadi enam kategori. Tiap huruf mengingatkan kamu menanyakan satu jenis ancaman ke tiap komponen.
- S: Spoofing, identitas palsu. Login sebagai orang lain, token dicuri. Mengancam autentikasi.
- T: Tampering, mengubah data tanpa izin. Ganti harga di request, corrupt file. Mengancam integritas.
- R: Repudiation, menyangkal. User bilang "bukan saya" karena gak ada catatannya. Mengancam non-repudiation.
- I: Information Disclosure, kebocoran data. Stack trace bocor, response kelebihan data. Mengancam kerahasiaan.
- D: Denial of Service, bikin layanan gak tersedia. Membanjiri request sampai server tumbang. Mengancam ketersediaan.
- E: Elevation of Privilege, naik hak akses. User biasa jadi admin. Mengancam otorisasi.
Penyerang yang membanjiri server sampai tumbang itu huruf D: Denial of Service. Itu jawaban tebakannya. Dan huruf T adalah Tampering, mengubah data tanpa izin.
Mengklasifikasikan ancaman dengan kata kunci
Di latihan, kamu bikin fungsi classifyStride(threat) yang membaca deskripsi ancaman (huruf kecil semua) dan mengembalikan kategorinya. Aturannya pakai kata kunci sederhana. Lab juga memakai aturan yang sama:
function classifyStride(threat) {
const t = threat.toLowerCase()
if (/(impersonat|fake identity|stolen token|phish)/.test(t)) return 'spoofing'
if (/(modif|alter|change price|forge)/.test(t)) return 'tampering'
if (/(den(y|ies|ied)|repudiat|no log|audit)/.test(t)) return 'repudiation'
if (/(leak|expose|disclose|stack trace)/.test(t)) return 'info-disclosure'
if (/(flood|exhaust|denial|crash)/.test(t)) return 'dos'
if (/(privilege|admin|escalat|idor)/.test(t)) return 'elevation'
return 'unknown'
}
- Urutannya penting: kata kunci dicek dari atas ke bawah, yang cocok duluan menang.
- Kalau gak ada yang cocok, hasilnya
'unknown'.
Ini hasil fungsi pada contoh-contohnya:
| Panggilan | Kata kunci cocok | Hasil |
|---|---|---|
classifyStride('Attacker floods login endpoint') |
flood | 'dos' |
classifyStride('Change price in POST body') |
change price | 'tampering' |
classifyStride('User denies they made the transaction') |
denies | 'repudiation' |
classifyStride('Stack trace leak in error response') |
stack trace, leak | 'info-disclosure' |
classifyStride('IDOR lets user become admin') |
idor, admin | 'elevation' |
classifyStride('Impersonate another user with stolen token') |
impersonat, stolen token | 'spoofing' |
Menilai risiko: likelihood kali impact
Setelah tahu kategorinya, tiap ancaman dinilai dengan likelihood (seberapa mungkin terjadi, skala 1 sampai 5) dikali impact (seberapa parah kalau terjadi, 1 sampai 5). Hasilnya skor risiko: makin besar, makin didahulukan diperbaiki. Lab memakai enam ancaman yang sama dengan tabel di atas, dengan skor seperti ini:
| Ancaman | Kategori | L | I | Skor | Tingkat |
|---|---|---|---|---|---|
| IDOR lets user become admin | elevation | 4 | 5 | 20 | CRITICAL |
| Change price in POST body | tampering | 4 | 4 | 16 | CRITICAL |
| Impersonate with stolen token | spoofing | 3 | 4 | 12 | HIGH |
| Attacker floods login endpoint | dos | 3 | 3 | 9 | HIGH |
| User denies the transaction | repudiation | 2 | 3 | 6 | MEDIUM |
| Stack trace leak | info-disclosure | 3 | 2 | 6 | MEDIUM |
- Ambang tingkatnya: 15 ke atas CRITICAL, 9 sampai 14 HIGH, 5 sampai 8 MEDIUM, di bawah 5 LOW.
- Memasang mitigasi menurunkan likelihood, jadi skornya ikut turun. Di Lab, nyalakan mitigasi dan lihat tingkatnya berubah.
⚠️ Jebakan yang sering ketemu
- Threat modeling setelah deploy. Paling murah memperbaiki arsitektur saat masih di papan tulis. Lakukan sebelum coding.
- Cuma mikir satu jenis ancaman. STRIDE dipakai supaya kamu gak lupa lima kategori lain. Tanyakan keenamnya ke tiap komponen.
- Lupa case-insensitive.
classifyStridemengubah input jadi huruf kecil dulu. Tanpa itu,Flooddengan huruf besar gak cocok dengan kata kunciflood. - Semua ancaman dianggap sama penting. Pakai likelihood kali impact biar yang CRITICAL diperbaiki duluan, bukan yang paling gampang.
TL;DR: STRIDE adalah enam kategori ancaman: Spoofing (autentikasi), Tampering (integritas), Repudiation (non-repudiation), Information Disclosure (kerahasiaan), Denial of Service (ketersediaan), Elevation of Privilege (otorisasi). classifyStride mencocokkan kata kunci dari atas ke bawah, lalu 'unknown' kalau tak ada yang cocok. Nilai tiap ancaman dengan likelihood kali impact (IDOR jadi admin 4 kali 5 sama dengan 20, CRITICAL), lalu perbaiki yang skornya paling tinggi dulu.