Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en OpenPGP.js (CVE-2025-47934)

Gravedad CVSS v4.0:
ALTA
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
19/05/2025
Última modificación:
21/05/2025

Descripción

OpenPGP.js es una implementación en JavaScript del protocolo OpenPGP. A partir de la versión 5.0.1 y anteriores a las versiones 5.11.3 y 6.1.1, se puede pasar un mensaje modificado maliciosamente a `openpgp.verify` o `openpgp.decrypt`, lo que provoca que estas funciones devuelvan un resultado de verificación de firma válido, pero que devuelvan datos no firmados. Esta falla permite falsificar las verificaciones de firma de mensajes firmados en línea (no separados) (mediante `openpgp.verify`) y de mensajes firmados y cifrados (mediante `openpgp.decrypt` con `verificationKeys`), ya que ambas funciones devuelven datos extraídos que podrían no coincidir con los datos firmados originalmente. Las verificaciones de firma separadas no se ven afectadas, ya que en ese caso no se devuelven datos firmados. Para falsificar un mensaje, el atacante necesita una única firma de mensaje válida (en línea o separada), así como los datos de texto plano firmados legítimamente. Posteriormente, puede construir un mensaje firmado en línea o firmado y cifrado con cualquier dato que elija, que aparecerá como firmado legítimamente en las versiones afectadas de OpenPGP.js. En otras palabras, cualquier mensaje firmado en línea puede modificarse para que devuelva cualquier otro dato (sin dejar de indicar que la firma era válida). Lo mismo ocurre con los mensajes firmados y cifrados si el atacante puede obtener una firma válida y cifrar un nuevo mensaje (a elección del atacante) junto con esa firma. El problema se ha corregido en las versiones 5.11.3 y 6.1.1. Existen algunas workarounds. Al verificar mensajes firmados en línea, extraiga el mensaje y las firmas del mensaje devuelto por `openpgp.readMessage` y verifique cada firma como una firma independiente. Para ello, pase la firma y un nuevo mensaje que contenga solo los datos (creado con `openpgp.createMessage`) a `openpgp.verify`. Al descifrar y verificar mensajes firmados y cifrados, descifre y verifique el mensaje en dos pasos: primero, llame a `openpgp.decrypt` sin `verificationKeys` y, a continuación, pase las firmas devueltas y un nuevo mensaje que contenga los datos descifrados (creado con `openpgp.createMessage`) a `openpgp.verify`.