Mekanika Bug Bounty

Mekanika bug bounty: lingkup, disclosure, dan penulisan laporan yang menghasilkan imbalan.

Daftar isi

Program bug bounty membayar imbalan kepada pihak luar yang melaporkan kerentanan sesuai aturan yang ditetapkan pemilik sistem, sehingga temuan keamanan memiliki jalur resmi untuk dilaporkan dan dihargai. Topik ini membahas sisi mekaniknya, yaitu membaca lingkup program, menyusun struktur laporan, memeriksa kelengkapan laporan sebelum dikirim, dan menutupnya dengan alur responsible disclosure. Struktur laporan yang dipraktikkan di sini digunakan kembali pada modul Pengerjaan Proyek ketika hasil audit disusun menjadi laporan.

Lingkup program dan aturan main#

Setiap program bug bounty terbuka dengan halaman aturan yang menjadi sumber kebolehan sebelum satu permintaan pun dikirim. Halaman itu memuat aset dalam lingkup (in scope), aset di luar lingkup (out of scope), teknik yang dilarang, batas laju permintaan, dan tabel imbalan per tingkat keparahan. Laporan terhadap aset di luar lingkup umumnya ditolak, sedangkan pelanggaran teknik yang dilarang dapat menggugurkan seluruh hak imbalan.

Tabel berikut merangkum bagian halaman program yang paling menentukan.

Bagian programIsi yang lazim
Aset dalam lingkupDomain, aplikasi, dan endpoint yang boleh diuji
Aset di luar lingkupSistem pihak ketiga, subdomain yang belum dinyatakan, dan infrastruktur jaringan
Teknik yang dilarangPemindaian yang mengganggu, pengujian penolakan layanan, dan akses data milik pengguna lain
Tabel imbalanRentang imbalan per tingkat keparahan, dari rendah sampai kritis

Tabel di atas menunjukkan bahwa aturan program bukan pelengkap, melainkan batas kontrak. Aset yang terlihat menarik tetapi tidak tertulis pada daftar lingkup tetap dilarang, karena pemiliknya dapat berbeda dan izinnya belum diberikan. Apabila kepastian tidak ditemukan pada halaman program, pertanyaan diajukan ke kanal resmi program itu sebelum pengujian dimulai, bukan sesudah temuan terjadi.

Struktur laporan yang menghasilkan imbalan#

Laporan yang menghasilkan imbalan menyelesaikan satu tugas, yaitu membuat pemeriksa laporan (triager) dapat mereproduksi dan menilai temuan tanpa bertanya ulang. Tugas itu dicapai dengan enam bidang yang saling mengisi, yaitu judul yang menyebut jenis kerentanan dan lokasinya, ringkasan yang menyatakan masalah dalam satu paragraf, langkah reproduksi yang bernomor, bukti yang menunjang, dampak yang menjelaskan skenario penyalahgunaan, dan saran perbaikan yang menunjukkan arah pemecahannya.

Kerangka berikut menyusun keenam bidang tersebut dalam bentuk yang siap diisi.

markdown Kerangka laporan bug bounty
## Judul
Jenis kerentanan beserta lokasinya, misalnya XSS terpantul pada parameter q endpoint /cari.

## Ringkasan
Satu paragraf yang menyatakan apa yang cacat, pada kondisi apa, dan mengapa itu kerentanan.

## Langkah reproduksi
1. Kondisi awal, misalnya akun uji yang dipakai.
2. Permintaan yang dikirim, lengkap dengan parameter dan nilainya.
3. Respons yang membuktikan kerentanannya.

## Bukti
Keluaran permintaan dan respons minimum yang cukup untuk membuktikan temuan.

## Dampak
Skenario penyalahgunaan yang nyata untuk aplikasi yang bersangkutan, tanpa dramatisasi.

## Saran perbaikan
Perbaikan teknis yang diusulkan beserta alasannya.

Langkah reproduksi adalah bidang yang paling sering menentukan nasib laporan. Pemeriksa yang gagal mereproduksi dalam beberapa menit akan menurunkan prioritas laporan atau menolaknya, sementara langkah bernomor yang lengkap dengan nilai parameter memangkas seluruh perdebatan. Dampak juga ditulis khusus untuk aplikasi yang bersangkutan, karena kalimat dampak generik yang berlaku untuk kerentanan apa pun terlihat seperti templat yang tidak dipikirkan. Judul yang menyebut jenis kerentanan beserta parameter dan endpointnya, misalnya, membuat laporan dapat disortir dan diprioritaskan tanpa harus dibuka lebih dahulu.

Pemeriksa kelengkapan laporan#

Kelengkapan bidang dapat diperiksa secara mekanis sebelum laporan dikirim. Skrip berikut menilai dua draf, yaitu satu draf cacat dan satu laporan lengkap, lalu menandai bidang yang kosong atau terlalu tipis. Jalankan dengan perintah python3 periksa-laporan.py.

python periksa-laporan.py
"""Pemeriksa kelengkapan laporan bug bounty.

Fungsi periksa() menerima satu draf laporan dalam bentuk kamus, lalu
menandai bidang yang kosong atau terlalu tipis sebelum laporan dikirim
ke program bug bounty. Skrip membandingkan satu draf cacat dengan satu
laporan lengkap agar perbedaan keputusannya terlihat."""

BIDANG = ("judul", "ringkasan", "langkah", "bukti", "dampak", "perbaikan")
MIN_KARAKTER = 40


def periksa(laporan):
    """Kembalikan daftar kecacatan laporan, kosong bila laporan lengkap."""
    kecacatan = []
    for bidang in BIDANG:
        isi = str(laporan.get(bidang, "")).strip()
        if not isi:
            kecacatan.append(f"  kosong  : {bidang}")
        elif len(isi) < MIN_KARAKTER:
            kecacatan.append(
                f"  tipis   : {bidang} ({len(isi)} karakter, minimal {MIN_KARAKTER})"
            )
    return kecacatan


DRAFT_CACAT = {
    "judul": "XSS terpantul pada kotak pencarian halaman katalog",
    "ringkasan": "Parameter q pada /cari memantulkan input tanpa pengodean HTML.",
    "langkah": "1. Buka /cari?q=<b>uji</b> 2. Amati responsnya",
    "bukti": "",
    "dampak": "Cookie bisa dicuri",
    "perbaikan": "",
}

LAPORAN_LENGKAP = {
    "judul": "XSS terpantul pada parameter q endpoint /cari",
    "ringkasan": "Endpoint /cari memantulkan nilai parameter q ke dalam HTML tanpa pengodean, sehingga skrip pihak ketiga berjalan pada konteks halaman.",
    "langkah": "1. Buka /cari?q=<b>uji</b> pada akun uji sendiri. 2. Perhatikan tag b dirender sebagai HTML pada judul hasil.",
    "bukti": "Tangkapan respons memuat <h1>Hasil pencarian: <b>uji</b></h1> tanpa pengodean.",
    "dampak": "Skrip arbitrer berjalan pada sesi korban, misalnya membaca isi halaman atau mengirim aksi atas nama pengguna.",
    "perbaikan": "Kodekan nilai q sesuai konteks keluaran HTML pada badan respons sebelum dirender.",
}


def tunjukkan(label, laporan):
    print(f"== {label} ==")
    print(f"judul  : {laporan.get('judul', '')}")
    kecacatan = periksa(laporan)
    if kecacatan:
        print(f"status : DITOLAK sementara, {len(kecacatan)} bidang perlu dilengkapi")
        for k in kecacatan:
            print(k)
    else:
        print("status : LOLOS, laporan siap dikirim")
    print()


tunjukkan("Laporan 1: draft cacat", DRAFT_CACAT)
tunjukkan("Laporan 2: laporan lengkap", LAPORAN_LENGKAP)
text Keluaran
== Laporan 1: draft cacat ==
judul  : XSS terpantul pada kotak pencarian halaman katalog
status : DITOLAK sementara, 3 bidang perlu dilengkapi
  kosong  : bukti
  tipis   : dampak (18 karakter, minimal 40)
  kosong  : perbaikan

== Laporan 2: laporan lengkap ==
judul  : XSS terpantul pada parameter q endpoint /cari
status : LOLOS, laporan siap dikirim

Draf cacat ditolak sementara karena bukti dan saran perbaikannya kosong, sedangkan bidang dampaknya hanya berupa klausa pendek yang belum menjelaskan skenario penyalahgunaan. Pemeriksaan semacam ini tidak menilai kebenaran temuan, tetapi menyaring kelalaian bentuk yang paling sering membuat laporan tertunda. Ambang minimal empat puluh karakter pada skrip hanyalah angka contoh, dan nilai ambang pada praktiknya disesuaikan dengan bidang yang dinilai.

Responsible disclosure dan etika imbalan#

Imbalan diterima dengan menaungi alur responsible disclosure, yaitu laporan dikirim melalui kanal resmi program, pemeriksa diberi waktu menilai dan memperbaiki, dan publikasi temuan menunggu kesepakatan. Laporan tidak disebar pada kanal publik untuk menekan pemilik sistem, karena tekanan semacam itu melanggar aturan program dan menggugurkan hak imbalannya. Komunikasi tetap terbuka sampai perbaikan diverifikasi ulang, dan setiap pertanyaan pemeriksa dijawab dengan bukti yang sudah dimiliki.

Etika imbalan juga mengatur cara menguji. Pengujian berhenti pada bukti kerentanan dan tidak melangkah ke pengambilan data milik pengguna lain, karena dampak dapat dinyatakan tanpa memperlihatkan isi datanya. Laporan duplikat dengan laporan lain biasanya dihargai lebih rendah atau tidak dihargai, sehingga memeriksa daftar temuan yang sudah dilaporkan menjadi kebiasaan sebelum menulis. Imbalan pada akhirnya menghargai temuan yang jelas, bukan jumlah laporan yang terkirim.

Kanal pelaporan resmi dapat berupa alamat surel khusus, platform program, atau berkas keamanan yang dipublikasikan domain. Kanal yang sama digunakan dari awal sampai akhir, mulai pengiriman, klarifikasi, sampai konfirmasi perbaikan, sehingga riwayatnya tersusun pada satu tempat. Kebiasaan kecil ini memangkas perdebatan apabila status sebuah laporan dipertanyakan di kemudian hari.

Kesalahan umum#

Empat kesalahan berikut paling sering menggagalkan laporan yang temuannya sebenarnya baik.

  • Mengirim laporan sebelum membaca aturan program. Aset yang diuji bisa berada di luar lingkup, dan seluruh kerja menjadi tidak dapat dihargai.
  • Menulis langkah reproduksi yang bergantung pada kondisi yang tidak dinyatakan. Pemeriksa perlu tahu akun, halaman awal, dan nilai parameter yang digunakan.
  • Menyertakan data milik pengguna lain sebagai bukti. Bukti cukup sampai kerentanannya terbukti, sedangkan datanya dipoles agar tidak mengungkap isi pribadi.
  • Menganggap diamnya program berarti laporan hilang. Jeda penilaian adalah hal biasa, dan tindak lanjut yang sopan diajukan melalui kanal yang sama.

Pola-pola tersebut berpangkal pada sudut pandang yang keliru, yaitu program bug bounty diperlakukan sebagai lomba kecepatan. Program sebenarnya adalah kerja sama yang berjalan sesuai kontrak tertulisnya, dan pihak yang membaca kontraknya dengan teliti justru lebih cepat sampai pada imbalan. Keteraturan proses, bukan kecepatan mengirim, yang membuat reputasi seorang pelapor bertahan.

Ringkasan#

  • Halaman aturan program menetapkan lingkup, teknik yang dilarang, dan tabel imbalan, sehingga kebolehan pengujian berangkat dari sana.
  • Laporan yang efektif memuat enam bidang, yaitu judul, ringkasan, langkah reproduksi, bukti, dampak, dan saran perbaikan, dengan langkah reproduksi sebagai penentu utama.
  • Kelengkapan bidang dapat diperiksa secara mekanis sebelum laporan dikirim.
  • Responsible disclosure menuntut kanal resmi, waktu perbaikan, dan kesepakatan publikasi, sedangkan pengujian berhenti pada bukti tanpa mengambil data milik orang lain.

Referensi#