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

TL;DR

  • Ορισμένες αλυσίδες middleware αποθηκεύουν το πιστοποιημένο Subject/Principal μέσα σε ένα static ThreadLocal και το ανανεώνουν μόνο όταν φτάνει μία ιδιόκτητη κεφαλίδα SOAP.
  • Επειδή οι WebLogic/JBoss/GlassFish ανακυκλώνουν τα worker threads, η παράλειψη αυτής της κεφαλίδας προκαλεί το τελευταίο προνομιούχο Subject που επεξεργάστηκε το thread να επαναχρησιμοποιηθεί αθόρυβα.
  • Πλήξτε το ευάλωτο endpoint με σωστά δομημένα, χωρίς κεφαλίδα SOAP σώματα μέχρι ένα επαναχρησιμοποιημένο thread να σας προσφέρει το κλεμμένο context του διαχειριστή.
  • Το 2025 HID ActivID/IASP (HID-PSA-2025-002) είναι ένα πραγματικό παράδειγμα: ένας JAX-WS handler αποθηκεύει ένα SubjectHolder ThreadLocal στην 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;
}

Αναγνώριση

  1. Καταγράψτε τους κανόνες reverse proxy / δρομολόγησης για να εντοπίσετε κρυφά SOAP δέντρα που μπορεί να μπλοκάρουν το ?wsdl yet accept POSTs (map them alongside the flow in 80,443 - Pentesting Web Methodology).
  2. Αποσυμπιέστε τα artifacts EAR/WAR/EJB (unzip *.ear) και ελέγξτε τα application.xml, web.xml, @WebService annotations, και τα handler chains (π.χ. LoginHandlerChain.xml) για να αποκαλύψετε την κλάση handler, το SOAP header QName, και τα ονόματα των υποστηρικτικών EJB.
  3. Αν λείπει metadata, brute-force πιθανές διαδρομές ServiceName?wsdl ή χαλαρώστε προσωρινά τους lab proxies, έπειτα εισάγετε οποιοδήποτε ανακτημένο WSDL σε εργαλεία όπως Burp Suite Wsdler για να δημιουργήσετε baseline envelopes.
  4. Ελέγξτε τους πηγαίους κώδικες των handlers για ThreadLocal keepers (π.χ. SubjectHolder.setSubject()) που δεν καθαρίζονται ποτέ όταν το authentication header λείπει ή είναι κατεστραμμένο.

Εκμετάλλευση

  1. Στείλτε ένα έγκυρο αίτημα με το ιδιόκτητο header για να μάθετε τους κανονικούς κωδικούς απόκρισης και τυχόν σφάλματα που χρησιμοποιούνται για άκυρα tokens.
  2. Ξαναστείλτε το ίδιο SOAP σώμα ενώ παραλείπετε το header. Κρατήστε το XML καλά-μορφωμένο και σεβαστείτε τα απαιτούμενα namespaces ώστε ο handler να τερματίσει καθαρά.
  3. Κάντε επαναληπτικά το αίτημα· όταν προσγειωθεί σε ένα 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 header mySubjectHeader ή όταν η κίνηση console/SSP αυθεντικοποιείται, αλλά δεν το καθαρίζει ποτέ όταν το header λείπει.
  • Οποιαδήποτε επόμενη κλήση SOAP χωρίς το header στον ίδιο worker thread κληρονομεί το αποθηκευμένο Subject, επιτρέποντας τη μη-αυθεντικοποιημένη δημιουργία administrator χρηστών ή την εισαγωγή credentials μέσω endpoints όπως UserManager ή CredentialManager.
  • Παρατηρήθηκε αξιόπιστο μοτίβο εκμετάλλευσης:
  1. Δημιουργήστε ένα αυθεντικοποιημένο context σε πολλούς threads (π.χ. στείλτε spam σε /ssp ή κάντε login στο /aiconsole ως admin σε άλλη καρτέλα του browser).
  2. Πλημμυρίστε SOAP σώματα χωρίς header προς /ac-iasp-backend-jaxws/UserManager ή άλλα EJB-backed JAX-WS endpoints με υψηλή παραλληλία· κάθε αίτημα που επαναχρησιμοποιεί ένα “infected” thread εκτελείται με ανυψωμένο Subject.
  3. Επαναλάβετε μέχρι να επιστραφούν προνομιακές απαντήσεις· επαναχρησιμοποιήστε Keep-Alive connections και μεγάλα worker pools για να μεγιστοποιήσετε την πιθανότητα επαναχρησιμοποίησης threads.
  • Σημεία-κλειδιά του handler και της ροής διεργασίας:
  • LoginHandlerChain.xmlLoginHandler.handleMessage() κάνει unmarshal το mySubjectHeader και αποθηκεύει το Subject στο SubjectHolder (ένα static ThreadLocal).
  • Το 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 πριν και μετά από κάθε κλήση, επιβεβαιώνοντας ότι ένα μη-αυθεντικοποιημένο αίτημα κληρονόμησε ένα προηγούμενο administrator Subject.
  • Σε production appliances μπορείτε επίσης να κάνετε instrumentation με JFR ή BTrace για να κάνετε dump το SubjectHolder.getSubject() ανά αίτημα, επαληθεύοντας την επαναχρησιμοποίηση χωρίς header.

Αναφορές

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