Andrea Cosentino created CAMEL-23496:
----------------------------------------
Summary: Document the Camel security model: user roles, trust
boundaries, in-scope vs. out-of-scope vulnerability classes, and deployment
hardening
Key: CAMEL-23496
URL: https://issues.apache.org/jira/browse/CAMEL-23496
Project: Camel
Issue Type: Improvement
Reporter: Andrea Cosentino
h2. Background
Camel ships 300+ components and is embedded in widely different deployments
(microservices, ESBs, JBang scripts, Quarkus/Spring Boot apps, multi-tenant
gateways). Today the project's only public security artifact is
{{SECURITY.md}}, which is a one-paragraph pointer to
[https://camel.apache.org/security/]. There is no documented trust model or
scope statement.
This causes recurring problems:
* *Triage cost.* Reports arrive describing route authors deliberately enabling
{{allowJavaSerializedObject=true}}, {{trustAllCertificates=true}}, Bean
dispatch on attacker-controlled input, or {{simple}} / {{groovy}} evaluation of
user data. Each requires re-explaining the trust boundary on a per-report
basis. With explicit scope rules a reporter, an automated scanner, or an AI
triage agent can self-sort the report before it reaches the PMC private list.
* *Inconsistent fixes for the same class.* Historically Camel has accepted ~40
advisories. The two dominant clusters - unsafe Java deserialization (14
advisories) and header / bean-dispatch injection (7+ advisories) - keep
recurring in _new_ components because there is no documented rule for
"vulnerable default". CVE-2024-22369 ({{camel-sql}}) triggered four follow-on
CVEs in {{camel-cassandraql}}, {{camel-leveldb}}, {{camel-consul}}, and
{{camel-infinispan}} after the same {{ObjectInputStream}} pattern was found
elsewhere. CVE-2025-27636 / 29891 (HTTP {{HeaderFilterStrategy}}) triggered
follow-ons in {{camel-undertow}}, {{camel-coap}}, {{camel-mail}}, and
{{camel-jms/sjms/google-pubsub}}.
* *No anchor for automated scanning.* Apache Airflow publishes a comparable
document at
[https://github.com/apache/airflow/blob/main/AGENTS.md#security-model] and
[https://github.com/apache/airflow/blob/main/airflow-core/docs/security/security_model.rst].
It lets external tooling (CVE auto-triage, internal vulnerability scanners,
AI-assisted security review) distinguish a real framework vulnerability from a
misuse of an intentionally permissive feature. Camel needs the same.
h2. Proposal
Add two pieces of documentation that reference each other:
# *Canonical document* at
{{docs/user-manual/modules/ROOT/pages/security-model.adoc}} - rendered on
camel.apache.org, linked from the existing {{security.adoc}} page and from
{{SECURITY.md}} at the repo root.
# *Inline summary in {{AGENTS.md}}* - a "Security Model" section that
summarises the rules and links to the canonical doc, mirroring the structure
Airflow uses in its own AGENTS.md.
h2. Document contents
h3. User roles and trust assumptions
* *Camel committers / component developers* - trusted to ship secure defaults.
* *Route authors* - TRUSTED. A route author can execute Java, invoke beans,
evaluate {{simple}} / {{groovy}} / {{jexl}} / {{mvel}} / {{xpath}} against any
input. Code execution by a route author is by design, not a vulnerability.
* *Deployment operators* - TRUSTED. Control configuration, secrets, JVM,
network exposure. Their misconfiguration is not a framework vulnerability
unless Camel's default exposes it.
* *External message senders* (HTTP clients, JMS producers, file droppers, SMTP
senders, CoAP peers, etc.) - UNTRUSTED. This is the primary attacker model.
h3. In-scope vulnerability classes (with historical CVEs as anchors)
* *Unsafe deserialization triggered by untrusted input* - XStream
(CVE-2015-5344), Jetty/Servlet auto-deserialization (CVE-2015-5348), Jackson
polymorphic via header (CVE-2016-8749), SnakeYAML (CVE-2017-3159), Hessian
(CVE-2017-12633), Castor (CVE-2017-12634), RabbitMQ default (CVE-2020-11972),
Netty default (CVE-2020-11973), aggregation repos for SQL / Cassandra / LevelDB
/ Consul / Infinispan (CVE-2024-22369, 23114, 25747, 27172, 2026-40858), PQC
key store (CVE-2026-40048), Mina type converter (CVE-2026-40473), JMS
{{mapJmsMessage}} default (CVE-2026-40860).
* *XXE / XML external entity resolution* - XSLT (CVE-2014-0002), XML converter
(CVE-2015-0263), XPath (CVE-2015-0264), camel-xmljson via json-lib
(CVE-2019-0188), XSD validation (CVE-2018-8027).
* *Expression / template language injection* - {{CamelFileName}}
Simple-language abuse (CVE-2013-4330), Velocity/Freemarker template injection
(CVE-2020-11994).
* *Path traversal* - camel-mail (CVE-2018-8041), camel-file (CVE-2019-0194).
* *SSRF via parser resolution* - Validation component DTD (CVE-2017-5643).
* *Header / bean-dispatch abuse via untrusted input* - HeaderFilterStrategy
bypass family (CVE-2025-27636, CVE-2025-29891, CVE-2025-30177, CVE-2026-33453
camel-coap, CVE-2026-33454 camel-mail, CVE-2026-40453 jms/sjms/coap/pubsub).
* *Auth bypass in components implementing AAA* - Keycloak {{iss}} not validated
(CVE-2026-23552), platform-http subpath auth bypass (CVE-2026-40022).
* *Information disclosure* - world-readable temp files (CVE-2023-34442),
EventFactory exposure (CVE-2024-22371).
* *Insecure defaults* - any component shipping with deserialization, TLS-skip,
or admin-exposure enabled out of the box.
* *Injection into back-end queries built by Camel* - Cypher (CVE-2025-66169),
XSLT extension functions (CVE-2014-0003), analogous classes.
h3. Out of scope (intentional design, operator responsibility, or downstream
misuse)
* A route author writing {{.bean()}}, {{.process()}}, {{Runtime.exec()}}, or
evaluating {{simple}} / {{groovy}} on untrusted input. Route code is trusted.
* A route author building an SQL / Cypher / HTTP URI from untrusted input
without parameterising. The route is at fault, not Camel.
* Java deserialization enabled by *explicit opt-in*
({{allowJavaSerializedObject=true}}, {{transferException=true}}, an explicitly
chosen {{ObjectInputStream}}-using data format).
* TLS bypass with explicit {{trustAllCertificates=true}} /
{{hostnameVerificationEnabled=false}}.
* DoS / resource exhaustion through unthrottled routes (operator's
responsibility - {{throttle}}, {{circuitBreaker}}, {{resilience4j}}, JVM
limits).
* A deployer placing the dev console, JMX, Jolokia, or management endpoints on
a public network.
* 3rd-party CVE in a transitive dependency that is not reachable through any
Camel-exposed code path.
* Self-XSS by authenticated users of a Camel-built UI.
* Reports from automated scanners with no PoC demonstrating an actual
trust-boundary breach.
h3. Known limitations
* Some components have heritage-permissive defaults appropriate for trusted
networks (FTP, plain SMTP, JMS Object messages). Where defaults are being
tightened we should reference the related JIRA / CVE.
* Bean-based dispatch via internal headers ({{CamelBeanMethodName}},
{{CamelFileName}}, {{CamelExecCommandExecutable}}, {{CamelJmsDestinationName}},
etc.) means _any_ consumer that maps external input into the Exchange header
map can become an injection vector. Route authors must filter incoming headers
from untrusted producers; component authors must apply a strict
{{HeaderFilterStrategy}} on the inbound path, case-insensitively.
* Aggregation repositories that persist Java objects assume the backing store
is trusted - see the deserialization-class CVEs above.
h3. Deployment hardening (operator section)
* Use the security policy framework from {{proposals/security.adoc}} and set
{{camel.main.profile = prod}} so the default policy is {{fail}}.
* Resolve secrets through one of the supported vaults rather than property
files.
* Configure TLS through the JSSE Utility; never {{trustAllCertificates=true}}
in production.
* Strip Camel-internal headers ({{CamelBeanMethodName}}, {{CamelFileName}},
{{CamelExec*}}, {{CamelJms*}}, etc.) at the boundary using {{removeHeader}} /
{{removeHeaders}} before letting external data reach a dispatching processor.
* Do not expose {{camel-management}}, the dev console, Jolokia, or JMX on a
public network.
* For components that integrate Java deserialization, set an
{{ObjectInputFilter}} or disable the option.
h3. Guidance for committers (PR review section)
* When a {{@UriParam}} controls a security-relevant default, mark it with the
right {{security = "insecure:*"}} category from {{proposals/security.adoc}}.
* Any new component that consumes external input must define a
{{HeaderFilterStrategy}} covering inbound and outbound, case-insensitively.
* Any new aggregation repository / persistent state component must not call
{{ObjectInputStream.readObject()}} without an {{ObjectInputFilter}}.
* New defaults must err on the side of "denied unless opted in" for the four
{{security}} categories.
h2. Acceptance criteria
* {{docs/user-manual/modules/ROOT/pages/security-model.adoc}} exists,
referenced from {{security.adoc}} and the user-manual nav.
* {{SECURITY.md}} at repo root links to the new doc (in addition to the
existing vuln-reporting pointer).
* {{AGENTS.md}} has a "Security Model" section summarising the rules and
linking to the canonical doc.
* In-scope and out-of-scope lists each cite at least one concrete historical
CVE so the rule is anchored in accepted precedent.
* The doc cross-references {{proposals/security.adoc}} (existing security
policy framework) and the existing {{security.adoc}} (user-facing security
features).
* Doc has been reviewed on the private security list and on
[email protected] so the PMC concurs on scope before publication.
h2. Out of scope for this issue
* Changing any code defaults. This issue is documentation-only. Hardening
individual components, adding {{HeaderFilterStrategy}} to a specific consumer,
or installing {{ObjectInputFilter}} in an aggregation repository remain
individual CVE / improvement tickets.
* Producing a CVSS-style severity rubric. The model documents _whether_
something is in scope, not _how severe_ it is.
* Auto-generating advisories. The model supports the existing private
vulnerability reporting workflow described at
[https://camel.apache.org/security/].
h2. References
* Airflow security model (the pattern this issue mirrors):
[https://github.com/apache/airflow/blob/main/airflow-core/docs/security/security_model.rst]
and the AGENTS.md summary at
[https://github.com/apache/airflow/blob/main/AGENTS.md#security-model].
* {{proposals/security.adoc}} - existing Camel security policy framework (the
{{secret}} / {{insecure:ssl}} / {{insecure:serialization}} / {{insecure:dev}}
categories with {{allow}} / {{warn}} / {{fail}} enforcement).
* {{docs/user-manual/modules/ROOT/pages/security.adoc}} - existing user-facing
security page.
* {{SECURITY.md}} - current vuln-reporting shim.
* 40 historical Camel advisories at
[https://github.com/apache/camel-website/tree/main/content/security].
----
_Claude Code on behalf of Andrea Cosentino_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)