StenVault
Voltar ao blog
cvef18 de abril de 2026 · 7 min de leitura

CVEF v1.4: sobreviver ao ataque de downgrade da v1.3

G
Gefson Costa
cvef

Todo o formato de ficheiro encriptado tem de responder a uma pergunta discreta: o que impede um atacante de editar as partes que não são secretas? O formato de ficheiro do StenVault, o CVEF, aprendeu a resposta da forma mais difícil — e a v1.4 é a correção.

Um ficheiro CVEF é um pequeno cabeçalho, um bloco de metadados JSON e o payload encriptado. Os metadados declaram a suite criptográfica: o algoritmo, a chave de ficheiro empacotada e — a partir da v1.3 — uma assinatura híbrida (Ed25519 + ML-DSA-65) que prova quem selou o ficheiro.

A falha: metadados que ninguém autenticava

Até à v1.3, esses metadados JSON não eram nem encriptados nem autenticados. A etiqueta AES-256-GCM cobria o payload, não o cabeçalho à sua volta. Para a maioria dos campos isto falha de forma segura — altere a chave empacotada e a desencriptação produz simplesmente lixo e aborta. Um campo não falhava de forma segura: o version.

As assinaturas no CVEF são apenas de metadados — não são necessárias para desencriptar o ficheiro. Por isso, um atacante com acesso de escrita a um ficheiro armazenado podia pegar num ficheiro v1.3 assinado, remover o campo `signatureParams` e mudar `version` de `1.3` para `1.2`. O resultado é um ficheiro v1.2 perfeitamente válido. Desencripta corretamente. E não carrega qualquer assinatura — sem forma de o destinatário saber que alguma vez existiu uma.

Esta é a forma clássica do downgrade: não quebrar a criptografia, apenas convencer o leitor a descer para um modo mais fraco. É da mesma família que o signature-stripping do TLS, e desfaz silenciosamente o não-repúdio que as assinaturas da v1.3 deveriam proporcionar.

A correção: vincular a versão ao texto cifrado

A v1.4 fecha a falha ao autenticar os próprios metadados. O cabeçalho serializado — incluindo o version e os parâmetros de assinatura — é fornecido ao AEAD como Additional Authenticated Data (AAD). A etiqueta GCM cobre agora tanto o payload como os metadados que o descrevem.

AES-256-GCM(
  key:        fileKey,
  iv:         iv,
  plaintext:  fileBytes,
  aad:        canonical(metadata)   ← new in v1.4
)

Inverta um único byte do cabeçalho — faça downgrade da versão, remova a assinatura, troque o nome de um algoritmo — e a etiqueta deixa de verificar. A desencriptação aborta antes de qualquer texto simples ser produzido. O downgrade não é detetado a posteriori; é estruturalmente impossível fazê-lo passar por válido.

É a mesma defesa que o Age (HMAC sobre o cabeçalho), o JWE (cabeçalho protegido como AAD) e o COSE usam: vincular a descrição do texto cifrado ao próprio texto cifrado é a única forma de fazer falhar qualquer adulteração.

Retrocompatibilidade, sem o tiro no pé

O CVEF é versionado precisamente por esta razão. Os novos ficheiros são escritos como v1.4; o leitor continua a aceitar v1.2, v1.3 e v1.4 para que os vaults existentes continuem a abrir. O que não fará é aceitar silenciosamente um ficheiro v1.3 cuja assinatura tenha sido descascada — a vinculação por AAD torna a versão parte da prova, não uma pista em que o leitor tem de confiar.

A boa criptografia raramente tem a ver com um algoritmo mais engenhoso. Mais frequentemente, tem a ver com não deixar qualquer superfície não autenticada em que um atacante se possa apoiar. A v1.4 remove a última que o CVEF tinha.

Quer todo o detalhe criptográfico?Ler a página de segurança

Experimente o StenVault grátis

Armazenamento na cloud encriptado zero-knowledge com proteção pós-quântica. 5 GB grátis, sem cartão de crédito.

Sem cartão de crédito · 5 GB grátis para sempre