security: scanner covers nsec/pepper classes; ignore bare-hex key files; PRIVACY.md

- tools/secret-scan.sh now also flags nsec1 Nostr secret keys and
  *_PEPPER/*_SALT/*INTEGRITY_SECRET hex assignments, the secret classes
  this backend actually handles (previously only PEM/seed shapes).
- .gitignore: *.hex + admin-key* so an operator running inside the
  checkout cannot commit the raw admin key (create-admin-wallet --out).
- PRIVACY.md pointing to the canonical smirk.cash/privacy, framed for
  self-hosting operators as independent data controllers.
This commit is contained in:
jwinterm
2026-07-19 15:52:07 -04:00
parent a455c60ed0
commit 54fe344d14
3 changed files with 38 additions and 2 deletions
+4
View File
@@ -11,6 +11,10 @@
!.env.example
*.key
*.pem
# Bare-hex secret files (e.g. `smirk-admin create-admin-wallet --out admin-key.hex`)
# so an operator running inside the checkout cannot commit the raw admin key.
*.hex
admin-key*
*.p12
secrets/
secret_store/
+28
View File
@@ -0,0 +1,28 @@
# Privacy Policy
The canonical Smirk privacy policy lives at **https://smirk.cash/privacy** and
describes the data practices of the instance operated by Such Software LLC
(api.smirk.cash).
## For operators who self-host
This backend is open source and self-hostable. **If you run your own instance, you
are an independent data controller for it** and the Such Software policy does not
speak for you. What your instance receives from wallets that connect to it:
- **Monero/Wownero view keys** (to scan for users' incoming funds; a view key
cannot spend) and their scan/registration state.
- **Public addresses** for BTC/LTC balance lookups and **signed transactions** to
broadcast. Recipient address and amount are not sent on broadcast.
- A one-way **seed fingerprint** (SHA-256) as a non-reversible wallet identifier.
- If enabled: the **username to npub** mapping published in your NIP-05 directory,
and, for the relay, encrypted message envelopes (ciphertext only).
- IP addresses only as a **salted one-way hash**, for rate-limiting.
Private keys and seed phrases are never transmitted to the backend.
If you offer your instance to others, publish your own privacy policy describing
how you handle this data, your retention, and your jurisdiction. The knobs that
affect retention and data exposure (login-event and audit retention, erasure,
relay retention, landing-page exposure) are documented in
[docs/operations/CONSOLE.md](docs/operations/CONSOLE.md) and the root `.env.example`.
+6 -2
View File
@@ -17,8 +17,12 @@ else
mapfile -t FILES < <(find . -type f -not -path './.git/*' -not -path './target/*' -printf '%P\n')
fi
# Secret shapes (not names): PEM/OpenSSH/PGP private-key blocks and seed phrases.
PATTERNS='(-----BEGIN ([A-Z ]+ )?PRIVATE KEY-----|-----BEGIN PGP PRIVATE KEY|BEGIN OPENSSH PRIVATE KEY|\b(mnemonic|seed[_ ]?phrase)\b\s*[:=])'
# Secret shapes (not names), covering the classes this backend actually handles:
# - PEM/OpenSSH/PGP private-key blocks and seed-phrase markers
# - nsec1... Nostr SECRET keys (bech32)
# - a *_PEPPER / *_SALT (or admin key/secret) assigned a 32+ hex-char value, i.e.
# an `openssl rand -hex 32` peppered secret pasted in cleartext
PATTERNS='(-----BEGIN ([A-Z ]+ )?PRIVATE KEY-----|-----BEGIN PGP PRIVATE KEY|BEGIN OPENSSH PRIVATE KEY|\b(mnemonic|seed[_ ]?phrase)\b\s*[:=]|nsec1[0-9a-z]{20,}|\b[A-Z_]*(PEPPER|SALT|INTEGRITY_SECRET)[A-Z_]*\s*=\s*[0-9a-fA-F]{32,})'
fail=0
for f in "${FILES[@]}"; do