Threat Modeling Ringan

Threat modeling ringan dengan STRIDE-lite pada sebuah fitur nyata.

Daftar isi

Threat modeling adalah penelaahan ancaman terhadap sebuah fitur sebelum fitur itu ditulis, dan versi ringannya membatasi cakupan agar langkahnya benar-benar diselesaikan. Metode STRIDE-lite memandu penelaahan tersebut melalui enam kategori ancaman, dan setiap kategori cukup menghasilkan satu skenario ancaman beserta satu mitigasi. Topik ini menerapkan metode tersebut pada fitur perpanjangan peminjaman buku perpustakaan, dimulai dari peta aliran data, dilanjutkan dengan tabel ancaman yang dicetak oleh skrip, dan diakhiri cara mengubah mitigasi menjadi pekerjaan konkret. Setelah topik ini diselesaikan, satu fitur baru dapat ditelaah dalam hitungan puluhan menit tanpa peralatan selain editor teks.

Peta fitur sebelum ancaman dinilai#

Penelaahan dimulai dari peta, bukan dari daftar ancaman. Peta yang digunakan berupa diagram aliran data (data flow diagram), yaitu gambar yang menempatkan aktor, proses, penyimpanan data, dan aliran yang menghubungkan ketiganya. Kualitas peta menentukan kualitas ancamannya karena skenario yang baik selalu menunjuk titik tertentu pada aliran, bukan menyatakan kekhawatiran yang mengambang. Tabel berikut merangkum keempat unsur tersebut untuk fitur perpanjangan peminjaman buku.

Unsur petaIsi pada fitur perpanjangan
Aktoranggota yang mengirim formulir, petugas yang meninjau, layanan surel yang mengirim konfirmasi
Proseshandler perpanjangan pada server perpustakaan
Penyimpanancatatan peminjaman pada database
Aliran dataformulir perpanjangan, pembacaan dan pembaruan catatan, surel konfirmasi

Diagram berikut menempatkan keempat unsur itu pada satu gambar beserta batas kepercayaannya. Formulir perpanjangan lahir dari browser yang sepenuhnya dikuasai pengirim, sehingga data tersebut melewati batas kepercayaan dan wajib diperlakukan sebagai masukan yang belum dipercaya. Penandaan batas inilah yang membedakan threat modeling dari sekadar curiga, karena setiap skenario ancaman dapat menyebut titik lintasnya dengan tepat.

batas kepercayaan: server dan penyimpanan dataAnggotaServer aplikasiDatabase peminjamanformulirpeminjamankonfirmasi
Diagram aliran data fitur perpanjangan peminjaman buku

Fitur yang sama pernah digunakan sebagai contoh cacat logika pada modul Logika Bisnis dan Integritas, yaitu jumlah hari negatif yang memundurkan tanggal kembali. Perbedaannya terletak pada saat penemuan. Cacat pada modul itu ditemukan setelah aplikasi berjalan, sedangkan threat modeling berusaha menemukan celah yang sama pada saat desain, ketika perbaikannya masih berupa keputusan sederhana.

Enam kategori STRIDE-lite#

STRIDE (Spoofing, Tampering, Repudiation, Information disclosure, Denial of service, Elevation of privilege) adalah kerangka enam kategori ancaman yang menjadi dasar banyak metode threat modeling. Setiap kategori menjawab satu pertanyaan pemandu tentang fitur yang sedang ditelaah, sehingga penelaahan tidak bergantung pada kreativitas semata. Tabel berikut menyajikan keenam pertanyaan tersebut.

KategoriPertanyaan pemandu
SpoofingBisaakah pihak lain berpura-pura menjadi pengguna yang sah?
TamperingBisaakah data fitur diubah saat dikirim atau saat disimpan?
RepudiationBisaakah pengguna membantah tindakan yang pernah dilakukannya?
Information disclosureBisaakah data fitur terbaca oleh pihak yang tidak berhak?
Denial of serviceBisaakah layanan dilumpuhkan dengan permintaan berulang?
Elevation of privilegeBisaakah pengguna memperoleh hak yang bukan miliknya?

Versi ringannya membatasi pekerjaan pada satu skenario dan satu mitigasi untuk setiap kategori, sehingga hasilnya selalu selesai dan berukuran satu tabel. Skrip berikut membawa peta fitur serta tabel STRIDE-lite dalam bentuk data, mencetak keduanya, lalu menghitung jumlah ancaman per kategori. Simpan berkas berikut, lalu jalankan dengan perintah python3 model-ancaman.py.

python model-ancaman.py
"""Model ancaman STRIDE-lite untuk fitur perpanjangan peminjaman buku.

Data fitur memuat aktor, aliran, dan data yang terlibat. Tabel
STRIDE-lite menyimpan satu skenario ancaman dan satu mitigasi untuk
setiap kategori. Skrip mencetak peta fitur, tabel, dan rekapitulasi
jumlah ancaman per kategori secara deterministik.
"""

FITUR = {
    "nama": "perpanjangan peminjaman buku perpustakaan",
    "aktor": ["anggota", "petugas", "layanan surel"],
    "aliran": [
        "anggota mengirim formulir perpanjangan dari browser",
        "server memeriksa sesi, peran, dan batas perpanjangan",
        "server membaca serta memperbarui catatan peminjaman",
        "sistem mengirim surel konfirmasi kepada anggota",
    ],
    "data": [
        "identitas anggota",
        "jumlah hari perpanjangan",
        "catatan peminjaman",
    ],
}

# STRIDE-lite: satu skenario ancaman dan satu mitigasi per kategori.
STRIDE = [
    ("S", "Spoofing",
     "pengirim perpanjangan bukan pemilik akunnya",
     "periksa sesi aktif pada setiap permintaan"),
    ("T", "Tampering",
     "jumlah hari diubah menjadi nilai negatif",
     "validasi rentang jumlah di sisi server"),
    ("R", "Repudiation",
     "anggota membantah pernah memperpanjang",
     "catat peristiwa beserta waktu dan akun"),
    ("I", "Information disclosure",
     "catatan peminjaman anggota lain terbaca",
     "otorisasi per objek pada setiap kueri"),
    ("D", "Denial of service",
     "permintaan berulang menghabiskan sumber daya",
     "batasi laju permintaan per akun"),
    ("E", "Elevation of privilege",
     "anggota menjadi petugas lewat bidang tambahan",
     "terima hanya daftar bidang yang sah"),
]


def cetak_fitur():
    print(f"== fitur: {FITUR['nama']} ==")
    print("aktor:")
    for aktor in FITUR["aktor"]:
        print(f"  - {aktor}")
    print("aliran:")
    for nomor, aliran in enumerate(FITUR["aliran"], 1):
        print(f"  {nomor}. {aliran}")
    print("data:")
    for data in FITUR["data"]:
        print(f"  - {data}")


def cetak_tabel():
    print("== tabel STRIDE-lite ==")
    print(f"{'kode':<5}{'kategori':<24}{'skenario ancaman':<46}mitigasi")
    for kode, kategori, skenario, mitigasi in STRIDE:
        print(f"{kode:<5}{kategori:<24}{skenario:<46}{mitigasi}")


def cetak_rekap():
    hitungan = {}
    for kode, kategori, skenario, mitigasi in STRIDE:
        hitungan[kategori] = hitungan.get(kategori, 0) + 1
    print(f"== rekapitulasi: {len(STRIDE)} ancaman, satu per kategori ==")
    for kategori, jumlah in hitungan.items():
        print(f"  {kategori}: {jumlah}")


cetak_fitur()
cetak_tabel()
cetak_rekap()
text Keluaran
== fitur: perpanjangan peminjaman buku perpustakaan ==
aktor:
  - anggota
  - petugas
  - layanan surel
aliran:
  1. anggota mengirim formulir perpanjangan dari browser
  2. server memeriksa sesi, peran, dan batas perpanjangan
  3. server membaca serta memperbarui catatan peminjaman
  4. sistem mengirim surel konfirmasi kepada anggota
data:
  - identitas anggota
  - jumlah hari perpanjangan
  - catatan peminjaman
== tabel STRIDE-lite ==
kode kategori                skenario ancaman                              mitigasi
S    Spoofing                pengirim perpanjangan bukan pemilik akunnya   periksa sesi aktif pada setiap permintaan
T    Tampering               jumlah hari diubah menjadi nilai negatif      validasi rentang jumlah di sisi server
R    Repudiation             anggota membantah pernah memperpanjang        catat peristiwa beserta waktu dan akun
I    Information disclosure  catatan peminjaman anggota lain terbaca       otorisasi per objek pada setiap kueri
D    Denial of service       permintaan berulang menghabiskan sumber daya  batasi laju permintaan per akun
E    Elevation of privilege  anggota menjadi petugas lewat bidang tambahan terima hanya daftar bidang yang sah
== rekapitulasi: 6 ancaman, satu per kategori ==
  Spoofing: 1
  Tampering: 1
  Repudiation: 1
  Information disclosure: 1
  Denial of service: 1
  Elevation of privilege: 1

Setiap baris tabel menghubungkan satu kategori dengan satu skenario yang khusus untuk fitur ini, bukan ancaman generik yang berlaku di mana saja. Baris Tampering memuat celah yang sama dengan contoh pada modul Logika Bisnis dan Integritas, yaitu jumlah hari yang diubah menjadi nilai negatif, dan mitigasinya pun sejalan, yaitu validasi rentang di sisi server. Baris Elevation of privilege memperlihatkan pola berbeda yang sasarannya peran, misalnya bidang status yang disisipkan pada permintaan. Rekapitulasi di akhir keluaran menegaskan ciri STRIDE-lite, yaitu enam ancaman dengan tepat satu per kategori.

Dari tabel menjadi pekerjaan#

Mitigasi yang tidak pernah dikerjakan nilainya sama dengan ancaman yang tidak pernah dicatat. Agar tabel benar-benar mengubah aplikasi, setiap baris mitigasi diterjemahkan menjadi tugas dengan kriteria penerimaan yang dapat diuji. Baris Tampering pada contoh di atas menjadi tugas berbunyi demikian, yaitu permintaan perpanjangan dengan jumlah 0, jumlah negatif, dan jumlah yang melampaui 60 hari ditolak oleh handler dengan kode status 400. Kriteria yang persis semacam ini dapat diteruskan ke pengujian otomatis tanpa penafsiran tambahan.

Tabel ancaman juga menjadi bahasa bersama saat fitur ditinjau. Mitigasi kategori Spoofing dan Information disclosure ditopang kontrol autentikasi dan otorisasi yang dibahas pada modul Kontrol Akses yang Rusak, sedangkan kategori Repudiation ditopang log keamanan pada topik Log dan Peringatan Keamanan di modul ini. Rangkaian itu menunjukkan bahwa tabel yang ringan tetap tersambung dengan pertahanan lain di jalur ini. Bila satu kategori menuntut pembahasan lebih dalam, standar verifikasi seperti OWASP ASVS dapat dijadikan sumber pemeriksaan tambahan.

Model perlu diperbarui setiap fitur berubah, karena perubahan kecil pada aliran data dapat memunculkan skenario baru. Pembaruan semacam ini murah dilakukan ketika tabelnya hidup di repositori dan dirujuk pada deskripsi setiap pull request fitur. Kegagalan yang paling sering terjadi bukan pada kualitas ancamannya, melainkan pada tabel yang tidak pernah dibuka lagi setelah fitur dirilis.

Kesalahan umum#

Kesalahan berikut paling sering muncul saat threat modeling ringan dipraktikkan.

  • Membuat peta setelah kode selesai. Peta yang mengikuti kode terkunci hanya mendeskripsikan keadaan, sehingga ancamannya tidak lagi mencegah apa pun. Susun peta sebelum implementasi dimulai.
  • Menulis skenario tanpa mitigasi atau mitigasi tanpa pemiliknya. Setiap baris diberi penutup berupa tugas yang dapat dikerjakan seseorang dalam waktu tertentu.
  • Memperbesar cakupan hingga seluruh sistem sekaligus. Telaah yang terlalu luas tidak pernah selesai, sedangkan telaah per fitur selalu memberi hasil.
  • Memperlakukan tabel sebagai dokumen sekali jadi. Buka kembali tabel setiap ada aliran data, peran, atau penyimpanan yang bertambah.

Ringkasan#

  • Threat modeling ringan menelaah satu fitur melalui enam kategori STRIDE dengan satu skenario ancaman dan satu mitigasi per kategori.
  • Diagram aliran data yang memuat aktor, proses, penyimpanan, dan batas kepercayaan menjadi dasar penentuan skenario.
  • Mitigasi bernilai hanya bila diterjemahkan menjadi tugas berkriteria uji, dan tabelnya diperbarui setiap fitur berubah.

Referensi#