← Voltar

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.br com 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.

ClassePoCRecompensa monetáriaReconhecimento
CRITICAL (RCE, full account takeover, key extraction, ZK violation reprodutível)obrigatórioR$ 300Naming no changelog + post público de agradecimento
HIGH (information disclosure não-trivial, MPC bypass parcial, recovery flow bypass, persistent XSS autenticado)obrigatórioR$ 100Naming no changelog + agradecimento público
MEDIUM (UX que vira problema de segurança, CSRF não-trivial, side-channel mensurável)obrigatórioAgradecimento público
LOW (boas práticas, info disclosure de baixo impacto, sugestão arquitetural)recomendadoAgradecimento (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

PassFindingsClosedBy-designCRIT/HIGH aberto
2026-05-14131120
2026-05-15 (manhã)9900
2026-05-15 (tarde)6600

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-server advisory 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 requireEnvInProd pra 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-requests no CSP
  • V-026 [LOW]: rate limiter no message handler da extensão (60 msgs/10s/sender)
  • V-027 [LOW]: removido dangerouslySetInnerHTML em 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: true explí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=true env (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 latestAnchor info.
  • 🎨 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=pending até 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.ts adicionou 2º deriveVaultKey no 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 pqUnlock ML-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.br agora serve landing público para leigos (rewrite interno via middleware para /site-taiva); vault.taiva.com.br mantém landing técnica em /landing; saude.taiva.com.br espelha o app médico Genesis via Traefik. Implementação em middleware.ts (host detection) + app/site-taiva/page.tsx. (commit e1c8fb0)
  • 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/share2 proxia o MPC retrieve. Manifest V3, CSP wasm-unsafe-eval. Bundles esbuild em crypto/argon2.bundle.js (40KB) e crypto/ml-kem.bundle.js (26KB).
  • Plan-tiered quotas reais: lib/vault-quotas.ts agora consulta getCachedBearer para resolver plano e aplica PLAN_LIMITS por tier — FREE: 30 credenciais + 3 TOTP + 5 notas + 1 contato de herança; PRO: 5000/500/1000/10; BUSINESS: 50000/5000/10000/100. (commit e1c8fb0)
  • `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 build agora roda npm audit --omit=dev --audit-level=high antes do next build. Falha em HIGH ou CRITICAL nova. Bypass de emergência via SKIP_AUDIT=1. (commit 97a5a36)
  • Beta tester invite program: modelo BetaInvite (Prisma) + flags lifetimePlan e betaTester no User. Admin script scripts/create-beta-invite.mjs gera token único e link /cadastro?invite=<token>. Frontend app/cadastro/page.tsx detecta ?invite=, valida via GET /api/auth/beta-invite/[token], pré-preenche email read-only + banner "🧪 Convite Beta". Email automático para contato@taiva.com.br quando ativado. Badge "🧪 Beta" no header (app/page.tsx).

Security

  • 🔒 HSTS preload em todas as origens: helmet config em api-core (src/index.ts) atualizado para hsts: { maxAge: 31536000, includeSubDomains: true, preload: true }. auth-gateway (src/index.ts:73) idem (max-age=63072000). Confirmado em headers de produtos.taiva.com.br, login.taiva.com.br e api.taiva.com.br após restart. Antes: faltava preload (e em api.taiva.com.br, faltava o header inteiro).
  • 🔒 Sigma `recovery-server.service` desligado: serviço entrou em loop de restart após upgrade postgresql-15→16 que resetou pg_hba.conf para peer auth. 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 pacote cron nunca 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.sh reapontado 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 vault redirecionava log para /var/log/taiva-db-backup.log (sem permissão de escrita para vault). 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 fix aplicado em package.json + package-lock.json. ML-KEM lazy-load via dynamic import para reduzir initial bundle. (commit 9039395)
  • 🔒 CSP middleware fix: isStaticLanding em middleware.ts mudou de pathname === "/" || pathname === "/landing" || pathname === "/site-taiva" para apenas pathname === "/landing" || pathname === "/site-taiva". Antes, usuários autenticados acessando / (dashboard) recebiam script-src 'none' e UI travava. Para anon-em-/ (que faz rewrite para landing), CSP restritiva é aplicada localmente no handler do rewrite via novo cspLanding const.
  • 🔒 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 com encryptionKey. 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 validatePasswordPolicy em lib/schemas.ts. (commit b94852c)

Added — Sprint B: ZK strict end-to-end (frontend)

  • B.1: GET endpoint ZK + client crypto library (lib/vault-crypto-zk.ts). (commit 4d9e72a)
  • B.2: POST/PATCH/DELETE ZK + VaultKekProvider Context. (commit 40b66bf)
  • B.3: ZK strict para Notes, TOTP e Export. (commit 48cb22e)
  • B.4: Login deriva KEK localmente + UI tabs credentials/health/adicionar via hooks ZK (useCredentialsZk). (commits 0c3363a, aa575c1, 858b3fc)
  • B.5: Login completion expõe wrappedDek + salt para client decifrar. (commit a046813)
  • 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.dek removida — server NÃO persiste mais DEK na sessão entre requests. Token rotation /api/redefinir agora pede currentToken para server re-derivar transientemente + wipe imediato. (commit c0c17d9)
  • 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. (commits f30588d, 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 bloqueado regression — wire format mismatch + mlKemCtPrimary drop em 2 paths. (commits 015b9ae, 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 replayed do Alpha. (commit 7dda2aa)
  • 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 /login em vez de tela travada. (commit 7c1eaf8)
  • 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-findings ainda 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=1 legacy 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_SECRET em ambos. POST /v1/auth/epsilon-bridge auto-provisiona Org (vault:${userId}). Epsilon proxy GET /api/vault/taiva-bridge + hook useTaivaBridge. 3 tabs (approve B2B, inventário, carteira) consomem /v1/{approvals,documents,assets} reais + paywall FREE→PRO. (commit 2af7fd3)
  • 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) e full-test (:3113 via taiva-vault-test.service next 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). (commit 892c878)
  • 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.db Epsilon via scripts/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). (commit 54d52ae)

Changed

  • Lazy-load 8 dashboard tabs via next/dynamic. (commit fee76be)
  • 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_failed em 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 fix for 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 /landing and 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 travelSafe flag 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.