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):

  1. Browser pengirim — dipercaya dengan plaintext dan kunci.
  2. Browser penerima — dipercaya dengan plaintext dan kunci setelah membuka tautan.
  3. Jaringan antara klien dan server — tidak dipercaya; dimitigasi oleh TLS 1.3 dan keputusan desain bahwa hanya ciphertext yang melintasinya.
  4. Server Vaulted (kami) — setengah dipercaya. Diperlakukan sebagai penyimpanan ciphertext pasif. Model ancaman mengasumsikan Vaulted sendiri dapat dikompromi tanpa mengekspos plaintext.
  5. 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 HINCRBY dengan 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.
  • noindex pada 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.

IDKategoriPersyaratanStatusBukti
V1.1.1ArsitekturSDLC aman dengan pemodelan ancaman untuk aplikasiPassDokumen ini. Ditinjau pada setiap perubahan arsitektur material.
V1.4.1ArsitekturTitik penegakan tepercaya memberlakukan kontrol aksesPassHandler rute API memvalidasi input dan mengonsumsi tampilan secara atomik via Redis HINCRBY di src/lib/redis-secrets-store.ts.
V2.10.xAutentikasiAutentikasi layanan / penggunaN/AVaulted bersifat anonim. Tidak ada akun pengguna, tidak ada autentikasi service-to-service. Otorisasi berdasarkan pengetahuan tentang ID rahasia dan kunci URL fragment.
V3.xManajemen SesiPersyaratan manajemen sesiN/ATidak ada sesi, tidak ada cookie untuk status terautentikasi.
V5.1.3Validasi InputValidasi input pada lapisan layanan tepercayaPassValidasi runtime manual di src/app/api/secrets/route.ts. Payload ≤ 1000 karakter diberlakukan di sisi server; max views dan TTL dibatasi.
V5.2.5SanitasiPengkodean output berdasarkan konteks (HTML, JS, URL)PassReact 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.1Kriptografi TersimpanGunakan algoritma kriptografi yang disetujui dengan default yang amanPassAES-256-GCM via Web Crypto API. NIST SP 800-38D. Lihat src/lib/crypto.ts.
V6.2.2Kriptografi TersimpanPembangkitan bilangan acak yang kuat secara kriptografisPasscrypto.getRandomValues untuk IV dan material kunci. crypto.subtle.generateKey untuk kunci AES.
V6.2.5Kriptografi TersimpanTidak ada primitif kriptografi yang tidak aman atau usangPassTidak ada MD5, SHA-1, DES, RC4, ECB, atau CBC-tanpa-MAC di mana pun dalam jalur kriptografi.
V6.3.1Kriptografi TersimpanKunci dilindungi dari akses tidak sahPassKunci 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.1Penanganan Kesalahan & LoggingTidak ada informasi sensitif dalam logPassServer 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.1Penanganan Kesalahan & LoggingPesan kesalahan generikPassRute API mengembalikan kode status HTTP generik dan string kesalahan singkat. Tidak ada stack trace atau status internal yang bocor.
V8.1.1Perlindungan DataData sensitif diidentifikasi dan dilindungiPassPlaintext tidak pernah diterima oleh server. Ciphertext disimpan terenkripsi di Upstash Redis dengan penghapusan berbasis TTL dan penegakan batas tayang atomik.
V8.3.1Perlindungan DataData sensitif tidak terekspos dalam URL atau referrerPassKunci 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.1KomunikasiTLS untuk semua konektivitas klienPassTLS 1.3 diberlakukan di edge Vercel. HSTS preloaded. Permintaan HTTP diarahkan ke HTTPS.
V10.3.2Kode BerbahayaKode aplikasi ditinjau untuk kode berbahayaPassCodebase dengan satu maintainer. Semua commit dibuat oleh pemilik proyek; commit yang ditandatangani di mana didukung. Pembaruan dependensi via Dependabot ditinjau sebelum merge.
V11.1.1Logika BisnisAlur logika dilindungi dari penyalahgunaanPassRate limiting per IP via Upstash Ratelimit (10 create/menit, 30 view/menit). Penghitung tayang didekrementasi secara atomik.
V12.xFile & Sumber DayaPersyaratan unggah dan pemrosesan fileN/AVaulted tidak menerima unggah file.
V13.2.1API & Layanan WebEndpoint RESTful memvalidasi skema permintaanPassSemua handler POST/GET memvalidasi parameter path, bentuk body, dan content-type sebelum pemrosesan.
V14.4.3KonfigurasiHeader keamanan standar dikonfigurasiPassHSTS, 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