SOAP/JAX-WS ThreadLocal Authentication Bypass
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
TL;DR
- Alcune catene middleware memorizzano il
Subject/Principalautenticato dentro unoThreadLocalstatico e lo aggiornano solo quando arriva un header SOAP proprietario. - Poiché WebLogic/JBoss/GlassFish riciclano i thread di lavoro, l’assenza di quell’header fa sì che l’ultimo
Subjectprivilegiato processato dal thread venga riutilizzato silenziosamente. - Bombarda l’endpoint vulnerabile con body SOAP privi dell’header ma ben formati finché un thread riutilizzato non ti concede il contesto amministratore rubato.
- Il caso reale del 2025 HID ActivID/IASP (HID-PSA-2025-002): un handler JAX-WS memorizza nella cache un
SubjectHolderThreadLocal, permettendo a chiamate SOAP non autenticate di ereditare l’identità impostata da precedenti richieste console/SSP.
Causa principale
Handler simili al seguente sovrascrivono l’identità ThreadLocal solo quando è presente l’header personalizzato, quindi il contesto della richiesta precedente sopravvive:
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;
}
Ricognizione
- Esegui l’enumerazione delle regole del reverse proxy / routing per individuare alberi SOAP nascosti che possono bloccare
?wsdlma accettare POST (mappali insieme al flusso in 80,443 - Pentesting Web Methodology). - Estrai gli artifact EAR/WAR/EJB (
unzip *.ear) e ispezionaapplication.xml,web.xml, le annotazioni@WebServicee le handler chain (es.,LoginHandlerChain.xml) per scoprire la classe handler, il QName dell’header SOAP e i nomi degli EJB sottostanti. - Se i metadata mancano, forza per tentativi i probabili percorsi
ServiceName?wsdlo rilassa temporaneamente i proxy di laboratorio, poi importa qualsiasi WSDL recuperato in tooling come Burp Suite Wsdler per generare envelope di base. - Esamina il sorgente degli handler alla ricerca di keeper
ThreadLocal(es.,SubjectHolder.setSubject()) che non vengono mai puliti quando l’header di autenticazione manca o è malformato.
Sfruttamento
- Invia una richiesta valida con l’header proprietario per apprendere i codici di risposta normali e gli eventuali errori usati per token non validi.
- Reinvia lo stesso body SOAP omettendo l’header. Mantieni l’XML ben formato e rispetta gli namespace richiesti in modo che l’handler termini correttamente.
- Ripeti la richiesta in loop; quando viene servita da un thread che in precedenza ha eseguito un’azione privilegiata, il
Subjectriutilizzato sblocca operazioni protette come i gestori utenti o delle credenziali.
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 Studio di caso HID ActivID/IASP (HID-PSA-2025-002)
- Synacktiv ha mostrato che il JAX-WS
LoginHandlerin ActivID 8.6–8.7 impostaSubjectHolder.subjectquando è presente un header SOAPmySubjectHeadero quando il traffico console/SSP si autentica, ma non lo cancella mai quando l’header è assente. - Qualsiasi chiamata SOAP successiva priva dell’header sullo stesso thread worker eredita quel
Subjectmemorizzato nella cache, permettendo la creazione non autenticata di utenti amministratori o l’importazione di credenziali tramite endpoint comeUserManageroCredentialManager. - Pattern di sfruttamento affidabile osservato:
- Indurre un contesto autenticato su molti thread (es. spam di
/sspo login su/aiconsolecome admin in un’altra tab del browser). - Inviare in massa corpi SOAP privi di header a
/ac-iasp-backend-jaxws/UserManagero ad altri endpoint JAX-WS basati su EJB con alta parallelità; ogni hit che riusa un thread “infettato” viene eseguito con ilSubjectelevato. - Ripetere finché non si ricevono risposte privilegiate; riutilizzare connessioni Keep-Alive e grandi pool di worker per massimizzare la probabilità di riuso dei thread.
- Punti salienti di handler e flow di processo:
LoginHandlerChain.xml→LoginHandler.handleMessage()unmarshalsmySubjectHeadere salva ilSubjectinSubjectHolder(unThreadLocalstatico).ProcessManager.triggerProcess()in seguito iniettaSubjectHolder.getSubject()nei processi di business, quindi header mancanti lasciano identità stale intatte.- Il PoC in campo dall’advisory usa un abuso SOAP in due fasi: prima
getUsersper leak di info, poicreateUser+importCredentialper piantare un admin rogue quando il thread privilegiato viene colpito.
Validazione del bug
- Allegare JDWP (
-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) o hook di debug simili per osservare il contenuto delThreadLocalprima e dopo ogni chiamata, confermando che una richiesta non autenticata ha ereditato un precedenteSubjectdi amministratore. - Su appliance di produzione è possibile anche instrumentare con JFR o BTrace per dumpare
SubjectHolder.getSubject()per richiesta, verificando il riuso senza header.
Riferimenti
- 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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


