StenVault
Volver al blog
cvef18 de abril de 2026 · 7 min de lectura

CVEF v1.4: sobrevivir al ataque de downgrade de la v1.3

G
Gefson Costa
cvef

Todo formato de archivo cifrado tiene que responder a una pregunta silenciosa: ¿qué impide que un atacante edite las partes que no son secretas? El formato de archivo de StenVault, CVEF, aprendió la respuesta por las malas — y la v1.4 es la solución.

Un archivo CVEF es una pequeña cabecera, un bloque de metadatos JSON y la carga útil cifrada. Los metadatos declaran la suite criptográfica: el algoritmo, la clave de archivo empaquetada y — desde la v1.3 — una firma híbrida (Ed25519 + ML-DSA-65) que demuestra quién selló el archivo.

El hueco: metadatos que nadie autenticaba

Hasta la v1.3, esos metadatos JSON no estaban ni cifrados ni autenticados. La etiqueta de AES-256-GCM cubría la carga útil, no la cabecera que la rodea. Para la mayoría de los campos esto falla de forma segura — cambia la clave empaquetada y el descifrado simplemente produce basura y se aborta. Un campo no fallaba de forma segura: la version.

Las firmas en CVEF son solo de metadatos — no se necesitan para descifrar el archivo. Así que un atacante con acceso de escritura a un archivo almacenado podía tomar un archivo v1.3 firmado, eliminar el campo `signatureParams` y cambiar `version` de `1.3` a `1.2`. El resultado es un archivo v1.2 perfectamente válido. Se descifra correctamente. Y no lleva ninguna firma — sin forma de que el destinatario sepa que alguna vez la hubo.

Esta es la forma clásica de downgrade: no rompas la criptografía, simplemente convence al lector de pasar a un modo más débil. Es la misma familia que el signature-stripping de TLS, y deshace silenciosamente el no repudio que las firmas de la v1.3 debían proporcionar.

La solución: vincular la versión al texto cifrado

La v1.4 cierra el hueco autenticando los propios metadatos. La cabecera serializada — incluyendo la version y los parámetros de firma — se introduce en el AEAD como Additional Authenticated Data (AAD). La etiqueta GCM ahora cubre tanto la carga útil como los metadatos que la describen.

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

Cambia un solo byte de la cabecera — degrada la versión, elimina la firma, intercambia el nombre de un algoritmo — y la etiqueta deja de verificarse. El descifrado se aborta antes de producir cualquier texto claro. El downgrade no se detecta a posteriori; es estructuralmente imposible hacerlo pasar por válido.

Es la misma defensa que usan Age (HMAC sobre la cabecera), JWE (cabecera protegida como AAD) y COSE: vincular la descripción del texto cifrado al texto cifrado es la única forma de hacer que manipularlo falle.

Compatibilidad hacia atrás, sin el tiro en el pie

CVEF está versionado precisamente por esta razón. Los archivos nuevos se escriben como v1.4; el lector sigue aceptando v1.2, v1.3 y v1.4 para que los vaults existentes sigan abriéndose. Lo que no hará es aceptar en silencio un archivo v1.3 cuya firma se haya arrancado — la vinculación por AAD hace que la versión sea parte de la prueba, no una pista en la que el lector tenga que confiar.

La buena criptografía rara vez consiste en un algoritmo más ingenioso. Más a menudo consiste en no dejar ninguna superficie sin autenticar en la que un atacante pueda apoyarse. La v1.4 elimina la última que tenía CVEF.

¿Quieres todo el detalle criptográfico?Lee la página de seguridad

Prueba StenVault gratis

Almacenamiento en la nube cifrado zero-knowledge con protección poscuántica. 5 GB gratis, sin tarjeta de crédito.

Sin tarjeta de crédito · 5 GB gratis para siempre