Changelog — TAIVA Vault
Todas as mudanças notáveis deste projeto estão documentadas aqui. Formato segue Keep a Changelog. Versionamento SemVer.
🔒 Reporting bugs / security issues
TAIVA Vault está em beta privado. Encontrar bugs é encorajado.
Como reportar
- Bugs de segurança: email para
contato@netivim.com.brcom assunto[SECURITY] <título>. Veja SECURITY.md para escopo, SLA de resposta (72h), política de não-retaliação e formato de relatório esperado. - Bugs funcionais / UX: mesmo email, sem prefixo especial.
- PoC reproduzível é obrigatório para classificação CRIT/HIGH. Sem passos para reproduzir, o bug fica em "informational".
Recompensa (budget honesto de solo dev)
Este projeto não tem bug bounty formal (HackerOne, Bugcrowd) — auditoria externa via Trail of Bits ou similar está planejada para Q3-Q4 2027, conforme receita permitir.
| Classe | PoC | Recompensa monetária | Reconhecimento |
|---|---|---|---|
| CRITICAL (RCE, full account takeover, key extraction, ZK violation reprodutível) | obrigatório | R$ 300 | Naming no changelog + post público de agradecimento |
| HIGH (information disclosure não-trivial, MPC bypass parcial, recovery flow bypass, persistent XSS autenticado) | obrigatório | R$ 100 | Naming no changelog + agradecimento público |
| MEDIUM (UX que vira problema de segurança, CSRF não-trivial, side-channel mensurável) | obrigatório | — | Agradecimento público |
| LOW (boas práticas, info disclosure de baixo impacto, sugestão arquitetural) | recomendado | — | Agradecimento (se desejado) |
Todos os reporters de bug não-trivial recebem: acesso PRO vitalício gratuito (já incluso no programa beta tester).
Pagamento via Pix em até 14 dias após confirmação do bug. Valores subirão conforme o produto gerar receita.
Critérios objetivos para classificação
- CRITICAL: precisa demonstrar (a) extração de chave/dados de outro usuário, OU (b) execução de código no servidor, OU (c) bypass total de auth/recovery, OU (d) quebra demonstrável da garantia de zero-knowledge (ex: descobrir DEK no servidor).
- HIGH: precisa demonstrar impacto direto na confidencialidade/integridade, mas com pré-condições (ex: requer sessão válida, ou um único usuário-alvo).
- MEDIUM/LOW: tudo mais.
Classificação é decidida pelo solo dev (eu), em diálogo aberto com quem reportou. Se você discorda da classificação, argumente — sou receptivo a contra-exemplos.
Política de disclosure
- Embargo até fix em prod: pedimos que você não publique o bug publicamente até confirmarmos que o fix está em produção (geralmente <72h para CRIT, <1 semana para HIGH).
- Crédito público: depois do fix, você pode publicar quanto quiser (Twitter, blog, talk). Pediremos consentimento antes de citar seu nome no changelog.
- Não-retaliação: pesquisa de segurança em boa fé não será motivo para ação legal. Não exfiltre dados de outros usuários nem afete disponibilidade.
[v1.4.0 — Security Hardening Sprint] — 2026-05-15
Três passadas de pentest white-box externo (IA Kimi-Code-CLI) catalisaram um ciclo intensivo de remediação. 28 findings totais → 0 CRIT/HIGH abertos.
Pentest cycle stats
| Pass | Findings | Closed | By-design | CRIT/HIGH aberto |
|---|---|---|---|---|
| 2026-05-14 | 13 | 11 | 2 | 0 |
| 2026-05-15 (manhã) | 9 | 9 | 0 | 0 |
| 2026-05-15 (tarde) | 6 | 6 | 0 | 0 |
Crédito ao auditor: Kimi-Code-CLI (análise white-box automatizada).
Sprint S-1 — Quick wins (commits bcb2840, 3e73bfb)
- V-013 [CRIT — reclassificado de INFO]: hardcoded defaults com Resend API key + Redis password em scripts/alpha-monitor.sh (padrão
${VAR:-realsecret}). Ambas chaves rotacionadas + script alterado para fail-fast (${VAR:?required}). PAT do Forgejo também rotacionado pra SSH keys per-host (zero plaintext em .git/config). - V-008 [LOW]: dedup block /monitoring no middleware
- V-010 [LOW]: regex senha mestre 12-20 → 12-64 (suporta passphrases diceware)
- V-003 [MED]: removido
'unsafe-eval'do CSP de produção
Sprint S-2/S-3 — Hardening (commits 67afe0f, a57a347, 30fdc92, de0f4aa)
- V-001 [HIGH]: Shamir SSS v2 reconstruction implementada na extensão (260 LOC pure JS GF(2^8), 110/110 golden vectors vs
shamirs-secret-sharing@2.0.1). Server flipado para v2 ativo em prod (Alpha endpoint estendido pra aceitar shares 82B). - V-002 [HIGH]: session token rotation completa. Bug real descoberto: a rotação estava 100% morta (check de staleness rodava após sessionRefresh já ter resetado lastActivityAt). Reescrito com pipeline Redis atômico + grace window 60s.
- V-005 [MED]: trusted device da extensão agora wipe após 10 PIN attempts inválidas
- V-012 [LOW]:
@hono/node-serveradvisory CWE-22 → npm overrides ^1.19.14
Sprint S-4 — Pentest pass-2 fixes (commits a57a347, 2343794)
- V-014 [HIGH]: extensão limitava senha a 20 chars mesmo após server aceitar 64 — bloqueava users com passphrase. Corrigido em popup.js + popup.html. Manifest v1.2.4.
- V-015 [HIGH]: removido fallback que re-derivava material de trusted device do plaintext password no LOGIN_COMPLETE (após SW restart). Se SW restartar entre BEGIN+COMPLETE, trusted device simplesmente não é persistido (user faz full login na próxima — UX trade-off por segurança).
Sprint S-5 — Pentest pass-2 hardening (commits 17ff211, 4f742ec)
- V-016 [MED]: backup script falha fast se .env não tiver perms 600
- V-017 [LOW]: alpha-monitor.sh escape HTML + JSON via jq antes de enviar email
- V-018 [MED]: lib/env.ts usa
requireEnvInProdpra 5 secrets críticas (fail-fast em prod se vazias) - V-020 [LOW]: gerador de senha da extensão usa rejection sampling (zero modulo bias)
- V-022 [LOW]: HSTS no middleware Next.js (defense-in-depth — Caddy edge já tinha)
- V-023 [LOW]: content.js innerHTML='' → removeChild loop
- V-025 [LOW]:
upgrade-insecure-requestsno CSP - V-026 [LOW]: rate limiter no message handler da extensão (60 msgs/10s/sender)
- V-027 [LOW]: removido
dangerouslySetInnerHTMLem app/site-taiva - V-028 [MED]: clipboard CLEAR via chrome.offscreen API (Chrome MV3 SW não tem DOM, navigator.clipboard.writeText falhava silenciosamente)
- mTLS Epsilon↔Alpha:
rejectUnauthorized: trueexplícito (default já era true, paranoia minor) - Session rotation: log adicional pra detection de rotation não-aplicada por exception path
Sprint S-6 — Bonus (commit 4aa5632)
- Mesma vulnerability do V-028 também afetava COPY_PASSWORD/COPY_USERNAME — handlers usavam navigator.clipboard.writeText direto do SW. Refatorado com
writeClipboard()helper genérico via offscreen. Manifest v1.2.6.
Sprint S-7 — Pentest pass-3 fixes (commit 3416a46, ext 80590e7)
- MED-1: V-023 fix foi parcial — sweep completo dos 5 innerHTML restantes na extensão. Todos →
replaceChildren(). Manifest v1.2.7. - MED-2: HTML injection em sendBetaSignupNotice — email + inviteId via
escapeHtml() - MED-3: open redirect em dmsWarningHtml via NEXT_PUBLIC_URL. Novo
safeBaseUrl()helper com allowlist (vault.taiva.com.br + localhost). Também consertou sendContactNoticeEmail que tinha mesma vuln. - LOW-1: race condition no reset failedLoginAttempts — convertido fire-and-forget → await dentro try/catch
- LOW-2: preflight artifact MPC com ID determinístico per-hostname + cleanup explícito em finally
- INFO-1: validatePasswordPolicy ainda tinha
>20— alinhado com regex{12,64}
Sprint V-004 — mTLS Epsilon↔Alpha (bonus, commits 28686f7, 3980d37)
- CA interna + certs (1y), key offline. Dual-listen no auth-gateway: HTTP :9091 mantido + HTTPS :9093 novo com mTLS required. Toggle via
MPC_USE_MTLS=trueenv (rollback ~30s). Cutover phase 7 (desligar HTTP) planejado pra ~2026-05-22.
Security posture pós-sprint
- ✅ Zero plaintext passwords em qualquer fluxo entre client/server (objetivo Sprint B.6 phase 4)
- ✅ Session rotation funcionando atomicamente (era dead code antes)
- ✅ Shamir SSS v2 ativo (extensão+server) pra novos signups
- ✅ mTLS inter-host MPC ativo
- ✅ Todos secrets em .env (zero hardcoded defaults)
- ✅ HSTS + upgrade-insecure-requests no CSP
- ✅ Clipboard write via offscreen API (MV3 SW correto)
- ✅ Rate limiting em message handlers + rotation log
Test posture
- vault server: 471 passed / 27 skipped / 0 failed (foi 463 antes do sprint)
- extension: 19/19 unit tests (Shamir + crypto pura)
[v1.3.0] — 2026-05-14
Added — Sprint C Reproducible Builds + Cosign Signing 2026-05-14
- 📦 scripts/build-release.sh — deterministic git archive (tested byte-identical entre runs)
- 🔐 scripts/sign-release.sh — Cosign sign-blob com private key local + Rekor transparency log upload
- ✅ scripts/verify.sh — 2-step verification (signature + reproducibility from source)
- 🔑 cosign.pub — public verification key (committed to repo for trust anchor)
- 📚 RELEASES.md — passo-a-passo pra terceiros verificarem qualquer release
Security
- Releases agora vêm com proof criptográfico: 1. Signature válida → release foi assinada pela key oficial 2. Rekor entry → assinatura é pública e imutável 3. Hash reproducible → binário corresponde exatamente ao source no git commit
- TAIVA é primeira password manager comercial brasileira com Sigstore signed releases
[Unreleased]
Added — Sprint B.6 OpenTimestamps Bitcoin Anchor 2026-05-14
- 🌍 Merkle chain root anchored em Bitcoin via OpenTimestamps. Defesa contra rollback attack: server NÃO pode "voltar no tempo" porque o root atual está publicamente registrado em Bitcoin (via OTS calendars).
- 🔧 `lib/audit-chain-anchor.ts` (393 linhas, HTTP-only, ZERO deps externas) — submits to 3 calendars públicos (alice/bob/finney/eternitywall), polls confirmation, parses Bitcoin block height.
- 🔧 `POST /api/cron/audit-anchor` (cron 03:30 UTC daily) — anchora chains de users ativos + upgrade pending proofs.
- 🔧 `GET /api/vault/audit/anchors` — lista anchors do user.
- 🔧 `GET /api/vault/audit/proof?anchorId=X` — download .ots binary (cliente verifica offline via
ots verify). - 🔧 `GET /api/vault/audit/root` estendido com
latestAnchorinfo. - 🎨 Badge UI:
✓ ₿ íntegro(laranja+verde) quando vault tem confirmed Bitcoin anchor. Tooltip mostra bloco N + data. - 📅 Cron schedule:
30 3 * * *em Epsilon crontab. - ⚠️ Limitation: OTS proof confirmation depende de Bitcoin (~24-48h). Anchors recentes ficam em
status=pendingaté bloco confirmar.
Próximas mudanças, ainda não cortadas em release.
Added — Sprint B Merkle Audit Chain 2026-05-14
- 🔒 Tamper-evident audit log via hash chain SHA-256. Cada AuditLog entry inclui e Bytes (32 bytes cada).
entryHash[N] = SHA-256(canonical(op) || prevHash[N-1]). Genesis (prevHash[0]) =SHA-256("taiva-vault-audit-genesis-v1" || userId). Modificar qualquer entry, deletar do meio, reordenar ou inserir fake quebra a chain — detectado em tempo de verificação. - 🔧 **** (296 linhas) — , , , . Canonical serialization deterministic (campos separados por 0x00, sentinel para nulls). Atomic via .
- 🔧 GET — retorna . Cliente cacheia em IndexedDB.
- 🔧 GET — delta de entries pós verificação cliente.
- 🔧 **** — Web Crypto SHA-256 reproduz hashing server-side; valida chain incrementalmente; persiste em IndexedDB . Verify on unlock + cada 5min.
- 🎨 Badge no header (): ✓ íntegro verde se chain válida, ⚠ tampering vermelho se mismatch detectado.
- 🔧 Migração existing callers: , (3x), , — todos agora chamam em vez de direto.
- 🗄️ Migration SQL prod.db: + index .
- ✅ Testes: (14 tests) — determinism, append, getRoot, getEntriesSince, tampering detection (modify/delete/insert).
Security — Sprint A timing audit 2026-05-14
- 🔒 CRIT — Email enumeration via `/api/auth/login/begin`: caminho "user existe + senha errada" fazia 2× Argon2id (~180ms) enquanto "user não existe" fazia apenas 1× + delay (~117ms). Δ=63ms detectável remotamente → atacante poderia enumerar emails registrados. Fix:
lib/session-manager.tsadicionou 2ºderiveVaultKeyno path !user com SALT_B, equalizando para constant-time. Validado via Welch's t-test p=0.21 (≥0.05). - 🔒 HIGH — Email enumeration via `/api/auth/recover/begin` (backup + recovery key paths): caminhos "user existe" faziam
pqUnlockML-KEM (~10-15ms) ausente no path "não existe". Δ=6.4ms detectável. Fix: random delay 3-19ms no path !user matching variance natural do ML-KEM. Validado p=0.28. - ⚙️ Side-channel test suite no CI: novo
tests/timing/com Welch's t-test + normal CDF approximation pra detectar regressions futuras.npm run test:timing(~100s). CI step adicionado em.gitea/workflows/test.yml. Cobertura inicial: 3 endpoints sensíveis (login/begin, recover/begin, beta-invite).tests/timing/_helpers.ts(250 linhas) — self-contained, zero dep externa.
[1.2.1] — 2026-05-14
Beta privado, multi-site architecture, hardening operacional.
Added
- Multi-site architecture:
taiva.com.bragora serve landing público para leigos (rewrite interno via middleware para/site-taiva);vault.taiva.com.brmantém landing técnica em/landing;saude.taiva.com.brespelha o app médico Genesis via Traefik. Implementação emmiddleware.ts(host detection) +app/site-taiva/page.tsx. (commite1c8fb0) - Browser extension v1.2.0 ZK strict: refactor da extensão Chrome/Firefox para zero-knowledge end-to-end. Argon2id WASM (hash-wasm@4.12.0) + ML-KEM-768 (@noble/post-quantum@0.5.4) + MPC share2 reconstruction client-side. Endpoint server
/api/extension/share2proxia o MPC retrieve. Manifest V3, CSPwasm-unsafe-eval. Bundles esbuild emcrypto/argon2.bundle.js(40KB) ecrypto/ml-kem.bundle.js(26KB). - Plan-tiered quotas reais:
lib/vault-quotas.tsagora consultagetCachedBearerpara resolver plano e aplicaPLAN_LIMITSpor tier — FREE: 30 credenciais + 3 TOTP + 5 notas + 1 contato de herança; PRO: 5000/500/1000/10; BUSINESS: 50000/5000/10000/100. (commite1c8fb0) - `SECURITY.md`: política de disclosure, escopo, SLA 72h, lista de pacotes com install scripts permitidos, vulnerabilidades aceitas conhecidas, contato. (commit
97a5a36) - Prebuild audit gate:
npm run buildagora rodanpm audit --omit=dev --audit-level=highantes donext build. Falha em HIGH ou CRITICAL nova. Bypass de emergência viaSKIP_AUDIT=1. (commit97a5a36) - Beta tester invite program: modelo
BetaInvite(Prisma) + flagslifetimePlanebetaTesterno User. Admin scriptscripts/create-beta-invite.mjsgera token único e link/cadastro?invite=<token>. Frontendapp/cadastro/page.tsxdetecta?invite=, valida viaGET /api/auth/beta-invite/[token], pré-preenche email read-only + banner "🧪 Convite Beta". Email automático paracontato@taiva.com.brquando ativado. Badge "🧪 Beta" no header (app/page.tsx).
Security
- 🔒 HSTS preload em todas as origens: helmet config em
api-core(src/index.ts) atualizado parahsts: { maxAge: 31536000, includeSubDomains: true, preload: true }.auth-gateway(src/index.ts:73) idem (max-age=63072000). Confirmado em headers deprodutos.taiva.com.br,login.taiva.com.breapi.taiva.com.brapós restart. Antes: faltavapreload(e emapi.taiva.com.br, faltava o header inteiro). - 🔒 Sigma `recovery-server.service` desligado: serviço entrou em loop de restart após upgrade
postgresql-15→16que resetoupg_hba.confparapeerauth. Investigação revelou que o serviço era código órfão — Sigma virou replica streaming read-only do Postgres primary (gama-db), enquanto o recovery do vault em produção é servido por Epsilon (/api/auth/recover/*). Serviço stopped + disabled. - 🔒 Backup gama-db ativado: o cron
/etc/cron.d/bariatriq-backup(schedule 03:00 UTC daily) existia desde 2026-03-14 mas o pacotecronnunca foi instalado no servidor. Apenas um backup histórico (de 14/03/2026, 284 KB, com offsite Delta falhando por timeout) foi registrado. Em 14/05:apt install cron, service active, script/usr/local/bin/backup-bariatriq.shreapontado de Delta (unreachable) para Alpha (autorizada via SSH key). Backup manual de validação: 447 MB GPG-encrypted (em ambos: gama-db local + offsite Alpha). - 🔒 Alpha backup-db cron log path: backup do password-vault DB silenciosamente parou em 2026-05-11 22:30 porque o cron do user
vaultredirecionava log para/var/log/taiva-db-backup.log(sem permissão de escrita paravault). Movidos todos os 6 logs do crontab para/opt/password-vault/logs/. Backup manual de validação completou OK. - 🔒 Next.js 16.1.6 → 16.2.6: 13 CVEs fechadas (devagar advisories listadas no GitHub Advisory Database).
npm audit fixaplicado empackage.json+package-lock.json. ML-KEM lazy-load via dynamic import para reduzir initial bundle. (commit9039395) - 🔒 CSP middleware fix:
isStaticLandingemmiddleware.tsmudou depathname === "/" || pathname === "/landing" || pathname === "/site-taiva"para apenaspathname === "/landing" || pathname === "/site-taiva". Antes, usuários autenticados acessando/(dashboard) recebiamscript-src 'none'e UI travava. Para anon-em-/(que faz rewrite para landing), CSP restritiva é aplicada localmente no handler do rewrite via novocspLandingconst. - 🔒 OS hardening em todos servers: apt upgrade em Alpha, Beta, Sigma, Epsilon, Delta, gama-db. Caddy Alpha 2.11.2 → 2.11.3 (docker pull + recreate). SSH configs auditados em todos — UFW deny-by-default, PasswordAuth no, key-only auth.
Verified (FULL hardening audit 2026-05-14)
- Portas LISTEN inventariadas em todos servers (Tailscale-only vs public separado).
- TLS configs detalhados: certs Let's Encrypt válidos, TLS 1.2+1.3 only, ciphers modernos (chacha20-poly1305, aes256-gcm), HSTS preload em todas origens.
- Firewall: UFW active deny-by-default em todos; CrowdSec + iptables bouncer em Alpha + Delta com decisions ativas.
- Backup Epsilon vault (
prod.db): smoke test de restore confirmou que arquivo é double-encrypted (libsql + openssl AES-CBC) — comment do script de backup era misleading. Restore funciona: gunzip → openssl decrypt → libsql client comencryptionKey. Backup hourly OK (último teste: 11:00 UTC, 127 KB). - Sentry: DSNs configuradas em api-core, vault-epsilon, mobile. PII scrubbing forte.
- Prometheus 6 alert rules em Sigma (APICoreLatencyHigh, APICoreErrorRateHigh, APICoreDown, ASAASWebhookFailures, EmailSendFailures, AuthBridgeFailures) — todas
health=ok state=inactive.
[1.2.0] — 2026-05-13
Auditoria de segurança externa + ZK strict end-to-end. 8 críticas e 11 médias/altas resolvidas.
Added — Sprint A: Senha forte
- Senha mestre 12-20 chars com policy: substitui token numérico de 8 dígitos. Entropia 27 bits → 78+ bits. Validação client + server via
validatePasswordPolicyemlib/schemas.ts. (commitb94852c)
Added — Sprint B: ZK strict end-to-end (frontend)
- B.1: GET endpoint ZK + client crypto library (
lib/vault-crypto-zk.ts). (commit4d9e72a) - B.2: POST/PATCH/DELETE ZK +
VaultKekProviderContext. (commit40b66bf) - B.3: ZK strict para Notes, TOTP e Export. (commit
48cb22e) - B.4: Login deriva KEK localmente + UI tabs
credentials/health/adicionarvia hooks ZK (useCredentialsZk). (commits0c3363a,aa575c1,858b3fc) - B.5: Login completion expõe
wrappedDek + saltpara client decifrar. (commita046813) - B.6 partial: 7 rotas legacy non-ZK removidas. (commit
dcb18d7) - B.6 full: Export/import/travel migrados para ZK strict. (commit
93be988) - B.6 phase 4 🔒:
SessionData.dekremovida — server NÃO persiste mais DEK na sessão entre requests. Token rotation/api/redefiniragora pedecurrentTokenpara server re-derivar transientemente + wipe imediato. (commitc0c17d9) - Sprint B closure: Notes + TOTP UI completamente migrados para hooks ZK. (commit
6b89502)
Added — Sprint C: Master key em IndexedDB
- 🔒 Master key armazenada como `CryptoKey` non-extractable em IndexedDB (não como bytes em memória). Resistente a XSS extraction. (commit
66db7ee)
Added — Sprint D: Shamir Secret Sharing
- Lib `shamirs-secret-sharing@2.0.1` integrada para substituir XOR-split. Matemática formal, upgrade path para 2-of-3 / 3-of-5 sem mexer schema. (commit
66effcc) - ⚠️ Rollback parcial em prod: endpoint Alpha MPC só aceita shares de 32B (formato XOR-split). Schema
keyShareVersion=1(XOR) mantido em prod até update do endpoint. Lib Shamir permanece no código para uso futuro. (commitsf30588d,31a43ee)
Added — Sprint E
- Whitepaper v1.2 atualizado refletindo arquitetura ZK strict honesta. PDF 252KB / 49 páginas (pandoc + xelatex).
Security — Audit externa 2026-05-13 (18 issues resolvidas)
- 🔒 3 CRITICAL:
- F-008:
Cofre bloqueadoregression — wire format mismatch +mlKemCtPrimarydrop em 2 paths. (commits015b9ae,3a72611) - Audit ext #1-3: detalhes em commit
f30588d(3 críticos resolvidos). - 🔒 8 HIGH: rate-limits adicionais, panicWipe completo, ZK guards em rotas legacy. (commit
2b7616f) - 🔒 7 MEDIUM + 1 LOW: final batch (skipped #12 por análise). (commit
8107fd1) - 🔒 7 VÁLIDOS + 3 PARCIAIS audit externa: detalhes em commit
5dee12c. - 🔒 HSTS preload header em `next.config.ts` (LOW-003 da audit externa). (commit
c171731)
Fixed
- `wrapDek/unwrapDek` aceitam payloads de tamanho variável: regression introduzida no Sprint D. (commit
8171efc) - Signup rate-limit não pune retries client + falhas pré-validação. (commit
9aec66d) - MPC retry regenera nonce/sig fresh: evita
401 Nonce replayeddo Alpha. (commit7dda2aa) - Signup `keyShareVersion` explícito: schema default era 2 (Shamir) mas código usa 1 (XOR). (commit
31a43ee) - Signup preflight Alpha + skipMpc fallback: previne DB poisoning quando Alpha tem version mismatch. (commit
63c315f) - CSP `wasm-unsafe-eval`: necessário para Argon2id WASM no client. (commit
589015d) - CSP `unsafe-eval`: Sentry source-map-js triggers eval. (commit
fa3c263) - SW cache version bump + minimal Sentry integrations. (commit
7d074e0) - Unlock failure visible: redirect locked state para
/loginem vez de tela travada. (commit7c1eaf8) - TOTP/Notes "r is not iterable" + Health-tab loop infinito. (commit
baa90bc)
Known limitations (honestamente documentadas)
- 31 test cases em
security/,vault-crud/,integration/,regression-findingsainda exercitam helpers vault-service legacy (getCredentials/getNotes/getTotpAccounts/getCredentialHistory). Sem callers em produção; mantidos para coverage IDOR/wrong-DEK até migrar testes para equivalentes ZK (~1h estimado). - 44 usuários em prod com
keyShareVersion=1legacy XOR (auto-upgrade no próximo login). - Shamir SSS em prod ainda XOR-split — aguardando update do endpoint Alpha.
[1.1.5] — 2026-05-12
Sprint 10 — Suite TAIVA tabs + LGPD Fase 2/3 + Sentry + Playwright E2E + Bridge HMAC SSO.
Added
- Sprint 10 — Suite TAIVA tabs: bridge HMAC SSO entre Alpha e Epsilon.
EPSILON_BRIDGE_SECRETem ambos.POST /v1/auth/epsilon-bridgeauto-provisiona Org (vault:${userId}). Epsilon proxyGET /api/vault/taiva-bridge+ hookuseTaivaBridge. 3 tabs (approve B2B, inventário, carteira) consomem/v1/{approvals,documents,assets}reais + paywall FREE→PRO. (commit2af7fd3) - Cookie banner + DPO + DPIA docs (LGPD Fase 2/3). (commit
36fe098) - Sentry Next.js integrado: client + server + edge runtime, scrubbing forte (password/token/cookie/cpf/recovery/dek/share/vlt_*/48hex). (commit
32f480e) - Playwright E2E: 143/144 testes em 1.6min. 2 projects:
ui-prod(:3112) efull-test(:3113 viataiva-vault-test.servicenext dev +EXPOSE_DEV_OTP=true). 11 specs: smoke/forms/nav/security/a11y/api/full-flow/vault-CRUD/billing/webauthn-gates/webauthn-ceremony FULL via Chromium virtual authenticator CDP (register passkey real). (commit892c878) - Web add inventário + carteira com cifragem ZK. (commit
c702618) - Approve tab explícito como B2B + CTA "Recomende pra empresa". (commit
777aec9) - Travel-safe nos 4 tipos restantes (TOTP, Notes + nota Inv/Carteira) + checkbox "Permitir no modo viagem" no form + toggle individual nos tabs. (commits
7bc292c,79fecbb,49e96c6,14c50ff) - Gerador de senha com 4 níveis (Quantum default + Ultra/Paranoid/Overkill) + mostrar bits + chars + multiplicador. (commits
3805a88,a86883c) - Banner Face ID/Touch ID no dashboard para cadastrar passkey. (commit
1999b7f) - Layout responsivo desktop + toggle ocultar notas. (commit
e904d23) - Forgejo Actions workflow. (commit
e56cb97)
Fixed
- 🔒 Welcome email não envia mais recoveryKey plain (zero-knowledge — recovery key fica apenas na UI do signup). (commit
9d7bbaf) - 🔒 4 bugs auditoria r3: Cache-Control, rate-limit, IP mask, prod fallback. (commit
6ebcb65) - 🔒 4 bugs auditoria r2: CSRF panic, cache export, OOM cron, GET-side-effect. (commit
e39fd98) - 🔒 6 bugs auditoria r1: path traversal, cache cross-user, leaks. (commit
b508e28) - Migração `InheritanceContact` (cols `optedOut/unsubscribeToken/noticeEmailSent`) aplicada em
prod.dbEpsilon viascripts/migrate-inheritance.mjs(backup.bak-pre-inheritance-fix-20260512-152742). Bug prod corrigido às 15:28 UTC. - Default light theme + login layout limpo (Bitwarden-style). (commit
494a3aa) - Botão "Voltar" em `inventario/novo` + `carteira/upload` ia para
/vault(404). (commit54d52ae)
Changed
- Lazy-load 8 dashboard tabs via
next/dynamic. (commitfee76be) - Lazy-load WebAuthn + optimize imports + SW stale-while-revalidate. (commit
8c47d9c) - Paleta Bitwarden/Proton Pass — blocos sólidos sem gradient. (commit
38caa03) - Light branco puro + dark azul royal com textos brancos no dark. (commits
9c0d272,8b77f9a)
Deploy infra
- Caddy + CrowdSec configs para Epsilon standalone. (commit
a254fce)
[1.1.2] — 2026-04-30
Sprint 9 ZK Level 2 (backup + recovery) + red-team audits.
Security
- 🔒 Sprint 9 ZK Level 2: backup + recovery paths agora ZK end-to-end. (commit
2cd7b0c) - 🔒 Argon2id memoryCost 19 MiB → 64 MiB: defense-in-depth contra GPU brute-force. Cliente + servidor em sync. (commits
3a12802,05a3e8f) - 🔒 Red-team audit 2026-04-30: VULN-001, VULN-002, VULN-005 fixados. (commit
f982439) - 🔒 Red-team audit sprint 2: VULN-003, VULN-004, VULN-006 fixados. (commit
d1e21bf) - 🔒 Pre-launch hardening: QR scan universal, ZK-honest copy, ToS, limits, Turnstile. (commit
652562f)
Added
- Sprint 5: IP rate limit + WebAuthn passkeys — 442/442 testes passando. (commit
914ff0a) - Sprint 4: HTTP integration tests (30) + Redis failure tests (15) — 428/428 testes. (commit
59ef0ef) - Sprint 3: Prometheus scrape + metrics Bearer auth + middleware exemption. (commit
e8207a6)
Added (do antigo [Unreleased] — fechado nesta release)
- Token entropy validation:
StrongTokenField+hasGoodEntropy()rejeitam tokens trivialmente fracos. - Prometheus metrics format em
GET /api/metrics?format=prometheus. - `key_upgrade_failed` security event.
- Argon2id duration histogram.
- `autoUpgradePath` per-path flags.
- `deleteAccount` E2E integration test (LGPD Art. 18 IV).
- `security-events.ts` test suite (19 testes).
- `README.md` + `SECURITY.md`.
- Accessibility:
<main>landmark,aria-current="step",role="alert", labels visualmente ocultas. - Redis connection timeouts.
Fixed (do antigo [Unreleased])
- `reset-token` route missing `await`: guard sempre via Promise truthy.
- `recover/complete` hardcoded cookie name: produção agora usa
__Host-taiva-vault-token. - IP rate-limit inconsistency: fallback in-memory usava raw IP, Redis usava SHA-256 hash.
Changed
- `MAX_OTP_ATTEMPTS` re-export removed de
totp-manager.ts. - `mpc-session.ts` upgrade catch: emite
key_upgrade_failedem vez de swallow.
[1.1.1] — 2026-04-21
Added
- Chrome + Firefox extension v1.1.1 with TOTP tab (RFC 6238 client-side generation).
- Rate limit on signup by IP + email.
npm audit fixfor Next.js DoS vulnerability.
[1.1.0] — 2026-04-21
Added
- MPC per-path upgrade flags (
mpcPrimaryDone/BackupDone/RecoveryDone). autoUpgradePath()— atomic fire-and-forget classical→PQ+MPC upgrade per unlock path.- Landing page
/landingand privacy policy/privacy. - Daily SQLite backup (local + offsite Sigma) and 5-minute uptime monitor via Resend.
[1.0.0] — 2026-04-21
Initial public launch.
Added
- Initial public launch at
vault.taiva.com.br(Epsilon :3112). - ML-KEM-768 hybrid post-quantum key encapsulation for all three unlock paths (primary, backup, recovery).
- Argon2id KDF with per-path salts for key derivation.
- AES-256-GCM DEK wrapping and session storage.
- MPC 2-of-2 share distribution via circuit-breaker-protected client.
- Panic mode (wipe DEK from memory + sessions) and Dead Man's Switch.
- Travel mode (hide credentials) with
travelSafeflag per credential. - LGPD Art. 18 IV account deletion with operator email alert.
- TOTP account management with RFC 6238 client-side code generation.
- Credential and secure-note CRUD with AES-256-GCM encryption.
- Recovery key (256-bit Crockford base32) with confirmation step.
- Redis-backed session store with AES-256-GCM DEK encryption at rest.
- In-memory fallback for all Redis operations.
- Rate limiting on login (5 attempts) and signup (3 per IP/email) with Redis Lua EVAL.
- OTP challenge store with 5-minute TTL and attempt counting.
- PADME response padding to prevent traffic-analysis attacks.
- Structured JSON logging via pino with request-id propagation.
- In-process metrics (counters + histograms) backed by Redis HINCRBY.
Agradecimentos
Esta lista será atualizada conforme bugs forem reportados e fixados.