- Project: Apache CXF — an open-source services framework for building and consuming SOAP
(JAX-WS) and REST (JAX-RS) services, with an interceptor-based message pipeline and broad WS-* support
(WS-Security, WS-Trust, WS-SecurityPolicy, WS-Addressing, WS-ReliableMessaging) (documented — project
site, source
org.apache.cxf.interceptor.security,common.security). - Scope of this umbrella: the CXF runtime framework (
apache/cxf). It also names the sibling in-scope repos and where they sit:apache/cxf-fediz(WS-Federation SSO — its own distinct runtime surface, addressed in its own model/addendum), andapache/cxf-xjc-utils+apache/cxf-build-utils(build-time codegen / build tooling — out of the runtime threat model; see §3). - Modelled against:
apache/cxfmain/HEAD (2026-05-31), covering supported lines 3.6.x / 4.0.x / 4.1.x (documented — SECURITY.md). - Status: DRAFT Produced by the ASF Security team via the
threat-model-producerrubric (https://gist.github.com/potiuk/da14a826283038ddfe38cc9fe6310573). - Version binding: versioned with the project; reports triaged against the model as it stood at the affected release. Existing advisories: https://cxf.apache.org/security-advisories.html (documented).
- Reporting cross-reference: §8-property violations → report privately per
SECURITY.md/ https://www.apache.org/security/; §3 / §9 findings closed citing this document. - Provenance legend: (documented) / (maintainer) / (inferred); each (inferred) routes to §14.
- Draft confidence: ~14 documented / 0 maintainer / ~55 inferred.
Framing note that governs the whole model: CXF is a framework, not a deployed application. It provides mechanisms (WS-Security, TLS conduits, auth/authorization interceptors, input limits); which mechanisms are active, and how, is chosen by the integrator who builds a service on CXF. Many properties below are therefore conditional on configuration, and §10 (integrator responsibilities) is unusually load-bearing.
Primary intended use (documented): an in-application library/framework that a developer uses to expose or consume web services — SOAP endpoints over JAX-WS and/or REST endpoints over JAX-RS — typically hosted in a servlet container or via the CXF HTTP transport, with an interceptor chain processing each message.
Caller roles:
- Service client (untrusted) — any peer that can send a SOAP/REST request to a CXF endpoint.
- Authenticated client — a client whose WS-Security token / transport credential the integrator's configured interceptors have validated.
- Service integrator (developer/operator) — selects transports, interceptors, WS-SecurityPolicy, JAX-RS providers, and limits. Trusted; configures the security posture; out of model as adversary (§3).
Component-family table:
| Family | Entry point | Touches outside process | In model? |
|---|---|---|---|
| SOAP / JAX-WS message pipeline | endpoint + interceptor chain, StAX/XML parse | network; XML | Yes |
| WS-Security processing (via WSS4J) | sig/enc/UsernameToken/SAML/Timestamp interceptors | crypto; XML | Yes |
| REST / JAX-RS pipeline | resource matching, providers (JSON/XML/multipart) | network; deserialization | Yes |
| HTTP transport / conduit (client side) | HTTP(S) conduit, WSDL/schema/MTOM URL fetch | network egress | Yes |
| AuthN/AuthZ interceptors + security context | interceptor.security.*, common.security.* |
— | Yes |
| WS-Federation SSO | apache/cxf-fediz |
network; SAML | Sibling repo → own model |
| XJC codegen / build plugins | apache/cxf-xjc-utils |
build-time only | No → §3 |
| Build utilities | apache/cxf-build-utils |
build-time only | No → §3 |
- The service integrator / operator as adversary, and any insecurity that is purely a misconfiguration of CXF by the integrator (e.g. disabling signature verification, trusting all TLS certs, exposing an unauthenticated endpoint). CXF provides the controls; choosing not to use them is the integrator's call, surfaced in §10/§11 rather than defended here (inferred — framework norm).
- Build-time tooling:
apache/cxf-xjc-utils(XJC schema→Java plugins) andapache/cxf-build-utilsrun at build time, not in the request path; their threat surface is the codegen/build pipeline, not a runtime adversary. They are in scan scope for hygiene but out of this runtime threat model (inferred). apache/cxf-fediz— WS-Federation SSO has a distinct trust surface (IdP, RP plugins, SAML token issuance/consumption) and is modelled separately.- The underlying XML/crypto stacks (the JAXP/StAX provider, the JCE provider, WSS4J internals) except as CXF configures and invokes them — CXF's defaults and wiring are in model; provider bugs are upstream.
- Application business logic running behind a CXF endpoint.
The trust boundary is the endpoint's inbound interceptor chain: bytes off the wire are untrusted until the configured interceptors (decoding, optional WS-Security, optional auth) have processed them (inferred).
Trust transitions:
- Wire → StAX/XML parse: raw SOAP/XML is parsed. This is the classic XML-attack surface (XXE, entity expansion / billion-laughs, deeply-nested DoS). CXF ships input-limit and secure-parsing defaults that the model must pin (inferred — wave-1).
- Parsed message → WS-Security: if WS-SecurityPolicy / interceptors are configured, signatures and encryption are verified, tokens (UsernameToken, SAML, X.509, Kerberos) validated, timestamps/nonces checked for replay, and algorithms/BSP compliance enforced (documented — interceptor classes; specifics inferred). Without this configuration, the message is only transport-trusted.
- Message → authZ: authorizing interceptors map the established identity to roles/permitted operations
(documented —
AbstractAuthorizingInInterceptor). - REST body → provider: JAX-RS providers unmarshal bodies (JSON/XML/multipart) into objects — a deserialization and parser-DoS surface (inferred).
- Client conduit → remote fetch: as a client, or when resolving WSDL/schema imports or MTOM references, CXF makes outbound requests to URLs — an SSRF surface if any URL is attacker-influenced (inferred).
Reachability preconditions: a finding is in-model on the server inbound path if reachable from an
untrusted client message before the integrator-configured auth boundary; a finding that requires the
integrator to have disabled a security control is OUT-OF-MODEL: non-default-build / misconfig (§5a/§3);
a finding in WSDL/MTOM fetch is in-model if a URL is attacker-influenceable.
- Runtime: a JVM and (typically) a servlet container or the CXF HTTP transport hosting endpoints (documented).
- Crypto/keys: keystores/truststores and JCE providers are supplied and managed by the integrator (inferred).
- Transport: TLS is provided by the container/conduit configuration; CXF supports but does not force it (inferred — wave-1 default).
- What CXF does to its host ((inferred) — wave-2): parses XML/JSON; performs crypto; opens outbound HTTP(S) for client calls, WSDL/schema imports, and MTOM; reads configured keystores. Not assumed to spawn processes or read arbitrary files outside configured resources.
CXF's security envelope is set by runtime configuration, not compile flags. The high-leverage knobs (defaults (inferred) — wave-1 confirmation targets, because each reshapes §8/§9/§11a):
| Knob | Effect | Default ruling needed |
|---|---|---|
StAX secure-processing / DocumentDepth / entity-expansion / element-count limits |
XXE + XML-DoS posture | Open (wave-1): are secure defaults on out-of-the-box? |
| WS-SecurityPolicy / WS-Security interceptors configured | Whether messages are signed/encrypted/authenticated at all | Integrator choice; unconfigured = transport-trust only |
allowStreaming / streaming vs DOM WS-Security |
Different XSW/validation surface | Open |
| TLS enforcement on the conduit/listener | Transport confidentiality/integrity | Integrator choice (§10) |
JAX-RS provider set (JSON/XML libs), @XmlRootElement/JAXB, Aegis |
Deserialization + XXE surface | Open — which providers/defaults |
| Property/URL resolution for WSDL/schema/MTOM | SSRF surface | Open — is remote import allowed by default? |
| Entry point | Parameter | Attacker-controllable? | Caller/integrator must enforce |
|---|---|---|---|
| SOAP endpoint | SOAP/XML envelope (headers, body, attachments) | yes | XML limits; WS-Security policy; size caps |
| WS-Security headers | signatures, tokens, timestamps | yes | sig/enc verification; token validation; replay window |
| JAX-RS resource | path, query, headers, body (JSON/XML/multipart) | yes | provider hardening; deserialization allow-lists; size limits |
| WSDL/schema/MTOM reference | import URL | yes if integrator allows remote refs | disable/allow-list remote resolution (SSRF) |
| client conduit | response from remote service | from the remote endpoint | validate as untrusted on the client side too |
Spring/Blueprint/cxf.xml config |
all keys | no — integrator-trusted | never sourced from a request |
- Primary adversary: an untrusted network client of a CXF-hosted endpoint. Capabilities: send arbitrary SOAP/REST messages, malformed/oversized XML/JSON, crafted WS-Security headers (signature-wrapping, expired or forged tokens, replays), and (where remote references are enabled) attacker-chosen import URLs.
- Secondary: a malicious remote service when CXF is the client (hostile WSDL/response).
- Goals: bypass authentication/authorization; XXE/file/SSRF exfiltration; XML/JSON parser DoS; signature- wrapping to alter a signed message; deserialization RCE via a provider; replay of captured tokens.
- Out of model: the integrator/operator; an adversary who requires a misconfiguration the integrator chose; provider/library internals CXF merely invokes.
(All conditional on the integrator enabling the relevant mechanism; (inferred) pending §14.)
- Message-level authentication & integrity via WS-Security — when WS-SecurityPolicy/interceptors are configured, signatures and tokens are verified and replay windows enforced (documented — interceptor stack; specifics inferred). Symptom: accepted forged/replayed/unsigned message where policy required otherwise; signature-wrapping. Severity: critical.
- Authorization enforcement — authorizing interceptors deny operations the established identity lacks
(documented —
AbstractAuthorizingInInterceptor). Symptom: operation invoked without the required role. Severity: critical. - Safe-by-default XML processing — secure StAX processing and input limits (depth/entity/element/size) mitigate XXE and XML-bomb DoS on inbound messages (inferred — load-bearing; wave-1). Symptom: XXE read/SSRF, OOM/CPU exhaustion from crafted XML. Severity: critical.
- Transport security support — TLS conduits/listeners with hostname + cert validation when configured (inferred). Symptom: MITM where TLS was expected; accepted invalid cert. Severity: high.
- Robust message parsing — malformed SOAP/REST input yields a clean fault, not memory corruption or crash (inferred). Symptom: unhandled crash/hang from crafted input. Severity: high.
- No security without configuration. An endpoint with no WS-Security policy and no transport security is authenticated and confidential only to the extent the integrator wired it; CXF does not impose message security by default (inferred).
- No defence against integrator misconfiguration (disabling sig verification,
setValidateCert(false), permissive providers) — §3/§11. - No application-level authorization model beyond the interceptor mechanisms the integrator configures.
False friends:
- A
UsernameTokenin a SOAP header looks like authentication but is only as strong as the configured validation + transport — a plaintext-password UsernameToken over non-TLS is interceptable. - XML Signature covering "a" element is not the same as covering "the" element — signature-wrapping (XSW) defeats naive "is it signed?" checks; the binding must verify what is signed.
- WS-ReliableMessaging / WS-Addressing are reliability/routing, not security.
Well-known attack classes the integrator must keep in view: XXE and XML entity-expansion DoS; XML signature-wrapping; SAML assertion forgery/replay; JSON/XML/Java deserialization via JAX-RS providers; SSRF via WSDL/schema/MTOM remote references; padding-oracle / weak-algorithm acceptance if BSP/algorithm restrictions are relaxed; ReDoS in any regex-based routing.
- Configure WS-SecurityPolicy / interceptors for the authentication, signing, and encryption your service actually requires — and verify what is signed (anti-XSW), not merely that something is.
- Keep the secure XML defaults on (depth/entity/size limits); do not disable secure StAX processing.
- Enforce TLS with proper hostname/cert validation on both listeners and client conduits.
- Harden JAX-RS providers — restrict deserialization (no unsafe polymorphic JSON; disable DTDs in XML providers); set body-size limits.
- Disable or allow-list remote WSDL/schema/MTOM resolution to close SSRF.
- Validate client-side responses as untrusted when CXF consumes a remote service.
- Track https://cxf.apache.org/security-advisories.html and stay on a supported line (3.6.x / 4.0.x / 4.1.x).
- Exposing a SOAP/REST endpoint with no WS-Security and no TLS and assuming the framework "is secure".
- Accepting a signed message without verifying the signature covers the security-relevant elements (XSW).
- Enabling remote entity/WSDL/schema resolution against untrusted input (XXE/SSRF).
- Using a JAX-RS JSON provider with unsafe polymorphic deserialization on untrusted bodies.
- Disabling certificate/hostname validation on the HTTP conduit for convenience.
(v0 seed — the PMC (coheigea/reta are WS-Security experts) will have the authoritative list — §14.)
- "Endpoint has no authentication" against framework code/tests/samples — security is integrator- configured (§9); not a framework bug unless a default control is missing or broken.
- XXE/SSRF reachable only when the integrator enabled remote resolution / disabled limits —
OUT-OF-MODEL: non-default-build(§5a) unless the default is unsafe (thenVALID— wave-1). - Deserialization "gadget" in a provider the integrator did not enable — out of the default surface (§3).
- Findings in
apache/cxf-xjc-utils/apache/cxf-build-utils— build-time tooling (§3). systests/testtools/sample code — out of scope (§3).- Use of a weak algorithm explicitly configured by the integrator — integrator choice, not a framework default break.
- A change to the default XML-processing limits / secure-parsing posture.
- A new transport, JAX-RS provider default, or WS-* mechanism enabled by default.
- A change to default algorithm/BSP restrictions in the WS-Security stack.
- Promotion of remote reference resolution to on-by-default.
- Any report not cleanly routable to a §13 disposition.
| Disposition | Meaning | Licensed by |
|---|---|---|
VALID |
Violates a claimed property via an in-scope adversary/input in a default/secure configuration. | §8, §6, §7 |
VALID-HARDENING |
No §8 property broken in default config, but a §11 misuse is easy enough to warrant a safer default or guard. | §11 |
OUT-OF-MODEL: trusted-input |
Requires control of integrator config / keystores. | §6 |
OUT-OF-MODEL: adversary-not-in-scope |
Requires the integrator/operator capability. | §7, §3 |
OUT-OF-MODEL: unsupported-component |
Lands in build tooling (xjc/build-utils), systests, or samples. | §3 |
OUT-OF-MODEL: non-default-build |
Only manifests when the integrator disabled a control or enabled an unsafe option. | §5a |
BY-DESIGN: property-disclaimed |
Concerns a §9-disclaimed property (no security without configuration; reliability ≠ security). | §9 |
KNOWN-NON-FINDING |
Matches a §11a entry. | §11a |
MODEL-GAP |
Routes to none of the above → revise the model. | §12 |
Wave 1 — defaults that decide VALID-vs-misconfig (§5a/§8/§9):
- Out of the box, are CXF's XML secure-processing limits (entity expansion off, DTD/external-entity
resolution off, depth/element/size caps) on by default for inbound SOAP and JAX-RS XML providers, so
an XXE/XML-bomb report against defaults is
VALID? Proposed: secure defaults on; XXE-on-defaults = VALID. - Is remote WSDL/schema/MTOM resolution disabled (or allow-listed) by default? Proposed: not fetched from untrusted input by default; SSRF requires integrator opt-in.
- For the shipped JAX-RS providers, is unsafe polymorphic/DTD deserialization off by default? Proposed: yes; unsafe modes are integrator opt-in.
Wave 2 — WS-Security guarantees (§4/§8): 4. Which WS-Security guarantees does CXF consider its responsibility vs. WSS4J's, and does the binding defend signature-wrapping (XSW) by verifying signed-element identity by default when a policy is set? Proposed: CXF+WSS4J enforce XSW protections under policy. 5. Are replay protections (timestamp window, nonce cache) on by default when a UsernameToken/Timestamp policy is configured? Proposed: yes, with a default window.
Wave 3 — boundaries, advisories, §11a (§3/§9/§11a):
6. Confirm the integrator-misconfiguration boundary: which "insecure" outcomes are explicitly the
integrator's responsibility (→ OUT-OF-MODEL) vs. a framework default we'd fix? Proposed: per §3/§11.
7. From the long advisory history, what do scanners most often (re)report that the PMC considers a
non-finding today (already-fixed patterns, by-design items)? (Seeds §11a.)
Meta:
8. Confirm the umbrella shape: this model in apache/cxf (linked from its existing SECURITY.md), a
separate model for apache/cxf-fediz, and cxf-xjc-utils / cxf-build-utils carrying only a
discoverability pointer to this one as build-time tooling. Proposed: yes.
Deferred for v0; a threat-model.yaml can later encode the §6 trust table, §2/§3 scoping, §8
property/severity/symptom rows, §9 false friends, §11a non-findings, and §13 dispositions.