Pembahasan ujian Registered Information Security Specialist musim semi Reiwa 6, soal 1 sesi sore — JWT alg=none, otorisasi API, dan tindakan WAF sementara

· Diperbarui pada: · · Registered Information Security Specialist, Spesialis keamanan terdaftar, API, Keamanan API, JWT, Autentikasi, Otorisasi, WAF, Log4Shell, Keamanan informasi, Kerentanan, IPA

Riwayat revisi (3 pembaruan, terakhir pada 1 Sep 2026)

Catatan perubahan yang dilakukan pada artikel ini. Jika versi sebelumnya telah diarsipkan, versi itu tetap dapat dibaca melalui tautan permanen dengan DOI.

Perbaikan tinjauan Codex: placeholder Authorization Bearer <JWT> dan pemisah ribuan Indonesia 10.000/5.000.
Diterjemahkan ulang sebagai terjemahan lengkap dari naskah Jepang. Versi bahasa Indonesia sebelumnya adalah ringkasan yang hanya memindahkan sebagian naskah, sehingga bagian, tabel, gambar Mermaid, keterangan gambar, dan FAQ tidak ada. Semuanya dipulihkan sesuai naskah Jepang, dan klaim teknisnya sama dengan versi Jepang.
Menambahkan bagian peta pengetahuan di awal artikel. Konsep yang dibahas di badan artikel beserta relasinya dirangkum ke ringkasan, diagram, dan tautan ke halaman rinci. Klaim di badan artikel tidak diubah.
Publikasi pertama
Mengutip artikel ini(DOI (arsip terdaftar): 10.5281/zenodo.22176005)

DOI di bawah mengarah ke versi yang telah diarsipkan sebelumnya dan mungkin berbeda dari teks saat ini. Gunakan URL halaman ini untuk merujuk teks saat ini.

Go Komura (2026). Pembahasan ujian Registered Information Security Specialist musim semi Reiwa 6, soal 1 sesi sore — JWT alg=none, otorisasi API, dan tindakan WAF sementara. KomuraSoft LLC. https://comcomponent.com/id/blog/sc-exam-r6s-pm-q1-api-security/

DOI (arsip terdaftar)
10.5281/zenodo.22176005
DOI (versi terakhir yang didaftarkan)
10.5281/zenodo.22176006

“Tanda tangan JWT diverifikasi, jadi ID pengguna dapat dipercaya.”

Ungkapan itu hanya setengah benar.

Soal 1 sesi sore ujian Registered Information Security Specialist musim semi tahun anggaran Reiwa 6 memakai API yang dipanggil dari ponsel sebagai bahan.1 Setelah autentikasi berhasil, JWT diterbitkan, lalu JWT itu dilampirkan untuk memanggil API pengambilan dan pembaruan informasi pengguna. Sekilas, susunannya biasa.

Namun, asesmen menemukan empat hal berikut.

  1. Mengubah alg pada header JWT menjadi none membuat JWT tanpa tanda tangan lolos
  2. Tetap memakai JWT yang sah, lalu mengubah mid ke ID pengguna lain, memungkinkan informasi orang lain diambil dan diperbarui
  3. Menambahkan status=paid yang tidak ada di spesifikasi mengubah pengguna gratis menjadi pengguna berbayar
  4. Kode autentikasi 4 digit yang dikirim lewat email dapat di-brute-force tanpa batas

Keempatnya tampak seperti “kerentanan di sekitar autentikasi”, tetapi penyebabnya tidak sama. Yang dilanggar adalah batas-batas yang terpisah: integritas token, otorisasi tingkat objek, otorisasi tingkat properti, dan batas jumlah percobaan.

Di bagian belakang, topik lain lagi ditambahkan. Pada pustaka sumber terbuka yang dipakai luas, diumumkan kerentanan serius yang memungkinkan eksekusi kode dari luar dengan menyalahgunakan JNDI Lookup. Belum ada versi perbaikan maupun aturan WAF yang selesai. Sementara itu, yang ditanyakan adalah bagaimana mengonfirmasi dampak, di mana WAF harus melihat, dan mengapa pada awalnya dipilih “deteksi” bukan “pemblokiran”.

Artikel ini bertumpu pada contoh jawaban resmi2 dan komentar penilaian3, lalu merapikan bukan hanya jawaban tiap soal, melainkan mengapa itu menjadi jawaban, dan seberapa ketat rancangan praktisnya.

Gambaran keseluruhan soalMenunjukkan batas kepercayaan yang dilanggar pada tiap tahap kode autentikasi, JWT, otorisasi API, dan kerentanan pustakatanpa batas jumlah percobaanmengizinkan alg=nonemempercayai midstatus=paidJNDI/LDAP/HTTPAplikasi penggunaKode autentikasi 4 digitPenerbitan JWTAPI penggunaKeluaran logPustaka yang rentanEksekusi kode eksternalAmbil/perbarui data orang lainUbah status penagihan

Gambar 1: Gambaran keseluruhan soal. Pada tiap tahap, batas kepercayaan yang berbeda dilanggar.

1. Kesimpulan lebih dulu

  • Sifat RESTful API yang tidak memegang sesi adalah stateless. Namun, itu tidak berarti server sama sekali tidak memegang basis data atau keadaan pengguna
  • Kode autentikasi 4 digit ada 10.000 kemungkinan. Pada 10 kali per detik, rata-rata 5.000 percobaan, berhasil dalam 500 detik. Itu lebih pendek dari masa berlaku 10 menit, jadi waktu kedaluwarsa saja tidak cukup
  • Tindakan minimum terhadap alg=none adalah memastikan alg pada header JWT bukan NONE. Namun dalam praktik, tetapkan algoritme yang diizinkan di sisi server
  • Meski JWT benar, mid pada permintaan tidak boleh dipercaya. Cocokkan ID pengguna di dalam JWT dengan mid, atau lebih aman: jangan menerima mid dan tentukan sasaran dari JWT
  • Penambahan status=paid adalah masalah Mass Assignment yang mengikat properti di luar spesifikasi ke objek internal. Pakai DTO pembaruan sebagai daftar izinkan, dan jangan biarkan pengguna mengubah status penagihan
  • Jawaban untuk tindakan brute-force adalah pemrosesan yang mengunci akun jika jumlah kegagalan beruntun melebihi ambang. Dalam praktik, tumpuk juga penundaan bertahap dan pengendalian per sumber
  • Pada konfirmasi dampak kerentanan serius yang baru, jangan memakai perintah merusak; catat akses ke index.html pada server uji untuk mengonfirmasi bahwa rantai eksekusi kode eksternal sampai
  • String serangan masuk ke header HTTP, jadi sasaran pemeriksaan WAF adalah Header. Sebagai regex yang menangani pertukaran huruf besar/kecil, misalnya \W[jJ][nN][dD][iI]\W
  • Keuntungan mengatur WAF ke “deteksi” lebih dulu adalah dapat mencegah pemblokiran komunikasi bisnis akibat deteksi keliru. Setelah peringatan diterima, telaah apakah itu serangan, lalu pindah ke pemblokiran setelah penyesuaian
  • WAF adalah tindakan sementara; tindakan akarnya adalah memperbarui pustaka yang terdampak ke versi perbaikan

Pada diagram, garis utuh menunjukkan relasi yang selalu berlaku dan garis putus-putus menunjukkan relasi bersyarat (syaratnya ada pada penjelasan masing-masing relasi di halaman rincian). Daftar lengkap relasi (total 18, beserta bukti dan tingkat kepastian) serta definisi konsep utama dikumpulkan di halaman rincian peta pengetahuan (dalam bahasa Jepang). Data: JSON-LD / Turtle

2. Korespondensi bahan dan soal

Panggung soalnya adalah perusahaan G yang akan mulai menyediakan layanan kesehatan. Pengguna memasukkan makanan, berat badan, dan data lain dari aplikasi ponsel, lalu menerima penilaian risiko kesehatan dan saran menu. Sistem dibangun di cloud, dengan kombinasi API gateway, pemrosesan berbasis peristiwa, dan basis data terkelola.

Nama produk dan nama layanan dalam naskah soal diabstraksikan. Artikel ini juga tidak menyalin tabel atau kalimat IPA; hanya struktur yang perlu untuk memahami soal yang diungkapkan kembali.

Soal Pokok Bab artikel ini
Soal 1 Sifat RESTful API Bab 4
Soal 2(1) Waktu brute-force kode 4 digit Bab 5
Soal 2(2) alg=none pada JWT Bab 6
Soal 2(3) Akses ke orang lain memakai mid Bab 7
Soal 2(4) Celah menerima status di luar spesifikasi Bab 8
Soal 2(5) Tindakan brute-force Bab 9
Soal 3(1) Mengonfirmasi adanya kerentanan dengan cara aman Bab 11
Soal 3(2)(3) Tempat yang dilihat WAF dan regex Bab 12
Soal 3(4) Keuntungan mode deteksi dan operasionalnya Bab 13

Menurut komentar penilaian, tingkat jawaban benar keseluruhan rata-rata. Di sisi lain, tindakan pemalsuan JWT pada soal 2(2) dan mekanisme yang diperlukan pada server uji pada soal 3(1) dinilai tingkat jawaban benarnya agak rendah. Keduanya tidak bisa dijawab hanya dengan mengetahui istilah. Perlu menelusuri nilai mana yang diubah penyerang, ke pemrosesan mana nilai itu mengalir, dan di mana nilai itu dipercaya.

3. Soal ini bukan satu “masalah autentikasi”

Jika seluruh soal disusun menurut batas kepercayaan, hasilnya seperti berikut.

[ID pengguna · kata sandi]
          |
          v
[Konfirmasi kode 4 digit] ---- tanpa batas jumlah percobaan ----> brute-force
          |
          v
[Menerbitkan JWT]
          |
          v
[Pustaka JWT] ------- mengizinkan alg=none ------> pemalsuan ID pengguna
          |
          v
[API pengguna]
    |             |
    |             +-- meneruskan status utuh ----> celah otorisasi tingkat properti
    |
    +-- mempercayai mid -----------------------> celah otorisasi tingkat objek

[Mencatat masukan eksternal ke log]
          |
          v
[Pustaka yang rentan] ---- JNDI/LDAP/HTTP ------> eksekusi kode eksternal

Yang paling penting di sini adalah pembedaan berikut.

Pemeriksaan Yang ditanyakan Contoh yang dilanggar dalam soal ini
Autentikasi Siapa Anda Brute-force kode 4 digit
Verifikasi token Apakah identitas itu tidak dipalsukan alg=none
Otorisasi tingkat objek Apakah data pengguna itu boleh diakses Penukaran mid
Otorisasi tingkat properti Apakah item itu boleh diubah status=paid
Batas dari masukan ke eksekusi Apakah masukan eksternal tidak ditafsirkan sebagai perintah JNDI Lookup

Keberhasilan pemeriksaan sebelumnya bukan alasan untuk melewatkan pemeriksaan berikutnya. Pengguna yang memegang JWT yang sah pun tidak otomatis boleh membaca data orang lain. Pengguna yang boleh memperbarui datanya sendiri pun tidak otomatis boleh mengubah status penagihan.

Jika pemisahan tahap ini bisa dilakukan, jawaban tiap soal tidak lagi hafalan.

Perbedaan autentikasi dan otorisasiAutentikasi mengonfirmasi subjek, otorisasi mengonfirmasi operasi yang diizinkan bagi subjek ituAutentikasisiapaOtorisasiapa yang boleh dilakukan

Gambar 2: Perbedaan autentikasi dan otorisasi. Autentikasi lebih dulu, otorisasi adalah pemeriksaan terpisah.

4. Soal 1 — apa itu stateless

Soal 1 menanyakan salah satu prinsip rancangan RESTful API, yaitu sifat tidak melakukan pengelolaan sesi.

Jawabannya adalah stateless.

Stateless berarti, tanpa server mengingat keadaan percakapan permintaan sebelumnya, informasi yang diperlukan untuk pemrosesan sudah lengkap pada tiap permintaan. Dalam soal ini, aplikasi ponsel menempelkan JWT ke header Authorization pada setiap permintaan. Server memverifikasi JWT itu dan mengidentifikasi pengguna permintaan tersebut.

Yang mudah disalahartikan adalah membaca stateless sebagai “server tidak memegang keadaan apa pun”. Pada kenyataannya, keadaan berikut biasa dipegang.

  • Basis data yang menyimpan informasi pengguna dan data kesehatan
  • Status penagihan
  • Nilai kode autentikasi, masa berlaku, jumlah kegagalan
  • Kunci tanda tangan JWT
  • Jika rancangannya memakai daftar pencabutan, informasi pencabutan itu
  • Log dan catatan audit

Yang tidak dipegang adalah tidak menjadikan keadaan sesi sisi server yang hanya untuk melanjutkan percakapan sebagai prasyarat tiap pemanggilan API.

Selain itu, bersifat stateless tidak secara otomatis meningkatkan keamanan. Mengirim JWT setiap kali memudahkan penskalaan horizontal, tetapi jika verifikasi JWT salah, kesalahan itu juga menyebar merata ke semua node. Sifat arsitektur dan kebenaran keamanan adalah hal yang berbeda.

5. Soal 2(1) — kode 4 digit mengenai rata-rata dalam 500 detik

API autentikasi, jika ID pengguna dan kata sandi cocok, mengirim angka 4 digit ke email. Setelah itu, jika ID pengguna dan kode 4 digit cocok, JWT diterbitkan. Kode berlaku 10 menit sejak dibuat.

Dalam asesmen, 10 percobaan per detik memungkinkan. Yang diminta adalah berapa detik rata-rata sampai tembus.

Perhitungannya adalah “setengah jumlah kandidat”

Angka 4 digit, termasuk 0 di depan, adalah 10.000 kemungkinan berikut.

0000, 0001, 0002, ... , 9999

Jika jawaban dipilih seragam, rata-rata jumlah percobaan sampai penyerang yang mencoba berurutan tanpa duplikat mengenai jawaban adalah setengah jumlah kandidat.

rata-rata jumlah percobaan = 10.000 ÷ 2 = 5.000 kali
rata-rata waktu             = 5.000 ÷ 10 kali/detik = 500 detik

Karena itu, isian b adalah 500.

Maksimum memakan 1.000 detik, tetapi yang ditanyakan soal adalah rata-rata. Masa berlaku kode adalah 600 detik, lebih panjang dari 500 detik waktu tembus rata-rata. Itulah alasan dinilai “kemungkinan tembus tinggi”.

Skala waktu kode autentikasi 4 digit10.000 kemungkinan pada 10 kali per detik berarti rata-rata 5.000 percobaan, 500 detik, lebih pendek dari masa berlaku 600 detikrata-rata 10.000 / 2 = 5.000 kali500 detik &lt; 600 detikJumlah kandidat 10.000Waktu tembus rata-rata 500 detikMasa berlaku 600 detikDapat tembus dalam masa berlaku

Gambar 9: Skala waktu kode autentikasi 4 digit. Mencoba rata-rata setengah jumlah kandidat mengenai dalam masa berlaku.

Memendekkan waktu kedaluwarsa saja kalah jika kandidat sedikit

Kekuatan kode autentikasi tidak ditentukan hanya oleh jumlah digit atau hanya oleh masa berlaku.

jumlah percobaan dalam masa berlaku
= percobaan per detik × masa berlaku
= 10 × 600
= 6,000 kali

Jika nilai tanpa duplikat dicoba berurutan, 60% dari 10.000 dapat diperiksa dalam masa berlaku. Meski ada waktu kedaluwarsa, tanpa batas jumlah percobaan itu tidak cukup.

NIST SP 800-63B yang berlaku menuntut setidaknya 6 digit untuk rahasia jangka pendek pada autentikasi out-of-band, dan mewajibkan batas jumlah percobaan jika kurang dari 64 bit. Selain itu, email tidak boleh dipakai untuk autentikasi out-of-band.4 Dalam ujian, jawaban disusun di dalam spesifikasi 4 digit dan pengiriman email yang diberikan, tetapi pada rancangan baru di praktik, prasyarat itu sendiri juga perlu ditinjau.

6. Soal 2(2) — alg=none adalah masalah “membiarkan penyerang memilih cara verifikasi”

JWT dalam soal terdiri dari tiga bagian: header, payload, dan tanda tangan.

base64url(header).base64url(payload).base64url(signature)

Pada header tercatat RS256 sebagai algoritme tanda tangan. Pada payload ada ID pengguna, waktu penerbitan, dan masa berlaku.

Asesor mengubah dua hal berikut.

  1. Mengubah alg pada header dari RS256 menjadi NONE
  2. Mengubah ID pengguna pada payload ke pengguna lain

JWT itu dikirim, verifikasi berhasil, dan penyamaran sebagai orang lain berhasil.

Alur serangan JWT alg=noneMengubah alg menjadi none dari JWT yang sah, menulis ulang ID pengguna, lalu lolosalg header ke nonemelewati verifikasi tanda tanganJWT sahalg=RS256user=user01JWT dipalsukanalg=noneuser=user02Server menerimasebagai user02

Gambar 3: Alur serangan JWT alg=none. Penyerang yang memilih algoritme verifikasi.

none bukan salah eja string

RFC 7519 mendefinisikan “Unsecured JWT” dengan alg bernilai none sebagai JWT tanpa tanda tangan maupun enkripsi.5 Jadi nilai none bukan sesuatu yang sama sekali tidak ada dalam spesifikasi.

Masalahnya adalah API yang seharusnya hanya menerima JWT bertanda tangan justru menerima none yang ditentukan penyerang.

Pemrosesan yang rentan, secara konseptual, seperti berikut.

1. Membaca header JWT
2. Melihat alg yang tertulis di header, lalu memilih cara verifikasi
3. Jika alg adalah none, tidak melakukan verifikasi tanda tangan
4. Mempercayai ID pengguna pada payload

Kekuatan keamanan itu sendiri dipilih dari masukan yang dikendalikan penyerang.

Jawaban ujian

Soal menanyakan, masing-masing dalam 20 karakter atau kurang, data mana yang diverifikasi pustaka Q setelah perbaikan, dan verifikasi seperti apa yang dilakukan.

Contoh jawaban sebagai berikut.

Butir Pokok jawaban
Data yang diverifikasi Nilai yang ditentukan pada alg di dalam header JWT
Isi verifikasi Memverifikasi bahwa nilainya bukan NONE

Sebagai perbaikan langsung terhadap kerentanan dalam naskah soal, ini benar.

Dalam praktik, jangan berhenti di “asal bukan NONE”

Di sini perlu memisahkan jawaban ujian dan rekomendasi praktis.

RFC 8725 menyatakan bahwa pustaka JWT harus meminta pemanggil menentukan himpunan algoritme yang diizinkan, dan tidak boleh memakai yang di luar himpunan itu.6 Artinya, cara pikir seperti berikut.

cara pikir buruk:
  terima jika token.header.alg != "none"

cara pikir baik:
  terima hanya jika termasuk dalam serverConfig.allowedAlgorithms
  contoh: allowedAlgorithms = ["RS256"]

Meski hanya none yang ditolak, algoritme lemah lain, atau kebingungan algoritme yang mencampur skema kunci publik dan kunci simetris, masih mungkin tersisa. Prinsipnya adalah bukan menambah syarat penerimaan dalam bentuk negatif, melainkan mempersempit dan menetapkan syarat yang diizinkan.

Pada verifikasi JWT, selain algoritme, setidaknya butir berikut dikonfirmasi sesuai penggunaan.

Butir Yang dikonfirmasi
Tanda tangan Apakah dapat diverifikasi dengan kunci dan algoritme yang diharapkan
iss Apakah penerbit yang dipercaya
aud Apakah token diterbitkan untuk API ini
exp Apakah masih dalam masa berlaku
nbf Apakah tidak sebelum waktu mulai penggunaan
sub atau ID pengguna Apakah subjek yang sah di aplikasi
Jenis token Apakah ID token dan access token tidak tertukar

Dalam soal ini nama kunci payload adalah user, tetapi dalam praktik pakai sub standar, atau definisikan dengan jelas makna klaim kustom.

Verifikasi JWT yang aman dan yang berbahayaVerifikasi berbahaya bergantung pada alg; verifikasi aman memakai daftar izinkan sisi serverVerifikasi amanAlgoritme yang diizinkan di konfigurasi servercontoh: RS256Konfirmasi apakah alg header JWTtermasuk daftar izinkanVerifikasi tanda tangan, iss, aud, expVerifikasi berbahayaMembaca alg header JWTTerima jika alg adalah none

Gambar 4: Verifikasi aman dan berbahaya. Dalam praktik, tetapkan sempit algoritme yang diizinkan.

Base64url bukan enkripsi

Ada satu lagi salah paham yang sering terjadi pada JWT. Header dan payload dinyatakan dalam base64url, tetapi itu bukan enkripsi. Siapa pun dapat mendekode dan membacanya.

Yang dijamin tanda tangan, hanya jika verifikasi berhasil, adalah bahwa isi tidak dipalsukan setelah penerbitan. Itu tidak berarti informasi pribadi yang harus dirahasiakan boleh dimasukkan ke payload JWT bertanda tangan.

7. Soal 2(3) — meski JWT benar, mengubah mid cukup untuk membaca orang lain

Berikutnya adalah serangan yang tidak memalsukan JWT itu sendiri.

API pengguna menerima ID pengguna bernama mid lewat GET atau PUT. Modul bersama P mengambil dan memperbarui informasi pengguna yang terikat pada mid itu dari basis data.

Skema serangannya sederhana.

ID pengguna di JWT: user01    ← JWT yang ditandatangani dengan benar
mid permintaan: user02        ← diubah penyerang

Tanda tangan JWT benar, jadi autentikasi berhasil. Namun API mempercayai mid=user02 apa adanya, dan mengembalikan informasi user02.

Ini contoh khas Broken Object Level Authorization (BOLA) dalam OWASP API Security Top 10 2023. Ketika data diakses memakai ID objek yang ditentukan pengguna, otorisasi ke objek itu harus dikonfirmasi setiap kali.7

Serangan BOLATetap memakai JWT yang sah, lalu mengubah mid permintaan ke ID pengguna lainJWT: user01mid: user02mempercayai midPenyerangAPI penggunaMengembalikan info user02 dari DB

Gambar 5: Serangan BOLA. Autentikasi lolos, tetapi otorisasi tidak dikonfirmasi.

Jawaban soal

Garis bawah ② pada tabel 5 menanyakan pemrosesan yang ditambahkan ke pemanggilan modul bersama P, dalam 40 karakter atau kurang.

Contoh jawabannya sebagai berikut.

Pemrosesan yang memverifikasi apakah ID pengguna di dalam JWT cocok dengan nilai mid

Keuntungan memverifikasi di modul bersama P adalah otorisasi yang sama mudah diterapkan pada GET dan PUT, serta pada API lain yang kelak memakai P. Jika perbandingan yang sama disalin ke tiap layar atau endpoint, salah satu akan terlewat.

Rancangan yang lebih aman: jangan menerima mid

Jika API hanya mengambil dan memperbarui informasi diri sendiri, tidak perlu menerima ID pengguna dari klien.

GET /users/me
Authorization: Bearer <JWT>

Di sisi server, subjek diambil dari JWT yang sudah diverifikasi.

principal = validateJwt(request.authorization)
userId = principal.subject
return repository.getUser(userId)

Pembaruan sama.

principal = validateJwt(request.authorization)
input = validateProfileUpdate(request.body)
repository.updateProfile(
    userId = principal.subject,
    name = input.name,
    age = input.age
)

Pemrosesan perbandingan, jika ditulis, dapat melindungi. Namun jika rancangannya tidak menerima ID sasaran dari luar, jenis bug karena lupa menulis perbandingan itu sendiri berkurang.

Jika administrator perlu mengoperasikan informasi pengguna lain, pisahkan seperti berikut.

PUT /users/me                  untuk pengguna umum
PUT /admin/users/{userId}      untuk administrator

Untuk administrator, minta wewenang terpisah, log audit, dan jika perlu autentikasi ulang. Batas kebijakan otorisasi lebih terlihat daripada “menambah pengecualian hanya jika administrator pada API pengguna umum”.

Cara mencegah BOLAJangan memakai mid permintaan; tentukan sasaran dari subjek JWT, atau cocokkanGET /users/me + JWTambil sub JWTcocoktidak cocoktanpa midPenggunaAPIjika ada mid,apakah cocok dengan subKembalikan data sendiriTolak 403Cari DB dengan sub JWT

Gambar 6: Cara mencegah BOLA. Jangan menerima mid, atau cocokkan dengan subjek JWT.

Membedakan autentikasi dan otorisasi dalam satu kalimat

Baik di ujian maupun praktik, rumusan berikut berguna.

  • Autentikasi: siapa
  • Otorisasi: apa yang boleh dilakukan orang itu

Berhasilnya verifikasi tanda tangan JWT hanya sampai “subjek yang diwakili token ini dapat dipercaya”. “Subjek itu boleh membaca user02” harus dikonfirmasi secara terpisah.

8. Soal 2(4) — status=paid adalah celah otorisasi tingkat properti

Pada spesifikasi API pengguna, parameter pembaruan yang didefinisikan adalah sebagai berikut.

mid   ID pengguna
name  nama
age   usia

Namun asesor menambahkan nilai berikut yang tidak ada di spesifikasi.

status=paid

Akibatnya, status pengguna gratis berubah menjadi pengguna berbayar.

Menurut naskah soal, layanan L tidak memverifikasi parameter yang diterima, lalu meneruskan semuanya ke modul bersama P. P dibuat agar dapat memperbarui basis data apa adanya.

Jawaban isian c adalah modul bersama P.

Mass Assignmentstatus=paid di luar spesifikasi ditambahkan dan diterapkan utuh ke objek internalpenyerang menambah status=paidikatan otomatissimpan DBSpesifikasi APImid / name / ageBody permintaanModul bersama PStatus penagihan berubah jadi paid

Gambar 7: Mass Assignment. Properti di luar spesifikasi diterapkan utuh ke objek internal.

Perbedaan dengan BOLA

Penukaran mid di bab sebelumnya dan penambahan status kali ini mirip, tetapi granularitas yang dilindungi berbeda.

Kerentanan Yang diubah penyerang Yang seharusnya dikonfirmasi
Penukaran mid Objek sasaran Apakah pengguna ini boleh mengakses rekaman pengguna ini
Penambahan status Properti di dalam objek Apakah pengguna ini boleh mengubah item ini

OWASP API Security Top 10 2023 menempatkan yang terakhir sebagai Broken Object Property Level Authorization, dan memasukkan Mass Assignment sebelumnya ke klasifikasi ini.8

Bahaya “memasukkan JSON apa adanya ke entitas”

Implementasi yang rentan, secara konseptual, seperti berikut.

entity = repository.find(body.mid)
bindAllProperties(entity, body)
repository.save(entity)

Meski layar hanya punya kolom name dan age, penyerang dapat membuat permintaan HTTP secara langsung. Item yang tidak ada di UI bukan batas keamanan.

Implementasi yang aman menyatakan secara eksplisit item yang boleh diperbarui.

input = parseExactSchema(body, fields = ["name", "age"])

entity = repository.find(authenticatedUserId)
entity.name = input.name
entity.age  = input.age
repository.save(entity)

Di sini ada dua hal penting.

  1. Pada tipe masukan pembaruan, letakkan hanya item yang boleh diubah pengguna
  2. Item tidak dikenal di luar spesifikasi jangan diabaikan; sebisa mungkin ditolak sebagai galat

Mengabaikan item tidak dikenal secara diam-diam dapat menyembunyikan bahwa serangan gagal, tetapi juga membuat kelalaian implementasi klien dan tanda serangan terlewat. Jika tidak ada alasan kompatibilitas, menolak dengan skema ketat lebih mudah diselidiki.

Otorisasi tingkat itemDTO pembaruan hanya memegang daftar izinkan, dan properti tidak dikenal ditolakvalidasi skemayatidakjalur khususDTO pembaruan (daftar izinkan)nameageBody permintaanhanya itemyang diizinkan?Perbarui name/age entitasKembalikan galatLayanan pembayarannotifikasi terverifikasiPerbarui status=paid

Gambar 8: Otorisasi tingkat item. Batasi item yang boleh diperbarui dengan daftar izinkan, dan ubah status penagihan lewat jalur lain.

status hanya diubah dari hasil pembayaran

status=paid bukan bagian profil pengguna. Itu keadaan yang diturunkan dari fakta sisi server bahwa pembayaran berhasil.

pembaruan profil pengguna
  -> hanya name / age yang boleh diubah

notifikasi terverifikasi dari layanan pembayaran
  -> cocokkan paymentId
  -> cegah pemrosesan ganda
  -> ubah status menjadi paid

Meski disimpan di kolom basis data yang sama, wewenang dan jalur perubahan terpisah. Jika entitas internal dipakai apa adanya sebagai tipe masukan API eksternal, batas ini hilang.

9. Soal 2(5) — tindakan brute-force adalah memegang jumlah kegagalan sebagai keadaan

Terhadap brute-force kode 4 digit, jawab pemrosesan yang masuk ke isian d pada tabel 5 dalam 30 karakter atau kurang. Ambangnya adalah 10.

Contoh jawabannya sebagai berikut.

Pemrosesan yang mengunci akun jika jumlah kegagalan beruntun melebihi ambang

Ini tidak bertentangan dengan stateless pada soal 1. Tidak memegang keadaan percakapan pemanggilan API sebagai sesi server, dan mengekalkan jumlah kegagalan yang diperlukan untuk keputusan keamanan, adalah hal yang berbeda.

Ada atau tidaknya batas jumlah percobaanTanpa batas, tembus rata-rata dalam 500 detik; batas jumlah kegagalan menekan kecepatan seranganAda bataskecepatan serangan jatuh tajamAkun terkunciKunci setelah 10 kegagalanPenundaan bertahapTanpa batassekitar 500 detikAutentikasi berhasil10 percobaan per detik

Gambar 10: Ada atau tidaknya batas jumlah. Batas jumlah kegagalan membuat brute-force praktis terhenti.

Dalam praktik, jangan hanya “kunci permanen”

Batas jumlah per akun diperlukan, tetapi jika penyerang mengetahui ID pengguna orang lain, 10 kegagalan sengaja dapat mengunci pengguna sah. Karena itu, dalam praktik gabungkan hal berikut.

Pengendalian Peran
Jumlah kegagalan per akun Menghentikan brute-force ke satu akun
Waktu tunggu bertahap Mengizinkan salah ketik pengguna sah sambil menurunkan kecepatan serangan
Pengendalian sumber IP, perangkat, ASN, dan sejenisnya Menekan serangan yang mencoba sedikit kali ke banyak akun
Penilaian berbasis risiko Membatasi lebih ketat wilayah, perangkat, atau kecepatan yang tidak biasa
Notifikasi ke pengguna Agar serangan atau salah operasi dapat disadari
Prosedur pemulihan yang aman Agar saluran membuka kunci tidak menjadi jalur serangan

Selain itu, jangan mengembalikan jumlah kegagalan ke 0 saat kode dikirim ulang. Jika tidak, setiap kali penyerang memanggil API kirim ulang, kuota percobaan hidup kembali. NIST SP 800-63B yang berlaku juga menuntut agar jumlah kegagalan tidak direset meski rahasia autentikasi baru dibuat.4

Buat kode autentikasi hanya dapat dipakai sekali

Dalam naskah soal, yang menjadi pusat adalah masa berlaku, tetapi dalam praktik hal berikut juga diperlukan.

  • Invalidasi segera kode yang berhasil
  • Tolak pemakaian ulang kode yang sama
  • Jangan menyisakan kode itu sendiri di log
  • Buat respons yang tidak memungkinkan menebak ada tidaknya pengguna dari berhasil/gagalnya pencocokan kode
  • Pasang juga batas jumlah pada API pengiriman kode

Selama rahasia pendek dipakai, keamanan tidak bisa diserahkan hanya pada pembangkitan acak.

Tindakan kode autentikasiSelain jumlah digit dan waktu kedaluwarsa, lindungi dengan batas percobaan, tolak pemakaian ulang, notifikasi, dan sejenisnyaKode autentikasiTambah jumlah digitPerpendek masa berlakuBatas jumlah percobaanInvalidasi setelah berhasilJangan reset jumlah kegagalan saat kirim ulangJangan sisakan kode di logPengendalian per sumber

Gambar 11: Tindakan kode autentikasi. Gabungkan pengendalian percobaan dan operasional, bukan hanya jumlah digit dan waktu kedaluwarsa.

10. Membedakan empat butir soal 2 dalam satu lembar

Argumen yang mudah tertukar pada soal 2 disusun menurut nilai yang dikendalikan penyerang.

Serangan Nilai yang diubah penyerang Tempat yang tidak boleh dipercaya Tindakan akar
Pemalsuan JWT alg header JWT, ID pengguna pada payload Algoritme verifikasi yang dinyatakan token sendiri Tetapkan algoritme yang diizinkan di sisi server
Pengambilan informasi orang lain mid permintaan ID sasaran yang ditentukan klien Cocokkan dengan subjek JWT, atau tentukan ID sasaran dari JWT
Perubahan menjadi pengguna berbayar status di luar spesifikasi Semua properti yang diikat otomatis Jadikan properti yang boleh diperbarui sebagai daftar izinkan
Tembus kode 4 digit Kandidat otp Percobaan autentikasi tanpa batas Masukkan batas jumlah kegagalan, penundaan, penilaian risiko

Penting untuk tidak merangkum semuanya sebagai “validasi nilai masukan”.

  • alg adalah kebijakan pemrosesan kriptografi
  • mid adalah otorisasi tingkat objek
  • status adalah otorisasi tingkat properti
  • otp adalah ketahanan terhadap tebakan daring

Meski ada dalam permintaan HTTP yang sama, alasan melindunginya berbeda.

11. Soal 3(1) — mengonfirmasi eksekusi kode eksternal tanpa merusak

Setelah layanan dimulai, kerentanan serius V diumumkan pada pustaka sumber terbuka H yang dipakai luas. Alur naskah soal sebagai berikut.

  1. Penyerang mengirim string yang berisi JNDI Lookup di header HTTP
  2. Server sasaran menuliskan nilai itu ke log
  3. Pustaka yang rentan mengevaluasi JNDI Lookup dan menanyakan server LDAP penyerang
  4. Respons LDAP mengembalikan URL server HTTP penyerang
  5. Server sasaran mengambil berkas kelas dan mengeksekusi perintah

Ini dapat dibaca sebagai serangan tipe Log4Shell (CVE-2021-44228) dengan nama produk disembunyikan. Penjelasan Apache juga menyebutnya kerentanan yang, jika penyerang dapat mengendalikan pesan log atau parameter, memungkinkan eksekusi kode sembarang yang dimuat dari server LDAP.9

Alur konfirmasi kerentanan tipe Log4ShellMengonfirmasi apakah rantai dari JNDI sampai eksekusi kode eksternal tembus dengan callback yang tidak merusaksuntik jndi:ldap://...ke x-api-versionJNDI Lookuprespons URL HTTPcatat GETkonfirmasi sampaiPenyerangServer yang rentanPemrosesan logServer LDAP yang disalahgunakanServer HTTP yang disalahgunakanindex.htmlLog aksesserver ujiKonfirmasi kerentanan

Gambar 12: Alur konfirmasi kerentanan tipe Log4Shell. Bukan perintah merusak, melainkan konfirmasi sampai lewat catatan akses HTTP.

Kode verifikasi hanya memicu akses HTTP yang tidak merusak

Perusahaan G menjalankan kode verifikasi yang tidak memengaruhi sistem, untuk mengonfirmasi apakah kerentanan V dapat disalahgunakan dari luar. Perintah yang dilakukan kode verifikasi hanyalah mengambil index.html pada server uji.

Soal 3(1) menanyakan apa yang harus diimplementasikan pada server uji agar dapat dikonfirmasi bahwa perintah telah dieksekusi.

Contoh jawabannya sebagai berikut.

Mekanisme yang mencatat dan mengonfirmasi akses ke index.html pada server uji

Jika GET dari server sasaran tersisa di log akses server web, setidaknya rantai berikut dapat dikonfirmasi sudah tembus.

permintaan HTTP eksternal
  -> pemrosesan log
  -> JNDI Lookup
  -> respons LDAP
  -> pengambilan kelas
  -> eksekusi perintah verifikasi
  -> akses HTTP ke server uji

Mengapa “menampilkan teks di layar” tidak cukup

Sasarannya adalah server. Perubahan pada layar peramban pengguna tidak selalu muncul. Selain itu, meski kerentanan ada, komunikasi keluar di tengah jalan dapat terhenti di firewall.

Mencatat akses di sisi server uji menjadi bukti yang dapat diamati bahwa server sasaran mencapai luar.

Ketika verifikasi sejenis dilakukan dalam praktik, selalu patuhi hal berikut.

  • Dapatkan persetujuan eksplisit dari pemilik sistem sasaran
  • Jadikan metode verifikasi yang tidak memengaruhi produksi, atau yang dampaknya dapat diterima
  • Jangan memakai perintah merusak seperti tulis, hapus, atau ubah konfigurasi
  • Kelola domain dan server verifikasi di perusahaan sendiri
  • Catat waktu verifikasi, sumber, sasaran, dan callback yang diharapkan
  • Setelah verifikasi, cabut server LDAP/HTTP sementara dan kredensial

“Mengonfirmasi eksekusi kode sembarang” dan “mengeksekusi kode berbahaya sembarang” tidak sama. Jadikan efek samping seminimal mungkin yang memenuhi tujuan.

12. Soal 3(2)(3) — WAF memeriksa header HTTP

WAF layanan N dapat memilih sasaran pemeriksaan GET, POST, PUT, ANY, Header, COOKIE, Multipart.

Kode serangan masuk ke nilai header HTTP bernama x-api-version. Karena itu, isian e dan f pada tabel 6 keduanya Header.

Pasangkan tempat yang tertulis di naskah langsung ke sasaran pemeriksaan WAF

Ini soal membaca alur data naskah, bukan pengetahuan umum.

tempat string serangan:
  header x-api-version
          |
          v
sasaran pemeriksaan WAF:
  Header

Bukan parameter GET maupun body POST. Jangan melihat daftar kemampuan WAF lalu memilih “ANY karena terasa seperti serangan”; jawab tempat penyerang memasukkan nilai dalam naskah soal.

Menangani pertukaran huruf besar dan kecil

Rancangan awal, secara konseptual, adalah aturan berikut.

Header  \Wjndi\W  blokir
Header  \Wldap\W  blokir

Namun, menukar huruf besar/kecil seperti jNdI dapat menghindari pola huruf kecil saja.

Contoh jawaban soal 3(3) adalah salah satu dari berikut.

\W[jJ][nN][dD][iI]\W
\W(j|J)(n|N)(d|D)(i|I)\W

Pada buku soal, backslash kadang tampak seperti tanda yen pada bentuk huruf lingkungan Jepang, tetapi sebagai regex itu \W. \W cocok dengan karakter selain alfanumerik dan garis bawah. Pada sintaksis JNDI Lookup, karakter non-kata seperti ${ atau : muncul sebelum dan sesudah jndi, jadi itu ikut dilihat.

Dengan cara pikir yang sama, sisi ldap juga dapat diubah agar mengabaikan huruf besar/kecil.

\W[lL][dD][aA][pP]\W

Jangan menganggap regex ini “tindakan Log4Shell yang lengkap”

Ujian meminta regex yang menangani cara penghindaran yang ditunjukkan naskah. Dalam serangan nyata, pemisahan string, Lookup lain, pengodean, protokol lain, dan sejenisnya dapat muncul dalam bentuk yang sulit diliput hanya dengan tanda tangan.

Karena itu, posisi dalam praktik adalah sebagai berikut.

  1. Hentikan sementara pola serangan yang sudah diketahui dengan WAF
  2. Periksa apakah pustaka yang terdampak benar-benar termasuk
  3. Batasi komunikasi LDAP, RMI, dan HTTP keluar yang tidak perlu
  4. Perbarui ke versi perbaikan
  5. Setelah pembaruan, periksa log dan selidiki ada tidaknya pelanggaran

WAF adalah lapisan untuk membeli waktu sampai versi perbaikan terbit.

Posisi WAFWAF adalah lapisan mitigasi sementara; tindakan akar adalah memperbarui pustaka ke versi perbaikanaturan WAFdeteksi/pemblokiranbatas komunikasi keluarPengumuman kerentanan seriusKonfirmasi dampakMitigasi sementaraHentikan sementara pola seranganTutup jalur penyalahgunaanPerbarui ke pustaka versi perbaikanKonfirmasi pasca-insiden dan pencegahan berulang

Gambar 13: Posisi WAF. WAF membeli waktu sampai versi perbaikan terbit; tindakan akar adalah pembaruan.

13. Soal 3(4) — alasan memakai “deteksi” lebih dulu

Tentang aturan WAF setelah perubahan, Z, spesialis keamanan terdaftar, menyarankan agar selama jangka waktu tertentu setelah operasi produksi dimulai, operasi diatur ke “deteksi” bukan “pemblokiran”.

Soal menanyakan keuntungan mengatur ke deteksi, dan isi yang harus dilakukan untuk meminimalkan kerugian, masing-masing dalam 25 karakter atau kurang.

Contoh jawaban sebagai berikut.

Butir Pokok jawaban
Keuntungan Dapat mencegah pemblokiran akibat deteksi keliru
Isi yang harus dilakukan Setelah peringatan diterima, telaah apakah itu serangan

Mode deteksi bukan “mode tidak berbuat apa-apa”

Pada mode deteksi, komunikasi yang cocok dengan aturan tetap dilewatkan, sambil dicatat ke log dan mengeluarkan peringatan. Meski string jndi atau ldap kebetulan masuk ke pemanggilan API yang sah, bisnis tidak langsung dihentikan.

Sebagai gantinya, sisi operasi memerlukan hal berikut.

peringatan diterima
   |
   v
konfirmasi permintaan sasaran
   |
   +-- komunikasi sah -> persempit aturan, pertimbangkan syarat pengecualian
   |
   +-- serangan     -> isolasi sasaran, amankan log, selidiki dampak, ke pemblokiran

Jika tidak ada yang melihat peringatan, mode deteksi tidak punya efek pertahanan. Deteksi adalah satu paket dengan operasi mengamati lalu memutuskan.

Alur pindah dari deteksi ke pemblokiran

Langkah pengenalan umum sebagai berikut.

  1. Terapkan ke lalu lintas nyata dalam mode deteksi
  2. Klasifikasikan deteksi keliru dan deteksi benar
  3. Sesuaikan header sasaran, jalur, API, batas karakter, dan sejenisnya
  4. Konfirmasi bahwa dampak pada komunikasi sah dapat diterima
  5. Pindah ke mode pemblokiran
  6. Pantau jumlah pemblokiran dan dampak bisnis

Namun, ini prinsip pada masa damai. Jika kerentanannya serius, sedang disalahgunakan, dan tidak ada sarana pengganti, ada juga keputusan untuk memblokir dari awal karena kerugian pelanggaran dinilai lebih besar daripada henti akibat deteksi keliru. Dalam situasi ujian, deteksi dipilih lebih dulu untuk mengonfirmasi apakah layanan dapat dipakai seperti sebelumnya.

Dari deteksi WAF ke pemblokiranAmati peringatan pada mode deteksi, sesuaikan deteksi keliru, lalu pindah ke mode pemblokiranlalu lintas nyatadeteksi keliruseranganMode deteksiPeringatan terjadiserangan ataudeteksi keliru?Sesuaikan aturanKe mode pemblokiranPantau jumlah pemblokiran dan dampak bisnis

Gambar 14: Dari deteksi ke pemblokiran. Amati dan sesuaikan lebih dulu, konfirmasi dampak dapat diterima, lalu pindah ke pemblokiran.

14. WAF adalah tindakan sementara, pembaruan adalah tindakan akar

Dalam naskah soal, situs resmi pustaka H belum punya versi perbaikan maupun tindakan sementara, dan aturan WAF menyeluruh dari penyedia cloud memakan waktu hingga 72 jam. Karena itu perusahaan G sendiri mengonfirmasi dampak, dan setidaknya menahan sementara pola yang sudah diketahui.

Urutan ini adalah bentuk dasar penanganan insiden.

Tahap Tujuan Penanganan dalam soal ini
Konfirmasi dampak Memutuskan apakah perusahaan benar-benar dalam bahaya Konfirmasi apakah penyalahgunaan dari luar mungkin, lewat callback yang tidak merusak
Mitigasi sementara Membeli waktu sampai perbaikan Aturan WAF, deteksi/pemblokiran, batas komunikasi keluar
Perbaikan akar Menghilangkan penyebab yang rentan Perbarui ke pustaka versi perbaikan
Konfirmasi pasca-insiden Menyelidiki apakah sudah disalahgunakan Penyelidikan log WAF, aplikasi, DNS, proksi, dan sejenisnya
Pencegahan berulang Mempercepat keputusan berikutnya Inventaris dependensi, SBOM, prosedur pembaruan, jalur kontak

“Tidak tahu apakah dipakai” menjadi penundaan terbesar

Dalam naskah soal, meski perusahaan G menanyakan perusahaan F apakah pustaka H dipakai, analisis konfigurasi rinci diperlukan sehingga jawaban memakan waktu.

Dalam praktik, jika pencarian berkas JAR baru dimulai setelah pengumuman kerentanan serius, penanganan terlambat. Setidaknya hal berikut harus dimiliki sejak masa damai.

  • Daftar dependensi langsung dan transitif
  • Komponen dan versi yang benar-benar termasuk dalam artefak distribusi
  • Layanan, kontainer, atau perangkat mana yang dideploy
  • Prosedur memperbarui pustaka dependen lalu membangun dan mendistribusikan ulang
  • Jalur kontak untuk menyetujui perubahan darurat
  • Tujuan komunikasi keluar yang diizinkan, dan dampak jika dihentikan
  • Tempat penyimpanan log dan cara pencarian

SBOM bukan tujuan. Itu indeks untuk menjawab dalam waktu singkat: kerentanan ini memengaruhi sistem berjalan yang mana.

Jangan mengakhiri penyelidikan hanya karena sudah diperbarui

Ada kemungkinan serangan sudah terjadi sebelum dan sesudah pengumuman kerentanan. Memperbarui ke versi perbaikan menghentikan penyalahgunaan ke depan, tetapi kredensial yang sudah dilanggar atau backdoor yang dipasang tidak hilang.

Untuk tipe Log4Shell, setidaknya selidiki sudut pandang berikut.

  • Permintaan HTTP yang berisi string mencurigakan yang menunjukkan JNDI atau LDAP
  • Komunikasi dari server aplikasi ke LDAP, RMI, HTTP eksternal
  • Peluncuran proses anak yang tidak biasa
  • Pembuatan JAR, class, skrip, atau berkas eksekusi yang mencurigakan
  • Akses ke kredensial cloud atau variabel lingkungan
  • Perubahan autentikasi/wewenang dan pengiriman ke luar sebelum dan sesudah pembaruan

Penting untuk tidak menyatakan “tidak diserang” hanya dari log WAF. Ada jalur internal yang tidak lewat WAF, dan log yang tidak tersimpan di masa lalu.

15. Cara membaca agar lebih mudah mendapat nilai di ujian

Soal ini lebih merupakan soal membaca selisih spesifikasi dan implementasi, bukan soal pengetahuan.

15.1 Pisahkan “spesifikasi” dan “implementasi” pada tabel

Pada masalah status, nilai yang tidak ada di spesifikasi API lolos di implementasi.

spesifikasi:
  mid / name / age

implementasi:
  semua parameter yang diterima dikirim ke P

Jika selisih ini terlihat, isian c terlihat sebagai modul bersama P.

15.2 Garis bawahi nilai yang diubah penyerang

Nilai yang diubah pada tiap serangan adalah sebagai berikut.

  • alg pada header JWT
  • ID pengguna pada payload JWT
  • mid pada parameter API
  • status di luar spesifikasi
  • otp pada API autentikasi
  • x-api-version pada header HTTP

Hampir semua soal menanyakan “di mana nilai itu seharusnya diverifikasi”.

15.3 Kembalikan jawaban ke istilah naskah soal

Dalam praktik boleh menyebut “BOLA”, “Mass Assignment”, “rate limiting”. Namun yang diminta soal adalah pemrosesan konkret yang selaras dengan susunan naskah.

Contoh buruk:

Melakukan otorisasi dengan tepat.

Contoh baik:

Memverifikasi apakah ID pengguna di dalam JWT cocok dengan nilai mid.

Contoh buruk:

Melakukan tindakan brute-force.

Contoh baik:

Mengunci akun jika jumlah kegagalan beruntun melebihi ambang.

Hanya mengetahui nama abstrak tidak menjadi jawaban yang dapat dinilai dalam batas karakter.

15.4 WAF: telusuri “ke mana dimasukkan”

Sasaran pemeriksaan WAF ditentukan dari tempat penyimpanan string serangan, bukan ditebak dari jenis serangan.

dimasukkan ke header x-api-version
        ↓
sasaran pemeriksaan adalah Header

Tingkat jawaban benar soal 3(1) agak rendah di komentar penilaian juga karena banyak jawaban yang tidak cocok dengan alur serangan pada gambar 6. Hanya menulis ulang prosedur serangan dengan panah sudah membuat terlihat apa yang harus diamati.

16. Daftar periksa yang dapat dipakai pada tinjauan API praktis

Daftar periksa untuk membawa soal ini ke tinjauan rancangan dan kode yang nyata.

Verifikasi JWT

  • Algoritme tanda tangan yang diizinkan ditetapkan di konfigurasi server
  • none dan algoritme di luar harapan ditolak
  • Tanda tangan, iss, aud, exp, nbf diverifikasi sesuai penggunaan
  • ID token, access token, dan refresh token tidak tertukar
  • Ada prosedur rotasi kunci dan pencabutan
  • Informasi yang harus dirahasiakan tidak dimasukkan ke payload JWT

Otorisasi tingkat objek

  • Mengubah ID dalam permintaan tidak sampai ke data orang lain
  • Otorisasi dilakukan pada daftar, rincian, pembaruan, penghapusan, dan unduhan
  • Otorisasi dilaksanakan di lapisan bersama yang mencapai data, bukan di layar
  • Pada API khusus diri sendiri, sudah dipertimbangkan apakah ID sasaran dapat diturunkan dari token
  • Operasi administrator dipisah kebijakannya dari API pengguna umum

Otorisasi tingkat properti

  • Tipe masukan eksternal dan entitas basis data dipisah
  • Item yang boleh diperbarui dienumerasi dengan daftar izinkan
  • Properti di luar spesifikasi ditolak atau diaudit
  • Keadaan seperti wewenang, penagihan, persetujuan, pemilik tidak dapat diubah dari masukan pengguna
  • Respons tidak menyertakan properti rahasia yang tidak perlu

Percobaan autentikasi

  • Ada batas jumlah kegagalan per akun
  • Ada penundaan bertahap atau pengendalian per sumber
  • Jumlah kegagalan tidak direset saat kode diterbitkan ulang
  • Kode autentikasi hanya dapat dipakai sekali
  • Kode autentikasi atau kata sandi tidak disisakan di log
  • Prosedur buka kunci dan pemulihan tidak menjadi jalur autentikasi lemah lain

Kerentanan pustaka dependen yang serius

  • Layanan yang berjalan dapat dipasangkan dengan versi dependen
  • Ada prosedur memverifikasi dampak dengan cara yang tidak merusak
  • Tindakan sementara seperti WAF atau batas komunikasi keluar dapat diterapkan
  • Ada operasi petugas yang mengonfirmasi peringatan deteksi
  • Ada jalur rilis darurat untuk memperbarui ke versi perbaikan
  • Kemungkinan penyalahgunaan sebelum pembaruan diselidiki dari log

17. Dua sisi komponen bersama yang terlihat dari soal ini

Dalam soal ini muncul dua komponen bersama: pustaka pengelolaan JWT Q dan modul bersama P.

Komponen bersama punya keuntungan besar.

  • Memperbaiki satu tempat dapat menerapkan perbaikan ke semua API yang memakainya
  • Implementasi otorisasi dan verifikasi tidak perlu diduplikasi ke tiap fitur
  • Sasaran pengujian dapat dikumpulkan
  • Format log dan audit dapat diseragamkan

Di sisi lain, kesalahan juga menyebar ke seluruhnya.

  • Jika pustaka Q menerima alg=none, semua API yang memakai JWT menjadi berbahaya
  • Jika modul bersama P menerima mid atau status sembarang, GET dan PUT keduanya menjadi berbahaya
  • Jika pustaka H yang rentan dipakai di fondasi, beberapa jalur yang menuliskan header HTTP ke log menjadi permukaan serangan

Karena itu, yang harus dikumpulkan bukan sekadar akses data. Kumpulkan invarians keamanan, dan verifikasi komponen bersama itu secara ketat secara terpisah.

Misalnya, buat kontrak P sebagai berikut.

P.getOwnUser(authenticatedSubject)
P.updateOwnProfile(authenticatedSubject, ProfileUpdate{name, age})

Lebih aman untuk tidak mengekspos API tingkat rendah seperti berikut apa adanya ke pemanggil umum.

P.getUser(arbitraryMid)
P.updateUser(arbitraryMap)

Yang terakhir hanya diperlukan pada jalur terbatas seperti pemrosesan administratif. Jika kebebasan tingkat rendah dibagikan ke semua API, rancangannya mengharapkan tiap pemanggil memakainya dengan benar setiap kali.

18. Ringkasan

Soal 1 sesi sore musim semi tahun anggaran Reiwa 6 adalah soal yang membaca topik keamanan API dengan memisahkannya satu per satu.

Memakai JWT tidak berarti autentikasi yang aman. Jika algoritme tanda tangan dibiarkan dipilih penyerang, ID pengguna dapat ditulis ulang.

Tanda tangan JWT yang benar tidak berarti otorisasi yang benar. Jika mid permintaan dipercaya, pengguna sah dapat mengakses informasi orang lain.

Bisa memperbarui objek sendiri tidak berarti semua properti boleh diubah. Jika keadaan internal seperti status diikat otomatis, wewenang atau status penagihan dapat ditulis ulang.

Adanya masa berlaku pada kode autentikasi tidak berarti tahan brute-force. Hitung jumlah kandidat dan kecepatan percobaan, lalu batasi jumlah kegagalan.

Memasukkan aturan ke WAF tidak berarti kerentanan sudah diperbaiki. Beli waktu dengan deteksi dan pemblokiran, konfirmasi dampak, dan pada akhirnya perbarui pustaka.

Tabel korespondensi kerentanan dan tindakanMemasangkan tiap kerentanan dengan batas kepercayaan dan tindakannyaverifikasi tokenotorisasi tingkat objekotorisasi tingkat propertipengendalian percobaan autentikasidari masukan ke eksekusiPemalsuan JWTTetapkan algoritme yang diizinkanPenukaran midCocokkan subjek JWT / mid tidak perlustatus=paidJadikan DTO pembaruan daftar izinkanBrute-force kode 4 digitBatas jumlah kegagalan / penundaanKerentanan tipe Log4ShellPembaruan pustaka / WAF

Gambar 15: Tabel korespondensi kerentanan dan tindakan. Pisahkan tindakan menurut batas yang dilanggar.

Prinsip yang menembus soal ini hanya satu.

Jangan menjadikan keberhasilan verifikasi sebelumnya sebagai alasan untuk melewatkan batas kepercayaan berikutnya.

Artikel sebelumnya dalam seri ini membahas XSS tersimpan pada soal 1 sesi sore musim gugur Reiwa 5 dan pembawaan informasi dari Wi-Fi tamu pada soal 2 sesi sore musim gugur Reiwa 5. Untuk sudut pandang konfirmasi seluruh situs web, lihat juga Memakai “Cara membuat situs web yang aman” IPA sebagai daftar periksa.

Ringkasan akhirMenunjukkan bahwa keberhasilan verifikasi sebelumnya tidak boleh menjadi alasan untuk melewatkan batas kepercayaan berikutnyaAutentikasi berhasilVerifikasi tanda tangan JWTOtorisasi tingkat objekOtorisasi tingkat propertiBatas jumlah percobaanBatas dari masukan ke eksekusiWAF / pembaruan pustaka

Gambar 16: Ringkasan akhir. Batas kepercayaan dikonfirmasi bertahap, dan tidak satu pun boleh dilewatkan.

Tautan referensi

  1. IPA, Buku soal sesi sore ujian Registered Information Security Specialist musim semi tahun anggaran Reiwa 6. Naskah soal yang dibahas artikel ini. ↩

  2. IPA, Contoh jawaban sesi sore ujian Registered Information Security Specialist musim semi tahun anggaran Reiwa 6. Contoh jawaban resmi tiap soal. ↩

  3. IPA, Komentar penilaian sesi sore ujian Registered Information Security Specialist musim semi tahun anggaran Reiwa 6. Penjelasan tingkat jawaban benar dan kecenderungan salah. ↩

  4. NIST, SP 800-63B: Authentication and Authenticator Management. Menunjukkan jumlah digit rahasia jangka pendek, batas jumlah percobaan, jumlah kegagalan saat penerbitan ulang, dan agar email tidak dipakai untuk autentikasi out-of-band. ↩ ↩2

  5. RFC Editor, RFC 7519: JSON Web Token (JWT). Spesifikasi JWT termasuk Unsecured JWT dan alg=none. ↩

  6. RFC Editor, RFC 8725: JSON Web Token Best Current Practices. BCP yang menetapkan penetapan algoritme yang diizinkan, verifikasi penerbit, subjek, audience, dan sejenisnya. ↩

  7. OWASP, API1:2023 Broken Object Level Authorization. Menjelaskan kebutuhan mengonfirmasi otorisasi per ID objek yang ditentukan pengguna. ↩

  8. OWASP, API3:2023 Broken Object Property Level Authorization. Menjelaskan celah otorisasi tingkat properti termasuk Mass Assignment, beserta tindakannya. ↩

  9. Apache Logging Services, Security. Menjelaskan dampak CVE-2021-44228, eksekusi kode lewat JNDI dan LDAP, serta versi perbaikan. ↩

Artikel terbaru dengan tag yang sama untuk mendalami topik-topik terdekat.

Halaman-halaman ini menempatkan topik dalam konteks layanan dan keputusan yang lebih luas.

Artikel ini berkaitan langsung dengan layanan berikut.

Pertanyaan yang sering diajukan

Pertanyaan yang sering muncul dalam konsultasi tentang topik artikel ini.

Mengapa bisa menyamar sebagai orang lain padahal verifikasi tanda tangan JWT berhasil?
Dalam soal ini, pustaka pengelolaan JWT menerima alg pada header JWT persis seperti yang ditentukan penyerang, dan memperlakukan JWT dengan alg=none sebagai sah tanpa tanda tangan. Karena itu, menulis ulang ID pengguna di payload tetap lolos verifikasi. Jawaban ujian: objek verifikasi adalah alg pada header JWT, dan isinya adalah memastikan nilainya bukan NONE. Namun dalam praktik, menolak hanya NONE tidak cukup. Di konfigurasi sisi server, tetapkan algoritme yang diizinkan — misalnya RS256 — dan jangan memakai algoritme yang dideklarasikan token untuk memilih metode verifikasi. Selain itu, verifikasi juga issuer, audience, masa berlaku, subject, dan klaim lain sesuai penggunaan.
Apakah membandingkan ID pengguna di dalam JWT dengan mid permintaan sudah cukup sebagai tindakan otorisasi?
Sebagai jawaban soal ini, itu cukup. Jika modul bersama P memverifikasi bahwa ID pengguna di JWT cocok dengan mid, serangan yang menyebutkan mid orang lain dapat dihentikan. Namun, untuk API yang hanya menangani informasi diri sendiri, lebih aman dalam praktik untuk tidak menerima mid dari klien sama sekali, dan menentukan ID pengguna dari subject JWT yang sudah diverifikasi. Misalnya GET /users/me atau PUT /users/me membuat kelalaian implementasi perbandingan itu sendiri lebih sulit terjadi. API tempat administrator mengoperasikan pengguna lain dipisah ke endpoint dan kebijakan otorisasi tersendiri.
Mengapa serangan yang menambahkan status tidak bisa dicegah hanya dengan validasi nilai masukan biasa?
Karena meski panjang name atau rentang age divalidasi, itu tidak menolong jika status — yang seharusnya tidak diterima — diikat otomatis dan diteruskan ke objek internal. Masalahnya bukan format nilai, melainkan otorisasi tingkat properti: apakah pengguna boleh mengubah properti itu. Pada tipe masukan untuk pembaruan, definisikan hanya name dan age, dan tolak properti yang tidak dikenal. Status penagihan hanya boleh diubah dari peristiwa yang dipercaya server, misalnya hasil sukses dari layanan pembayaran.
Kode autentikasi 4 digit kedaluwarsa dalam 10 menit. Mengapa tetap berbahaya?
Karena kandidat dari 0000 sampai 9999 hanya 10.000, dan jika 10 percobaan per detik, rata-rata 5.000 percobaan — yaitu 500 detik — sudah cukup untuk mengenai. Masa berlaku 10 menit adalah 600 detik, jadi jika kandidat tanpa duplikat dicoba berurutan, 6.000 kandidat dapat diperiksa dalam masa berlaku. Waktu kedaluwarsa saja tidak menghentikan brute-force. Jumlah kandidat, kecepatan percobaan, dan batas jumlah percobaan harus dirancang bersama.
Tindakan pada soal adalah penguncian akun. Apakah dalam praktik cukup mengunci segera saja?
Tidak. Isian soal diisi dengan pemrosesan yang mengunci akun jika jumlah kegagalan beruntun melebihi ambang, tetapi kunci tetap yang permanen saja memungkinkan penyerang sengaja mengunci akun orang lain sebagai gangguan layanan. Dalam praktik, gabungkan hitungan kegagalan per akun, waktu tunggu bertahap, penilaian risiko sumber dan perangkat, notifikasi, dan prosedur pemulihan. Penting juga untuk tidak mengembalikan hitungan kegagalan ke nol saat kode baru diterbitkan.
Apa artinya mengatur WAF ke deteksi, bukan pemblokiran?
Artinya, meski string yang sah keliru dinilai sebagai serangan, komunikasi bisnis tidak perlu dihentikan. Dalam jawaban soal, keuntungannya adalah dapat mencegah pemblokiran akibat deteksi keliru, dan yang harus dilakukan adalah menelaah apakah itu serangan setelah peringatan diterima. Mode deteksi bukan pengaturan untuk dibiarkan. Mode ini dipakai sebagai masa observasi: memeriksa log, membuang deteksi keliru, menyesuaikan aturan, lalu pindah ke pemblokiran. Dalam keadaan darurat ketika kerentanan serius yang sudah diketahui sedang disalahgunakan, ada juga keputusan untuk memblokir lebih dulu setelah membandingkan dengan risiko ketersediaan.
Apakah pustaka H dalam soal ini Log4j?
Naskah soal menyembunyikan nama produk, tetapi alur serangan — JNDI Lookup, server LDAP, pengambilan kelas dari server HTTP, string yang disematkan di header HTTP, dan skor dasar CVSS v3.1 yang tinggi — secara alami dibaca sebagai abstraksi CVE-2021-44228 yang dikenal sebagai Log4Shell. Artikel ini menjelaskan korespondensi itu, tetapi ujian tidak mensyaratkan nama produk. Jawaban dapat disusun dari prosedur serangan dan spesifikasi WAF yang diberikan.
Apa yang harus dibawa ke praktik dari soal ini?
Bahwa autentikasi berhasil, JWT tidak diubah, objek sasaran boleh diakses, dan properti sasaran boleh diubah adalah pemeriksaan yang terpisah. Selain itu, kode autentikasi pendek memerlukan batas jumlah percobaan, dan pada kerentanan pustaka yang serius, konfirmasi dampak, pertahanan sementara, dan perbaikan akar dijalankan secara paralel. Inti praktisnya: mengumpulkan otorisasi ke komponen bersama, menjadikan skema masukan sebagai daftar izinkan, menetapkan syarat verifikasi JWT di sisi server, dan menjaga pustaka dependen dalam keadaan yang dapat diperbarui.

Profil penulis

Halaman perkenalan penulis artikel.

Go Komura

Direktur KomuraSoft LLC

Berspesialisasi dalam pengembangan perangkat lunak Windows, konsultasi teknis, dan investigasi bug, terutama pada proyek dengan sistem yang sudah ada dan bug yang sulit direproduksi.

Kembali ke blog