PrivShare

Threat model

Threat Model

This page documents what PrivShare is designed to protect, what it only partially limits, and what remains outside the app boundary.

Assets In Scope

These are the assets PrivShare tries to keep out of server custody or restrict through lifecycle controls.

  • Plaintext text-share contents.
  • Environment-variable names, values, comments, and variant names.
  • Plaintext file bytes and file metadata.
  • Private decryption keys and share passwords.
  • Recipient notification links and lifecycle availability.
  • Account-owned safe metadata and owner-only controls.

Threat Table

Status means protection for share plaintext unless a row says otherwise.

ThreatStatusExplanation
Database stolenProtectedThe database stores ciphertext and approved metadata, not plaintext share contents or URL fragment keys.
Server admin reads databasePartialThe admin can see service-visible metadata, but does not possess URL fragment keys or raw share passwords from the database alone.
HTTPS interceptionProtectedTLS protects transport and share payloads are encrypted in the browser before persistence.
Someone obtains full fragment-key share URLNot protectedThe full URL contains the decryption capability. Treat the complete link as sensitive.
Someone obtains keyless password-share URL onlyPartialThey still need the share password, but wrapped-key metadata permits offline guessing if obtained.
Recipient screenshots or copies secretNot protectedThe recipient has plaintext after browser decryption.
Compromised sender deviceNot protectedThe secret can be stolen before encryption.
Compromised recipient deviceNot protectedThe secret can be stolen after decryption.
Malicious browser extensionNot protectedExtensions may access page contents depending on browser permissions.
Malicious PrivShare JavaScriptNot protectedThe web app must be trusted to deliver honest client code. Zero-knowledge storage does not protect against malicious delivered JavaScript by itself.
Brute force share IDDependsOpaque IDs and verifier-gated retrieval help. Custom app-level rate limiting is still backlog, so do not treat this as production-grade abuse resistance.
Expired share retrievalProtectedCorrect verifier proof cannot retrieve expired shares.
Reuse of burned text/env shareProtectedThe burn transition is atomic and happens before ciphertext is served.
Interrupted burned file download retryPartialThe same correct verifier can briefly retry encrypted-file download URLs. Cleanup-claimed or expired burned file shares do not qualify.
S3 object disclosureProtectedFile bytes and file metadata are encrypted client-side. Object keys are operational metadata and must not be exposed.
Recipient email provider compromiseProtectedRecipient emails carry keyless /s/[id] links only.
Auth account password compromisePartialAccount authentication is a separate Better Auth boundary. Account passwords are not share passwords or share encryption keys.

Trust Assumptions

These assumptions are not hidden. They are part of the web-app security model.

  • The browser implements Web Crypto correctly.
  • The delivered PrivShare JavaScript is honest.
  • The sender and recipient devices are not compromised.
  • The sender protects the complete fragment-key URL and any share password.
  • Dashboard labels, folders, and tags do not contain secrets.
  • Production operator settings outside this repository are configured correctly by the owner.