security
Catatan teknis seputar web development, DevOps, dan integrasi AI.
52 artikel
- 05.30security
Jaringan Keamanan Mekanis yang Dirancang untuk Diam
Hook rahasia yang membedakan temuan dari error, CI yang mengumpulkan temuan tanpa merahkan build, dan ZAP mingguan yang skip dengan rapi.
TL;DR: Hook gitleaks suka bikin commit gagal cuma gara-gara error lingkungan, bukan bocoran beneran. Solusinya: blokir cuma kalau exit 1 plus laporan JSON valid, sisanya cukup peringatan. CI dan ZAP mingguan juga kalem, cuma ngumpulin temuan buat direview, nggak asal bikin build merah tanpa bukti nyata.
#security#gitleaks#github-actions - 01.30security
Ketika Server Fail-Closed, Antarmuka Pun Harus Jujur
Server menolak unggahan bebas dari editor ter-scope, tetapi tombolnya tetap ditawarkan. Gate antarmuka menertibkan affordance; penegakan tetap di server.
TL;DR: Jadi gini, editor yang cuma punya akses terbatas masih bisa lihat tombol upload media, padahal pasti kena 403 karena server emang cuma izinin admin-global. Server-nya sih udah aman fail-closed, masalahnya di UI, jadi tombolnya disembunyiin pakai gerbang canManageModule, niru pola canUploadFree. Intinya UI cuma cerminan aturan server, bukan penegak keamanan beneran.
#rbac#react#ux - 01.30security
Menjaga Isi, Bukan Wadah: Guard Dua Arah Rebind Media
Guard menjaga entitas tujuan tetapi melewatkan id media sumber; setelah rebind, mengelola media orang lain jadi sah. Perbaikannya: guard sebelum mutasi.
TL;DR: Jadi ada editor yang bisa "mencuri" media punya entitas lain pas rebind galeri, soalnya endpoint cuma ngecek tujuan, nggak cek asal media-nya. Perbaikannya: tiap media dicek kepemilikan modulnya dalam satu kueri, ditolak 403 sebelum nulis apa-apa, plus uji regresi merah-hijau. Modul pengumuman juga ketahuan kena celah serupa, jadi penjagaan cakupan wajib dipanggil di semua jalur tulis.
#security#rbac#idor - 00.15security
Implementasi Jejak Audit Best Effort pada CMS KotaPortal
Tabel audit_logs append-only ditulis setelah mutasi sukses, tahan penghapusan akun, dan tidak pernah menggagalkan request bisnis.
TL;DR: Audit trail di CMS itu penting karena cuma andelin kolom updated_at, jadi nggak jelas siapa yang ubah data. Solusinya bikin tabel audit_logs append-only yang dicatet tiap kali mutasi sukses, tanpa foreign key ke tabel user biar jejaknya tetap kebaca walau akun dihapus. Best effort banget, gagal nulis log cuma jadi warning, nggak bikin aplikasi tumbang.
#audit-log#go#mysql - 00.13security
Keputusan ZAP di Baris Selesai
Papan selesai kini menuntut satu token keputusan ZAP per baris: rescan dengan path bukti atau none dengan alasan tertulis.
TL;DR: Jadi begini, nge-scan pasif ZAP berulang buat tiap kartu selesai itu nggak ngebuktiin apa-apa. Solusinya, board validator sekarang mewajibkan token keputusan: ZAP:rescan plus path laporan, atau ZAP:none plus alasan tertulis. Hasilnya, utang keamanan jadi kelihatan, bisa ditrack, dan review fokus ngecek isi keputusan, bukan scan yang hasilnya sama terus.
#security#owasp#zap - 23.28security
Body Error yang Mengulang Input Anda
Pesan kesalahan API yang memantulkan nilai input pengirim adalah kanal rekonesans murah. Pola perbaikan: kode spesifik, detail statis.
TL;DR: Jadi API admin KotaPortal ternyata mantulin input user di pesan error, jadi deh jalan tol buat nyoba injeksi. Fixnya gampang: kode error dibikin statis kayak FORBIDDEN, interpolasi inputnya dibuang semua. Terus tiap endpoint dikasih tes regresi pake nilai probe, kalau masih muncul di body respons berarti belum beres.
#api#security#http - 13.50backend
Dari Buffer Penuh ke Streaming di Endpoint Unggahan
Lima slot dikali 10 MiB per permintaan adalah undangan DoS. Rate limit per pengguna plus streaming multipart menurunkan memori ke sekitar 1 MiB.
TL;DR: Handler lama nampung semua unggahan di RAM, jadi satu request bisa makan 50 MiB dan 100 pemakai serentak bikin 5 GiB. Turunin batas ukuran doang nggak nolong, memori per request dan frekuensi request itu beda masalah. Jadi dipasang rate limit 30 per menit plus streaming: cuma 1 MiB di RAM, sisanya ke disk, file dialirkan, akhirnya ~1 MiB per request.
#go#security#upload - 03.45tooling
Auditor Pakai Penggaris yang Sama dengan Gerbang
Laporan audit menuduh delapan commit dokumen tanpa trailer; semuanya false positive. Satu baris filter menyelaraskan kebijakan auditor dengan gerbang.
TL;DR: Laporan audit nandain 19 commit tanpa trailer Security-review, tapi 8 di antaranya cuma file QA atau screenshot yang emang dikecualikan gerbang commit. Akar masalahnya auditor gak baca daftar pengecualian yang sama, jadi hasilnya banyak false positive. Fixnya cuma satu baris filter git show, dan tes nomor 18 jadi hijau semua.
#git#bash#testing - 03.42security
Audit yang Hanya Membaca: Setengah Gerbang yang Sering Hilang
Gerbang commit menolak pesan tanpa trailer dalam sekejap, tapi konfigurasi di baliknya bisa drift diam-diam. Sapuan audit baca-saja menutup celah itu.
TL;DR: Gates commit di KotaPortal nolak kode tanpa trailer Security-review, tapi hook-nya bisa lepas diam-diam gara-gara bit executable ilang atau core.hooksPath pindah. Solusinya subkomando audit di review_gate.sh yang nyapu empat jalur, selalu exit 0, dan ngecek registrasi hook biar nggak dianggap pipeline gagal. Gerbang itu pencegah, audit itu detektif; yang ngawasin gerbang ya gerbang kedua ini.
#git#bash#security