
Prueba de concepto ejecutable de Spring Boot que reproduce CVE-2026-88901, una vulnerabilidad XXE (CWE-611) en Apache Camel camel-smooks, con ejecuciones de control afectadas y parcheadas.
Reproductor de prueba de concepto ejecutable para la vulnerabilidad de Apache Camel en la que el formato de datos Smooks
(.unmarshal().smooks(...)) y el componente Smooks (smooks:) analizaban el cuerpo XML entrante con el lector
que Smooks resuelve por defecto (el analizador SAX Woodstox), el cual resuelve entidades generales y de parámetro externas y
carga DTDs externos — y camel-smooks no aplicaba ninguna de las protecciones del analizador que aplican los demás componentes XML de Camel.
Por lo tanto, un DOCTYPE con un subconjunto externo, o una entidad general externa, declarada en el documento XML se resuelve
y se expande mientras se deserializa el cuerpo, y el contenido resuelto se vincula al resultado. Un remitente externo
cuyo XML llegue a un formato de datos o endpoint de camel-smooks podría leer archivos legibles por el proceso de Camel, o hacer que el
proceso emita solicitudes a hosts internos (CWE-611). No se requiere ninguna opción no predeterminada — la resolución de entidades externas era
el comportamiento predeterminado.
Solo Spring Boot. Este reproductor incluye un único módulo de Camel Spring Boot.
camel-smooksno tiene una extensióncamel-quarkus-smooks, por lo que no hay una contraparte en Quarkus que reproducir. El módulo de Spring Boot demuestra el comportamiento afectado y el corregido.
| Entorno de ejecución | Directorio | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (afectado; corregido en 4.22.1) |
El driver replica la propia prueba de regresión de la corrección (SmooksDataFormatXmlSecurityTest). Se escribe un archivo marcador benigno
en un directorio temporal, y un documento XML <customer> se deserializa a través del SmooksDataFormat real con
el smooks-config.xml estándar (vinculando el documento a un bean Customer). El firstName del documento es una entidad externa
que apunta al archivo marcador:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName — el archivo
se filtró en el bean deserializado.DocumentBuilder reforzado (entidades externas y carga de DTD externo
deshabilitadas), por lo que la entidad no se resuelve y el marcador nunca aparece.cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: firstName = the marker file content; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-88901-smooks-xxe-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: firstName null, marker not leaked; >>> Not exploited
| Propiedad | Valor |
|---|---|
| Componente | camel-smooks (formato de datos y componente Smooks) |
| CWE | CWE-611 (Restricción inadecuada de la referencia a entidades externas XML) |
| Gravedad | ALTA |
| Vector de ataque | Un remitente externo proporciona el cuerpo del mensaje XML deserializado por un formato de datos o endpoint camel-smooks que utiliza el lector XML predeterminado |
| Impacto | Lectura de archivos locales legibles por el proceso de Camel; SSRF hacia hosts internos que el documento nombre |
| Versiones afectadas | Desde 4.7.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-24677 |
| Reportado por | h1ei1 |
Aviso: https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks ahora preanaliza el XML no confiable con un
javax.xml.parsers.DocumentBuilder configurado con FEATURE_SECURE_PROCESSING y con las entidades generales externas,
las entidades de parámetro externas y la carga de DTD externos deshabilitadas, y entrega a Smooks el DOM resultante,
coincidiendo con la configuración segura utilizada por XmlConverter y los demás componentes XML de Camel. El
endurecimiento se aplica solo cuando la configuración de Smooks analiza XML con su lector predeterminado (por lo que las
configuraciones de EDI, CSV, JSON y de lector personalizado, así como la dirección de marshalling, no cambian). Una nueva
opción allowExternalEntities, deshabilitada de forma predeterminada, restaura el comportamiento anterior para
configuraciones heredadas de confianza.
No aplique camel-smooks a XML recibido de remitentes no confiables.
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. El archivo "secret" es creado por el propio reproductor en un directorio temporal y contiene solo una cadena marcadora benigna; se elimina después de la comprobación. No utilice este material contra sistemas que no sean de su propiedad o que no opere.