
Prueba de concepto ejecutable en Spring Boot y Quarkus para CVE-2026-85243, que demuestra la degradación de la verificación de integridad de Apache Camel camel-crypto-pgp y su corrección.
Reproductor ejecutable de prueba de concepto para la vulnerabilidad de Apache Camel en la que el unmarshal() del formato de datos PGP
verificaba el código de detección de modificaciones solo cuando el mensaje utilizaba el paquete de datos cifrados simétricamente con integridad protegida de OpenPGP. El antiguo paquete de datos cifrados simétricamente no incluye dicho código, y el modo CFB de OpenPGP
es maleable sin él, por lo que un mensaje que utilizaba ese paquete heredado omitía por completo la comprobación de integridad. Dado que el tipo de paquete lo elige quien produce el mensaje, el remitente —o cualquiera capaz de reescribir el mensaje en
tránsito— decidía si la comprobación de integridad se aplicaba o no. La opción integrity existente rige únicamente el marshalling
y no tenía contrapartida en el lado del descifrado, por lo que un despliegue no podía exigir protección de integridad en los mensajes que
aceptaba.
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-crypto-pgp 4.22.0 (afectado; corregido en 4.22.1) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-crypto-pgp (Camel 4.15.0, afectado; control corregido CQ 3.40.0 / Camel 4.22.1) |
Ambos módulos demuestran el comportamiento afectado y el corregido.
El controlador del exploit actúa como un remitente (o un intermediario) que produce un mensaje PGP con el paquete heredado
cifrando con integrity=false — el texto cifrado resultante no incluye ningún código de detección de modificaciones. Después introduce
ese mensaje en una ruta que lo descifra con la clave secreta.
BENIGN-PGP-PAYLOAD-MARKER-5E1F) — la comprobación de integridad
se omitió por completo porque el remitente eligió el paquete heredado. El despliegue aceptó un texto cifrado que no podía
verificar.PGPException — "PGP message is not integrity protected…" —
porque la nueva opción requireIntegrityProtection tiene como valor predeterminado true.Los llaveros (pubring.gpg, secring.gpg, con id de usuario y contraseña ambos sdude) son los fixtures de prueba RSA-2048 públicos
de las propias pruebas de camel-crypto-pgp de Apache Camel — material inerte, incluido para que el ciclo completo sea autocontenido.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: legacy message decrypts; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85243-crypto-pgp-integrity-downgrade-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): legacy message decrypts
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"
| Propiedad | Valor |
|---|---|
| Componente | camel-crypto-pgp (PGPKeyAccessDataFormat.unmarshal) |
| CWE | CWE-354 (Validación incorrecta del valor de verificación de integridad) |
| Severidad | MEDIA |
| Vector de ataque | Un mensaje producido con el paquete de datos cifrado simétricamente heredado (sin código de detección de modificaciones) |
| Impacto | Degradación de la verificación de integridad: el remitente/intermediario decide si se ejecuta la comprobación de integridad; se acepta texto cifrado maleable sin verificación |
| Versiones afectadas | Desde 4.0.0 anterior a 4.18.5, desde 4.19.0 anterior a 4.22.1 |
| Versiones corregidas | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24441 |
| Crédito | Claude Security Scan Tool |
Aviso: https://camel.apache.org/security/CVE-2026-85243.html
PGPKeyAccessDataFormat.unmarshal añade una opción requireIntegrityProtection
(por defecto true). Cuando un mensaje no es un paquete protegido por integridad y la opción está habilitada, unmarshal
ahora lanza PGPException("PGP message is not integrity protected…") en lugar de descifrarlo. Tenga en cuenta que
signatureVerificationOption sigue teniendo como valor predeterminado optional, por lo que un mensaje que no lleva firma
sigue siendo aceptado; las dos opciones juntas son lo que otorga autenticidad a un mensaje descifrado y no solo
confidencialidad. Establezca requireIntegrityProtection=false únicamente para interoperar con un remitente que aún emite
el paquete heredado, y trate el contenido descifrado como no autenticado.
Rechace los mensajes que no utilicen el paquete protegido por integridad antes de que lleguen al formato de datos (por ejemplo, inspeccione
la cabecera del paquete OpenPGP en un procesador antes de unmarshal).
Este repositorio se publica con fines educativos y defensivos: para ayudar a los usuarios de Apache Camel a comprender la vulnerabilidad, verificar si se ven afectados y confirmar que la actualización la resuelve. Los llaveros y el texto plano son fixtures de prueba públicos e inertes. No utilice este material contra sistemas que no sean de su propiedad o que no opere.