SOAP/JAX-WS ThreadLocal Authentication Bypass
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Kurzfassung
- Einige Middleware-Ketten speichern das authentifizierte
Subject/Principalin einem statischenThreadLocalund aktualisieren es nur, wenn ein proprietärer SOAP-Header eintrifft. - Da WebLogic/JBoss/GlassFish Worker-Threads recyceln, führt das Weglassen dieses Headers dazu, dass das zuletzt vom Thread verarbeitete privilegierte
Subjectstillschweigend wiederverwendet wird. - Führe wiederholt header-losen, aber wohlgeformten SOAP-Requests an das verwundbare endpoint aus, bis ein wiederverwendeter Thread dir den gestohlenen Administrator-Kontext gewährt.
- 2025 HID ActivID/IASP (HID-PSA-2025-002) ist ein reales Beispiel: Ein JAX-WS Handler speichert ein
SubjectHolderThreadLocal, wodurch nicht-authentifizierte SOAP-Aufrufe die Identität übernehmen, die durch vorherige console/SSP-Anfragen gesetzt wurde.
Ursache
Handler wie der folgende überschreiben die ThreadLocal-Identität nur, wenn der eigene Header vorhanden ist, sodass der Kontext der vorherigen Anfrage erhalten bleibt:
public boolean handleMessage(SOAPMessageContext ctx) {
if (!outbound) {
SOAPHeader hdr = ctx.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPHeaderElement e = findHeader(hdr, subjectName);
if (e != null) {
SubjectHolder.setSubject(unmarshal(e));
}
}
return true;
}
Recon
- Ermittle die reverse-proxy-/Routing-Regeln, um versteckte SOAP-Bäume zu lokalisieren, die
?wsdlblockieren, aber POSTs akzeptieren (mappe sie entlang des Flows in 80,443 - Pentesting Web Methodology). - Entpacke die EAR/WAR/EJB-Artefakte (
unzip *.ear) und untersucheapplication.xml,web.xml,@WebService-Annotationen und Handler-Chains (z. B.LoginHandlerChain.xml), um die Handler-Klasse, den SOAP-Header-QName und die zugrundeliegenden EJB-Namen aufzudecken. - Falls Metadaten fehlen, brute-force wahrscheinliche
ServiceName?wsdl-Pfade oder lockere temporär Lab-Proxies, importiere dann jegliche wiedergewonnene WSDL in Tools wie Burp Suite Wsdler, um Basis-Envelopes zu generieren. - Überprüfe die Handler-Quellen auf
ThreadLocal-Keeper (z. B.SubjectHolder.setSubject()), die nicht gelöscht werden, wenn der Authentifizierungsheader fehlt oder fehlerhaft ist.
Exploitation
- Sende eine gültige Anfrage mit dem proprietären Header, um die normalen Response-Codes und etwaige Fehler für ungültige Tokens zu ermitteln.
- Sende denselben SOAP-Body erneut, während du den Header weglässt. Halte das XML wohlgeformt und beachte die erforderlichen Namespaces, damit der Handler sauber beendet.
- Schleife die Anfrage; trifft sie auf einen Thread, der zuvor eine privilegierte Aktion ausgeführt hat, gibt das wiederverwendete
SubjectZugriff auf geschützte Operationen wie Benutzer- oder Credential-Manager frei.
POST /ac-iasp-backend-jaxws/UserManager HTTP/1.1
Host: target
Content-Type: text/xml;charset=UTF-8
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:jax="http://jaxws.user.frontend.iasp.service.actividentity.com">
<soapenv:Header/>
<soapenv:Body>
<jax:findUserIds>
<arg0></arg0>
<arg1>spl*</arg1>
</jax:findUserIds>
</soapenv:Body>
</soapenv:Envelope>
2025 HID ActivID/IASP Fallstudie (HID-PSA-2025-002)
- Synacktiv zeigte, dass der JAX-WS
LoginHandlerin ActivID 8.6–8.7SubjectHolder.subjectsetzt, wenn einmySubjectHeaderSOAP-Header vorhanden ist oder wenn Konsolen-/SSP-Verkehr authentifiziert, aber diesen nie löscht, wenn der Header fehlt. - Jeder nachfolgende SOAP-Aufruf ohne Header im selben Worker-Thread erbt dieses zwischengespeicherte
Subject, was die nicht authentifizierte Erstellung von Administrator-Benutzern oder den Import von Credentials über Endpunkte wieUserManageroderCredentialManagerermöglicht. - Beobachtetes, zuverlässiges Exploit-Muster:
- Erzeuge in vielen Threads einen authentifizierten Kontext (z. B. /ssp fluten oder sich in einem anderen Browser-Tab als Admin bei /aiconsole einloggen).
- Sende mit hoher Parallelität headerfreie SOAP-Bodies an
/ac-iasp-backend-jaxws/UserManageroder andere EJB-gestützte JAX-WS-Endpunkte; jeder Treffer, der einen “infizierten” Thread wiederverwendet, läuft mit erhöhtemSubject. - Wiederholen, bis privilegierte Antworten zurückkommen; Keep-Alive-Verbindungen und große Worker-Pools wiederverwenden, um die Wahrscheinlichkeit der Thread-Wiederverwendung zu maximieren.
- Handler- und Prozessfluss-Höhepunkte:
LoginHandlerChain.xml→LoginHandler.handleMessage()unmarshaltmySubjectHeaderund speichert dasSubjectinSubjectHolder(ein statischesThreadLocal).ProcessManager.triggerProcess()injiziert späterSubjectHolder.getSubject()in Geschäftsprozesse, sodass fehlende Header zu stale Identitäten führen.- In-field PoC aus dem Advisory verwendet einen zweistufigen SOAP-Abuse: zuerst
getUsers, um info zu leaken, danncreateUser+importCredential, um einen Rogue-Admin zu platzieren, wenn der privilegierte Thread trifft.
Validierung des Bugs
- Hänge JDWP (
-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) oder ähnliche Debugging-Hooks an, um den Inhalt desThreadLocalvor und nach jedem Aufruf zu beobachten und zu bestätigen, dass eine nicht-authentifizierte Anfrage ein vorheriges Administrator-Subjectgeerbt hat. - In Produktions-Appliances kann man auch mit JFR oder BTrace instrumentieren, um
SubjectHolder.getSubject()pro Anfrage zu dumpen und die headerfreie Wiederverwendung zu verifizieren.
References
- Synacktiv – ActivID authentication bypass (HID-PSA-2025-002)
- HID Global – Product Security Advisory HID-PSA-2025-002 SOAP-API Authentication Bypass
- Synacktiv – ActivID administrator account takeover: the story behind HID-PSA-2025-002
- PortSwigger – Wsdler (WSDL parser) extension
Tip
Lernen & üben Sie AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.


