Modello di minaccia & OWASP ASVS L1 Self-Attestation

Le minacce contro cui Vaulted è progettato, quelle contro cui non lo è, e un'attestazione controllo per controllo rispetto a una baseline di settore.

Versione 1.0 · Pubblicato il 2026-04-27 · Fonte: main · Autore: Maxim Novak

Informazioni su questo documento

Questo è una self-attestation, non un audit di terze parti. Esiste affinché tu possa vedere esattamente cosa Vaulted afferma di proteggere, cosa no, e come ogni decisione progettuale si mappa su controlli riconosciuti. Commissoneremo una revisione indipendente e pubblicheremo il relativo rapporto accanto a questa pagina quando il budget lo consentirà. Nel frattempo, puoi verificare tu stesso l'affermazione zero-knowledge centrale in cinque minuti con i DevTools del browser.

1. Perimetro e assunzioni

Questo modello copre il deployment in produzione di vaulted.fyi inclusi il frontend web, le route API e lo storage Upstash Redis. Copre inoltre la CLI e il server MCP pubblicati nella misura in cui interagiscono con la stessa API.

Fuori perimetro:

  • Il dispositivo endpoint dell'utente (browser, OS, estensioni, clipboard, schermo).
  • Il canale di comunicazione attraverso cui viene consegnato il link di condivisione (email, Slack, SMS, ecc.).
  • La gestione successiva del testo in chiaro da parte del destinatario.
  • Vulnerabilità in Vercel o Upstash al di sotto della superficie API che utilizziamo.

2. Asset e confini di fiducia

Asset primario: il segreto in testo in chiaro. Non deve mai raggiungere il server, persistere al di fuori dei browser del mittente e del destinatario, né essere recuperabile solo dallo stato lato server.

Asset secondari: testo cifrato, IV, contatori di visualizzazioni, timestamp di scadenza e l'integrità e disponibilità del servizio.

Confini di fiducia (in ordine decrescente di fiducia):

  1. Browser del mittente — considerato affidabile per il testo in chiaro e la chiave.
  2. Browser del destinatario — considerato affidabile per il testo in chiaro e la chiave dopo aver aperto il link.
  3. Rete tra client e server — non affidabile; mitigata da TLS 1.3 e dalla scelta progettuale che solo il testo cifrato la attraversa.
  4. Server Vaulted (noi) — parzialmente affidabile. Trattato come un archivio passivo di testo cifrato. Il modello di minaccia presuppone che Vaulted stesso potrebbe essere compromesso senza esporre il testo in chiaro.
  5. Upstash Redis — stesso livello di fiducia del server. Solo blob cifrati.

3. Attori della minaccia

Osservatore passivo della rete. ISP, attore on-path con accesso ai metadati TLS. Sconfitto da TLS e dall'assenza di testo in chiaro o chiave sulla rete.

Attaccante attivo sulla rete. Può tentare un attacco MitM. Sconfitto da TLS, HSTS preload e validazione del certificato. Una compromissione TLS riuscita produce comunque solo testo cifrato.

Server compromesso / operatore ostile. Ci includiamo. Non può leggere i segreti memorizzati perché la chiave non arriva mai. Può negare il servizio o modificare il bundle JS servito — trattato nei rischi residui più in basso.

Attaccante non autenticato con un link di condivisione valido. Per design, chiunque abbia il link completo può decifrare. I limiti di visualizzazione, la scadenza e la passphrase opzionale riducono la finestra temporale. È una proprietà deliberata, non un bug.

Attaccante mirato contro uno specifico mittente o destinatario. Può sfruttare il dispositivo endpoint, il canale di consegna o la gestione post-decifratura del destinatario. Al di fuori del controllo di Vaulted; documentato per trasparenza.

4. Controlli

  • Cifratura client-side AES-256-GCM con IV casuali da 96 bit tramite crypto.getRandomValues.
  • Chiavi da 256 bit generate per ogni segreto via crypto.subtle.generateKey; posizionate nel frammento URL, mai trasmesse.
  • Key wrapping opzionale con passphrase tramite PBKDF2 (alto numero di iterazioni) e AES-GCM key wrap.
  • Applicazione atomica del contatore di visualizzazioni via Redis HINCRBY con cancellazione nella stessa transazione al raggiungimento del limite.
  • Scadenza automatica TTL con limite di 30 giorni; nessuna estensione dopo la creazione.
  • Rate limiting a finestra scorrevole per IP sugli endpoint di creazione e visualizzazione.
  • noindex sulle pagine di visualizzazione /s/[id] per evitare che gli URL dei segreti trapelino tramite le ricerche.
  • TLS 1.3 con HSTS preload, header di sicurezza adeguati, nessun log degli IP oltre le finestre di rate limit.

5. Rischi residui (non difesi)

Queste sono decisioni deliberate sui confini del perimetro, documentate affinché gli utenti possano decidere se Vaulted si adatta al loro modello di minaccia.

  • Compromissione del dispositivo endpoint. Un keylogger, un browser infetto o un'estensione ostile possono leggere il testo in chiaro dopo la decifratura.
  • Perdita nel canale di consegna. Se il link di condivisione viene inoltrato, archiviato o citato in un thread di risposta email, quel canale diventa la superficie di attacco.
  • Sostituzione mirata del bundle. Un CDN o un edge Vercel compromesso potrebbe servire un JS diverso a un utente specifico. Subresource Integrity e build riproducibili sono mitigazioni parziali e sono nel roadmap.
  • Comportamento del destinatario. Una volta decifrato, il destinatario può copiare, fare screenshot o inoltrare.
  • Passphrase debole. Se utilizzata, una passphrase debole è attaccabile con brute force da chiunque abbia accesso alla chiave wrapped.
  • Coercizione fisica. Al di fuori del perimetro di qualsiasi controllo tecnico.

6. OWASP ASVS L1 self-attestation

La matrice seguente mappa l'implementazione di Vaulted rispetto a requisiti selezionati di OWASP ASVS Level 1. Le categorie non applicabili (sessioni, autenticazione, upload di file) sono contrassegnate N/A con una breve motivazione anziché omesse — così l'assenza di una voce non viene interpretata come elusione.

IDCategoriaRequisitoStatoEvidenza
V1.1.1ArchitetturaSDLC sicuro con modellazione delle minacce per l'applicazionePassQuesto documento. Rivisto ad ogni modifica architetturale significativa.
V1.4.1ArchitetturaI punti di applicazione affidabili impongono i controlli di accessoPassAPI route handlers validate inputs and consume views atomically via Redis HINCRBY in src/lib/redis-secrets-store.ts.
V2.10.xAutenticazioneAutenticazione di servizio / utenteN/AVaulted è anonimo. Nessun account utente, nessuna autenticazione servizio-a-servizio. L'autorizzazione avviene tramite la conoscenza dell'ID del segreto e della chiave nel frammento URL.
V3.xGestione delle sessioniRequisiti di gestione delle sessioniN/ANessuna sessione, nessun cookie per lo stato autenticato.
V5.1.3Validazione degli inputValidazione degli input al livello di servizio affidabilePassValidazione manuale a runtime in src/app/api/secrets/route.ts. Payload ≤ 1000 caratteri applicato lato server; visualizzazioni massime e TTL limitati.
V5.2.5SanitizzazioneEncoding dell'output per contesto (HTML, JS, URL)PassReact esegue l'escape di tutti i valori interpolati per impostazione predefinita. Le uniche chiamate dangerouslySetInnerHTML renderizzano letterali JSON-LD costruiti lato server da dati tipizzati.
V6.2.1Crittografia dei dati memorizzatiUso di algoritmi crittografici approvati con impostazioni predefinite sicurePassAES-256-GCM via Web Crypto API. NIST SP 800-38D. Vedi src/lib/crypto.ts.
V6.2.2Crittografia dei dati memorizzatiGenerazione di numeri casuali crittograficamente robustiPasscrypto.getRandomValues per IV e materiale chiave. crypto.subtle.generateKey per le chiavi AES.
V6.2.5Crittografia dei dati memorizzatiNessuna primitiva crittografica insicura o deprecataPassNessun MD5, SHA-1, DES, RC4, ECB o CBC-senza-MAC nel percorso crittografico.
V6.3.1Crittografia dei dati memorizzatiChiavi protette contro accessi non autorizzatiPassLa chiave di cifratura non raggiunge mai il server. Risiede solo nel frammento URL, elaborata client-side secondo RFC 3986. Una passphrase opzionale avvolge la chiave con PBKDF2 prima della condivisione.
V7.1.1Gestione degli errori e loggingNessuna informazione sensibile nei logPassIl server registra solo la forma della richiesta e le decisioni di rate limit. Nessun testo cifrato, nessun ID di segreto che potrebbe essere correlato, nessun IP conservato oltre la finestra di rate limit.
V7.4.1Gestione degli errori e loggingMessaggi di errore genericiPassLe route API restituiscono codici di stato HTTP generici e stringhe di errore brevi. Nessuno stack trace o stato interno esposto.
V8.1.1Protezione dei datiDati sensibili identificati e protettiPassIl server non riceve mai testo in chiaro. Il testo cifrato è memorizzato cifrato a riposo in Upstash Redis con cancellazione TTL e applicazione atomica del limite di visualizzazioni.
V8.3.1Protezione dei datiDati sensibili non esposti in URL o referrerPassLa chiave di cifratura risiede nel frammento URL; i frammenti non vengono mai inviati al server e vengono rimossi da document.referrer dai browser secondo RFC 3986 §3.5.
V9.1.1ComunicazioniTLS per tutta la connettività clientPassTLS 1.3 applicato all'edge Vercel. HSTS preloaded. Le richieste HTTP vengono reindirizzate a HTTPS.
V10.3.2Codice malevoloCodice dell'applicazione revisionato per codice malevoloPassCodebase con un singolo maintainer. Tutti i commit creati dal proprietario del progetto; commit firmati dove supportato. Gli aggiornamenti delle dipendenze via Dependabot vengono revisionati prima del merge.
V11.1.1Logica di businessFlussi logici protetti contro gli abusiPassRate limiting per IP via Upstash Ratelimit (10 creazioni/min, 30 visualizzazioni/min). Contatori di visualizzazioni decrementati atomicamente.
V12.xFile e risorseRequisiti di upload e elaborazione di fileN/AVaulted non accetta upload di file.
V13.2.1API e servizi webGli endpoint RESTful validano lo schema della richiestaPassTutti i POST/GET handler validano i parametri del percorso, la forma del body e il content-type prima dell'elaborazione.
V14.4.3ConfigurazioneHeader di sicurezza standard configuratiPassHSTS, X-Content-Type-Options, Referrer-Policy e Permissions-Policy impostati via configurazione Next.js. Content-Security-Policy applicata per richiesta in src/proxy.ts con uno script-src strict-dynamic basato su nonce; le route API ricevono una policy default-src none rigorosa.

La numerazione segue la struttura ASVS 4.0. L'elenco è selezionato, non esaustivo — l'obiettivo è essere onesti riguardo ai controlli che si applicano in modo significativo a un archivio di testo cifrato senza stato e senza account.

7. Processo di modifica

Qualsiasi modifica che influisce su un elemento in questo documento — nuovo endpoint, modifica crittografica, refactoring che coinvolge dipendenze, modifica dell'infrastruttura — deve innescare una revisione di questa pagina nella stessa PR. La versione e la data di pubblicazione sopra verranno incrementate quando il documento viene aggiornato; la versione precedente rimane accessibile nella cronologia git pubblica.

Approvazione

Questo modello di minaccia è pubblicato in buona fede dal maintainer di Vaulted. Errori, omissioni e disaccordi con le attestazioni sopra sono esplicitamente invitati — segnalali a [email protected] o tramite il programma di divulgazione responsabile.

Maxim Novak — maintainer, vaulted.fyi · 2026-04-27