
Lauffähiger Spring-Boot-Proof-of-Concept zur Reproduktion von CVE-2026-88901, einer XXE-Schwachstelle (CWE-611) in Apache Camel camel-smooks, mit Kontrollläufen für die verwundbare und die gepatchte Version.
Lauffähiger Proof-of-Concept-Reproduzierer für die Apache-Camel-Schwachstelle, bei der das Smooks-Datenformat
(.unmarshal().smooks(...)) und die Smooks-Komponente (smooks:) den eingehenden XML-Body mit dem Reader parsten,
den Smooks standardmäßig auflöst (dem Woodstox-SAX-Parser), der externe allgemeine und Parameter-Entities auflöst und
externe DTDs lädt — und camel-smooks wandte keine der Parser-Härtungen an, die die anderen Camel-XML-Komponenten
anwenden. Ein DOCTYPE mit einer externen Subset oder eine externe allgemeine Entity, die im XML-Dokument deklariert
ist, wird daher während des Unmarshallings des Bodys aufgelöst und expandiert, und der aufgelöste Inhalt wird in das
Ergebnis gebunden. Ein externer Absender, dessen XML ein camel-smooks-Datenformat oder einen Endpoint erreicht, könnte
Dateien lesen, die für den Camel-Prozess lesbar sind, oder den Prozess dazu bringen, Anfragen an interne Hosts zu senden
(CWE-611). Es ist keine Nicht-Standard-Option erforderlich — das Auflösen externer Entities war das Standardverhalten.
Nur Spring Boot. Dieser Reproduzierer enthält ein einzelnes Camel-Spring-Boot-Modul.
camel-smookshat keinecamel-quarkus-smooks-Erweiterung, daher gibt es kein Quarkus-Pendant zur Reproduktion. Das Spring-Boot-Modul demonstriert das betroffene und das behobene Verhalten.
| Laufzeit | Verzeichnis | Stack |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-smooks 4.22.0 (betroffen; behoben in 4.22.1) |
Der Treiber spiegelt den eigenen Regressionstest des Fixes (SmooksDataFormatXmlSecurityTest). Eine harmlose
Marker-Datei wird in ein temporäres Verzeichnis geschrieben, und ein XML-<customer>-Dokument wird durch das echte
SmooksDataFormat mit der mitgelieferten smooks-config.xml unmarshalled (wobei das Dokument in ein Customer-Bean
gebunden wird). Der firstName des Dokuments ist eine externe Entity, die auf die Marker-Datei verweist:
<!DOCTYPE customer [<!ENTITY xxe SYSTEM "file:///…/secret.txt">]>
<customer><firstName>&xxe;</firstName>…</customer>
Customer.firstName gebunden wird — die Datei
gelangt in das unmarshallisierte Bean.DocumentBuilder vorab geparst (externe Entitäten und das Laden externer DTDs
deaktiviert), sodass die Entität nicht aufgelöst wird und der Marker nie erscheint.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
| Eigenschaft | Wert |
|---|---|
| Komponente | camel-smooks (Smooks-Datenformat und -Komponente) |
| CWE | CWE-611 (Improper Restriction of XML External Entity Reference) |
| Schweregrad | HOCH |
| Angriffsvektor | Ein externer Absender liefert den XML-Nachrichtentext, der von einem camel-smooks-Datenformat oder -Endpoint unter Verwendung des Standard-XML-Readers unmarshalled wird |
| Auswirkung | Lesen lokaler Dateien, die für den Camel-Prozess lesbar sind; SSRF zu internen Hosts, die das Dokument benennt |
| Betroffene Versionen | Von 4.7.0 vor 4.18.5, von 4.19.0 vor 4.22.1 |
| Behobene Versionen | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24677 |
| Gemeldet von | h1ei1 |
Advisory: https://camel.apache.org/security/CVE-2026-88901.html
camel-smooks parst nicht vertrauenswürdiges XML nun vorab mit einem
javax.xml.parsers.DocumentBuilder, der mit FEATURE_SECURE_PROCESSING konfiguriert ist und bei dem externe allgemeine Entitäten,
externe Parameterentitäten und das Laden externer DTDs deaktiviert sind, und übergibt Smooks das resultierende DOM — entsprechend der sicheren
Konfiguration, die von XmlConverter und den anderen Camel-XML-Komponenten verwendet wird. Die Härtung greift nur, wenn die Smooks-
Konfiguration XML mit ihrem Standard-Reader parst (sodass EDI-, CSV-, JSON- und benutzerdefinierte Reader-Konfigurationen sowie die
Marshalling-Richtung unverändert bleiben). Eine neue Option allowExternalEntities, standardmäßig deaktiviert, stellt das vorherige
Verhalten für vertrauenswürdige Legacy-Konfigurationen wieder her.
Wenden Sie camel-smooks nicht auf XML an, das von nicht vertrauenswürdigen Absendern empfangen wurde.
Dieses Repository wird zu Bildungs- und Verteidigungszwecken veröffentlicht: um Apache Camel-Benutzern zu helfen, die Schwachstelle zu verstehen, zu überprüfen, ob sie betroffen sind, und zu bestätigen, dass ein Upgrade sie behebt. Die „secret“-Datei wird vom Reproducer selbst in einem temporären Verzeichnis erstellt und enthält nur eine harmlose Marker-Zeichenkette; sie wird nach der Prüfung gelöscht. Verwenden Sie dieses Material nicht gegen Systeme, die Ihnen nicht gehören oder die Sie nicht betreiben.