Model Ancaman & Self-Attestation OWASP ASVS L1
Ancaman yang dirancang untuk dikalahkan oleh Vaulted, ancaman yang tidak, dan attestasi per kontrol terhadap baseline industri.
Versi 1.0 · Diterbitkan 2026-04-27 · Sumber: main · Penulis: Maxim Novak
Tentang dokumen ini
Ini adalah self-attestation, bukan audit pihak ketiga. Dokumen ini ada agar kamu dapat melihat dengan tepat apa yang diklaim dilindungi oleh Vaulted, apa yang tidak, dan bagaimana setiap keputusan desain dipetakan ke kontrol yang diakui. Kami akan menugaskan tinjauan independen dan menerbitkan laporannya bersama halaman ini ketika anggaran memungkinkan. Sampai saat itu, kamu dapat memverifikasi klaim zero-knowledge utama sendiri dalam lima menit dengan browser DevTools.
1. Ruang lingkup & asumsi
Model ini mencakup deployment produksi vaulted.fyi termasuk frontend web, rute API, dan penyimpanan Upstash Redis. Ini juga mencakup CLI yang diterbitkan dan MCP server sejauh mereka berinteraksi dengan API yang sama.
Di luar ruang lingkup:
- Perangkat endpoint pengguna (browser, OS, ekstensi, clipboard, layar).
- Saluran komunikasi tempat tautan berbagi dikirimkan (email, Slack, SMS, dll.).
- Penanganan selanjutnya atas plaintext oleh penerima.
- Kerentanan di Vercel atau Upstash di bawah permukaan API yang kami konsumsi.
2. Aset & batas kepercayaan
Aset primer: rahasia dalam plaintext. Ia tidak boleh pernah mencapai server, bertahan di luar browser pengirim dan penerima, atau dapat dipulihkan hanya dari status sisi server.
Aset sekunder: ciphertext, IV, penghitung tayang, stempel waktu kedaluwarsa, serta integritas dan ketersediaan layanan.
Batas kepercayaan (dalam urutan kepercayaan menurun):
- Browser pengirim — dipercaya dengan plaintext dan kunci.
- Browser penerima — dipercaya dengan plaintext dan kunci setelah membuka tautan.
- Jaringan antara klien dan server — tidak dipercaya; dimitigasi oleh TLS 1.3 dan keputusan desain bahwa hanya ciphertext yang melintasinya.
- Server Vaulted (kami) — setengah dipercaya. Diperlakukan sebagai penyimpanan ciphertext pasif. Model ancaman mengasumsikan Vaulted sendiri dapat dikompromi tanpa mengekspos plaintext.
- Upstash Redis — tingkat kepercayaan sama dengan server. Hanya blob terenkripsi.
3. Aktor ancaman
Pengamat jaringan pasif. ISP, aktor on-path dengan akses ke metadata TLS. Dikalahkan oleh TLS dan ketiadaan plaintext atau kunci di jalur transmisi.
Penyerang jaringan aktif. Dapat mencoba MitM. Dikalahkan oleh TLS, HSTS preload, dan validasi sertifikat. Kompromi TLS yang berhasil pun hanya menghasilkan ciphertext.
Server yang dikompromi / operator bermusuhan. Termasuk kami. Tidak dapat membaca rahasia yang tersimpan karena kunci tidak pernah tiba. Dapat menolak layanan atau memodifikasi bundle JS yang disajikan — dibahas dalam risiko residual di bawah.
Penyerang tidak terautentikasi dengan tautan berbagi yang valid. Secara desain, siapa pun dengan tautan lengkap dapat mendekripsi. Batas tayang, kedaluwarsa, dan passphrase opsional mempersempit jendela waktu. Ini adalah properti yang disengaja, bukan bug.
Penyerang yang menarget pengirim atau penerima tertentu. Dapat mengeksploitasi endpoint, saluran pengiriman, atau penanganan penerima setelah dekripsi. Di luar kendali Vaulted; didokumentasikan demi kejujuran.
4. Kontrol
- AES-256-GCM sisi klien dengan IV 96-bit acak dari
crypto.getRandomValues. - Kunci 256-bit yang dibuat per rahasia melalui
crypto.subtle.generateKey; ditempatkan di URL fragment, tidak pernah ditransmisikan. - Pembungkusan passphrase opsional dengan PBKDF2 (jumlah iterasi tinggi) dan key wrap AES-GCM.
- Penegakan penghitung tayang atomik via Redis
HINCRBYdengan penghapusan dalam transaksi yang sama saat mencapai batas. - Kedaluwarsa otomatis berbasis TTL dibatasi hingga 30 hari; tidak ada perpanjangan setelah pembuatan.
- Rate limiting sliding-window per IP pada endpoint create dan view.
noindexpada halaman tampilan /s/[id] agar URL rahasia tidak bocor melalui pencarian.- TLS 1.3 dengan HSTS preload, header keamanan yang aman, tanpa pencatatan IP melampaui jendela rate-limit.
5. Risiko residual (tidak dipertahankan)
Ini adalah keputusan batas yang disengaja, didokumentasikan agar pengguna dapat memutuskan apakah Vaulted sesuai dengan model ancaman mereka.
- Kompromi endpoint. Keylogger, browser yang terinfeksi, atau ekstensi berbahaya dapat membaca plaintext setelah dekripsi.
- Kebocoran saluran pengiriman. Jika tautan berbagi diteruskan, diarsipkan, atau dikutip dalam utas email balasan, saluran tersebut menjadi permukaan serangan.
- Bundle swap yang ditarget. CDN yang dikompromi atau edge Vercel dapat menyajikan JS yang berbeda kepada pengguna tertentu. Subresource Integrity dan reproducible builds adalah mitigasi parsial dan ada di roadmap.
- Perilaku penerima. Setelah didekripsi, penerima dapat menyalin, mengambil screenshot, atau meneruskan.
- Passphrase lemah. Jika digunakan, passphrase yang lemah dapat di-brute-force oleh siapa pun yang memiliki kunci yang dibungkus.
- Paksaan fisik. Di luar ruang lingkup kontrol teknis mana pun.
6. Self-Attestation OWASP ASVS L1
Matriks di bawah ini memetakan implementasi Vaulted terhadap persyaratan OWASP ASVS Level 1 yang dipilih. Kategori yang tidak berlaku (sesi, autentikasi, unggah file) ditandai N/A dengan alasan singkat daripada dihilangkan, sehingga tidak adanya entri tidak terbaca sebagai penghindaran.
| ID | Kategori | Persyaratan | Status | Bukti |
|---|---|---|---|---|
| V1.1.1 | Arsitektur | SDLC aman dengan pemodelan ancaman untuk aplikasi | Pass | Dokumen ini. Ditinjau pada setiap perubahan arsitektur material. |
| V1.4.1 | Arsitektur | Titik penegakan tepercaya memberlakukan kontrol akses | Pass | Handler rute API memvalidasi input dan mengonsumsi tampilan secara atomik via Redis HINCRBY di src/lib/redis-secrets-store.ts. |
| V2.10.x | Autentikasi | Autentikasi layanan / pengguna | N/A | Vaulted bersifat anonim. Tidak ada akun pengguna, tidak ada autentikasi service-to-service. Otorisasi berdasarkan pengetahuan tentang ID rahasia dan kunci URL fragment. |
| V3.x | Manajemen Sesi | Persyaratan manajemen sesi | N/A | Tidak ada sesi, tidak ada cookie untuk status terautentikasi. |
| V5.1.3 | Validasi Input | Validasi input pada lapisan layanan tepercaya | Pass | Validasi runtime manual di src/app/api/secrets/route.ts. Payload ≤ 1000 karakter diberlakukan di sisi server; max views dan TTL dibatasi. |
| V5.2.5 | Sanitasi | Pengkodean output berdasarkan konteks (HTML, JS, URL) | Pass | React meng-escape semua nilai yang diinterpolasi secara default. Satu-satunya panggilan dangerouslySetInnerHTML merender literal JSON-LD yang dibangun di sisi server dari data bertipe. |
| V6.2.1 | Kriptografi Tersimpan | Gunakan algoritma kriptografi yang disetujui dengan default yang aman | Pass | AES-256-GCM via Web Crypto API. NIST SP 800-38D. Lihat src/lib/crypto.ts. |
| V6.2.2 | Kriptografi Tersimpan | Pembangkitan bilangan acak yang kuat secara kriptografis | Pass | crypto.getRandomValues untuk IV dan material kunci. crypto.subtle.generateKey untuk kunci AES. |
| V6.2.5 | Kriptografi Tersimpan | Tidak ada primitif kriptografi yang tidak aman atau usang | Pass | Tidak ada MD5, SHA-1, DES, RC4, ECB, atau CBC-tanpa-MAC di mana pun dalam jalur kriptografi. |
| V6.3.1 | Kriptografi Tersimpan | Kunci dilindungi dari akses tidak sah | Pass | Kunci enkripsi tidak pernah mencapai server. Hanya ada di URL fragment, diproses di sisi klien sesuai RFC 3986. Passphrase opsional membungkus kunci dengan PBKDF2 sebelum berbagi. |
| V7.1.1 | Penanganan Kesalahan & Logging | Tidak ada informasi sensitif dalam log | Pass | Server hanya mencatat bentuk permintaan dan keputusan rate-limit. Tidak ada ciphertext, tidak ada ID rahasia dengan cara yang bisa dikorelasi-silang, tidak ada IP yang disimpan melampaui jendela rate-limit. |
| V7.4.1 | Penanganan Kesalahan & Logging | Pesan kesalahan generik | Pass | Rute API mengembalikan kode status HTTP generik dan string kesalahan singkat. Tidak ada stack trace atau status internal yang bocor. |
| V8.1.1 | Perlindungan Data | Data sensitif diidentifikasi dan dilindungi | Pass | Plaintext tidak pernah diterima oleh server. Ciphertext disimpan terenkripsi di Upstash Redis dengan penghapusan berbasis TTL dan penegakan batas tayang atomik. |
| V8.3.1 | Perlindungan Data | Data sensitif tidak terekspos dalam URL atau referrer | Pass | Kunci enkripsi ada di URL fragment; fragment tidak pernah dikirim ke server dan dihapus dari document.referrer oleh browser sesuai RFC 3986 §3.5. |
| V9.1.1 | Komunikasi | TLS untuk semua konektivitas klien | Pass | TLS 1.3 diberlakukan di edge Vercel. HSTS preloaded. Permintaan HTTP diarahkan ke HTTPS. |
| V10.3.2 | Kode Berbahaya | Kode aplikasi ditinjau untuk kode berbahaya | Pass | Codebase dengan satu maintainer. Semua commit dibuat oleh pemilik proyek; commit yang ditandatangani di mana didukung. Pembaruan dependensi via Dependabot ditinjau sebelum merge. |
| V11.1.1 | Logika Bisnis | Alur logika dilindungi dari penyalahgunaan | Pass | Rate limiting per IP via Upstash Ratelimit (10 create/menit, 30 view/menit). Penghitung tayang didekrementasi secara atomik. |
| V12.x | File & Sumber Daya | Persyaratan unggah dan pemrosesan file | N/A | Vaulted tidak menerima unggah file. |
| V13.2.1 | API & Layanan Web | Endpoint RESTful memvalidasi skema permintaan | Pass | Semua handler POST/GET memvalidasi parameter path, bentuk body, dan content-type sebelum pemrosesan. |
| V14.4.3 | Konfigurasi | Header keamanan standar dikonfigurasi | Pass | HSTS, X-Content-Type-Options, Referrer-Policy, dan Permissions-Policy diatur via konfigurasi Next.js. Content-Security-Policy diberlakukan per permintaan di src/proxy.ts dengan script-src strict-dynamic berbasis nonce; rute API mendapatkan kebijakan default-src none yang ketat. |
Penomoran mengikuti struktur ASVS 4.0. Daftar ini dipilih, bukan lengkap — tujuannya adalah kejujuran tentang kontrol yang benar-benar berlaku untuk penyimpanan ciphertext terenkripsi tanpa status dan tanpa akun.
7. Proses perubahan
Setiap perubahan yang mempengaruhi item dalam dokumen ini — endpoint baru, perubahan kriptografi, refactoring yang mempengaruhi dependensi, perubahan infrastruktur — harus memicu peninjauan halaman ini dalam PR yang sama. Versi dan tanggal publikasi di atas akan bertambah saat dokumen diperbarui; versi sebelumnya tetap dapat diakses dalam riwayat git publik.
Penandatanganan
Model ancaman ini diterbitkan dengan itikad baik oleh maintainer Vaulted. Kesalahan, kelalaian, dan ketidaksetujuan dengan attestasi di atas secara eksplisit diundang — silakan laporkan ke [email protected] atau melalui program pengungkapan bertanggung jawab.
Maxim Novak — maintainer, vaulted.fyi · 2026-04-27