SOAP/JAX-WS ThreadLocal Authentication Bypass
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
TL;DR
- Ορισμένες αλυσίδες middleware αποθηκεύουν το πιστοποιημένο
Subject/Principalμέσα σε ένα staticThreadLocalκαι το ανανεώνουν μόνο όταν φτάνει μία ιδιόκτητη κεφαλίδα SOAP. - Επειδή οι WebLogic/JBoss/GlassFish ανακυκλώνουν τα worker threads, η παράλειψη αυτής της κεφαλίδας προκαλεί το τελευταίο προνομιούχο
Subjectπου επεξεργάστηκε το thread να επαναχρησιμοποιηθεί αθόρυβα. - Πλήξτε το ευάλωτο endpoint με σωστά δομημένα, χωρίς κεφαλίδα SOAP σώματα μέχρι ένα επαναχρησιμοποιημένο thread να σας προσφέρει το κλεμμένο context του διαχειριστή.
- Το 2025 HID ActivID/IASP (HID-PSA-2025-002) είναι ένα πραγματικό παράδειγμα: ένας JAX-WS handler αποθηκεύει ένα
SubjectHolderThreadLocalστην cache, επιτρέποντας σε μη-επαληθευμένες SOAP κλήσεις να κληρονομήσουν την ταυτότητα που ορίστηκε από προηγούμενα console/SSP αιτήματα.
Αιτία
Handlers similar to the following only overwrite the thread-local identity when the custom header is present, so the previous request’s context survives:
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;
}
Αναγνώριση
- Καταγράψτε τους κανόνες reverse proxy / δρομολόγησης για να εντοπίσετε κρυφά SOAP δέντρα που μπορεί να μπλοκάρουν το
?wsdlyet accept POSTs (map them alongside the flow in 80,443 - Pentesting Web Methodology). - Αποσυμπιέστε τα artifacts EAR/WAR/EJB (
unzip *.ear) και ελέγξτε ταapplication.xml,web.xml,@WebServiceannotations, και τα handler chains (π.χ.LoginHandlerChain.xml) για να αποκαλύψετε την κλάση handler, το SOAP header QName, και τα ονόματα των υποστηρικτικών EJB. - Αν λείπει metadata, brute-force πιθανές διαδρομές
ServiceName?wsdlή χαλαρώστε προσωρινά τους lab proxies, έπειτα εισάγετε οποιοδήποτε ανακτημένο WSDL σε εργαλεία όπως Burp Suite Wsdler για να δημιουργήσετε baseline envelopes. - Ελέγξτε τους πηγαίους κώδικες των handlers για
ThreadLocalkeepers (π.χ.SubjectHolder.setSubject()) που δεν καθαρίζονται ποτέ όταν το authentication header λείπει ή είναι κατεστραμμένο.
Εκμετάλλευση
- Στείλτε ένα έγκυρο αίτημα με το ιδιόκτητο header για να μάθετε τους κανονικούς κωδικούς απόκρισης και τυχόν σφάλματα που χρησιμοποιούνται για άκυρα tokens.
- Ξαναστείλτε το ίδιο SOAP σώμα ενώ παραλείπετε το header. Κρατήστε το XML καλά-μορφωμένο και σεβαστείτε τα απαιτούμενα namespaces ώστε ο handler να τερματίσει καθαρά.
- Κάντε επαναληπτικά το αίτημα· όταν προσγειωθεί σε ένα thread που προηγουμένως εκτέλεσε μια προνομιούχα ενέργεια, το επαναχρησιμοποιημένο
Subjectξεκλειδώνει προστατευμένες λειτουργίες όπως user ή credential managers.
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 case study (HID-PSA-2025-002)
- Η Synacktiv έδειξε ότι ο JAX-WS
LoginHandlerστο ActivID 8.6–8.7 ορίζει τοSubjectHolder.subjectόταν υπάρχει ένα SOAP headermySubjectHeaderή όταν η κίνηση console/SSP αυθεντικοποιείται, αλλά δεν το καθαρίζει ποτέ όταν το header λείπει. - Οποιαδήποτε επόμενη κλήση SOAP χωρίς το header στον ίδιο worker thread κληρονομεί το αποθηκευμένο
Subject, επιτρέποντας τη μη-αυθεντικοποιημένη δημιουργία administrator χρηστών ή την εισαγωγή credentials μέσω endpoints όπωςUserManagerήCredentialManager. - Παρατηρήθηκε αξιόπιστο μοτίβο εκμετάλλευσης:
- Δημιουργήστε ένα αυθεντικοποιημένο context σε πολλούς threads (π.χ. στείλτε spam σε
/sspή κάντε login στο/aiconsoleως admin σε άλλη καρτέλα του browser). - Πλημμυρίστε SOAP σώματα χωρίς header προς
/ac-iasp-backend-jaxws/UserManagerή άλλα EJB-backed JAX-WS endpoints με υψηλή παραλληλία· κάθε αίτημα που επαναχρησιμοποιεί ένα “infected” thread εκτελείται με ανυψωμένοSubject. - Επαναλάβετε μέχρι να επιστραφούν προνομιακές απαντήσεις· επαναχρησιμοποιήστε Keep-Alive connections και μεγάλα worker pools για να μεγιστοποιήσετε την πιθανότητα επαναχρησιμοποίησης threads.
- Σημεία-κλειδιά του handler και της ροής διεργασίας:
LoginHandlerChain.xml→LoginHandler.handleMessage()κάνει unmarshal τοmySubjectHeaderκαι αποθηκεύει τοSubjectστοSubjectHolder(ένα staticThreadLocal).- Το
ProcessManager.triggerProcess()εισάγει αργότερα τοSubjectHolder.getSubject()στις επιχειρησιακές διεργασίες, οπότε τα απουσιάζοντα headers αφήνουν τις παλιές ταυτότητες ανέπαφες. - Η in-field PoC από το advisory χρησιμοποιεί κακοποίηση SOAP σε δύο βήματα: πρώτα
getUsersγια να leak πληροφορίες, έπειταcreateUser+importCredentialγια να φυτέψει έναν rogue admin όταν χτυπήσει το προνομιούχο thread.
Επικύρωση του Σφάλματος
- Συνδέστε JDWP (
-agentlib:jdwp=transport=dt_socket,server=y,address=5005,suspend=n) ή παρόμοια debugging hooks για να παρακολουθήσετε το περιεχόμενο τουThreadLocalπριν και μετά από κάθε κλήση, επιβεβαιώνοντας ότι ένα μη-αυθεντικοποιημένο αίτημα κληρονόμησε ένα προηγούμενο administratorSubject. - Σε production appliances μπορείτε επίσης να κάνετε instrumentation με JFR ή BTrace για να κάνετε dump το
SubjectHolder.getSubject()ανά αίτημα, επαληθεύοντας την επαναχρησιμοποίηση χωρίς header.
Αναφορές
- 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
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


