| = Security Model |
| |
| This page documents the security model of the *Apache Camel Kamelet Catalog*: |
| who is trusted, where the trust boundaries sit, what counts as a catalog |
| vulnerability, and what is left to the route author and the deployment operator. |
| It is the reference used by the Apache Camel PMC when triaging security reports |
| against the Kamelet Catalog and when deciding whether a behaviour should be |
| hardened in a Kamelet template or addressed by the deployment. |
| |
| The Kamelet Catalog is an *Apache Camel sub-project*. It does not define its own |
| trust model from scratch: it *specialises* the |
| link:/manual/security-model.html[Apache Camel Security Model] |
| for the specific shape of a Kamelet (a pre-written, PMC-reviewed Camel route |
| template distributed as YAML). Where this document is silent, the Camel Security |
| Model governs. Where they overlap, this document is the more specific authority |
| for the catalog. |
| |
| [IMPORTANT] |
| ==== |
| *Status:* Maintainer-ratified (Apache Camel PMC, 2026-05-15). Ready to publish |
| as the catalog's security model. + |
| *Version binding:* written against `camel-kamelets` 4.20.0 (commit |
| `79dcf4cfca`, 2026-05-15), Camel 4.20.0. A report against catalog version _N_ is |
| triaged against this model as it stood at _N_, not at `main`. + |
| *Provenance:* claims grounded in the catalog README, the |
| `development.adoc` developer guide, the CRD specification, or the Kamelet YAML |
| itself are stated as fact. The structural inferences in the initial draft were |
| ratified by the Camel PMC on 2026-05-15; the _Maintainer ratification_ section |
| at the end records what was confirmed and what was deliberately deferred, so a |
| triager can cite "_(maintainer, 2026-05)_" rather than bare prose. + |
| *Confidence:* the trust model, component families and scope boundaries are |
| documented (catalog README, developer guide, Kamelet YAML, the parent Camel |
| model) and PMC-confirmed; one item (a machine-readable triage sidecar) is |
| deferred by PMC decision, not unresolved. + |
| *Reporting:* see _Reporting a vulnerability_. Findings that fall under |
| _In-scope vulnerability classes_ are reported privately through the Camel ASF |
| process; findings under _Out of scope_ or _Known limitations_ are closed with a |
| reference to this page. |
| ==== |
| |
| == Audience |
| |
| This document is written for four audiences: |
| |
| * *Security researchers and CVE reporters* who need to know what the Camel PMC |
| will accept as a Kamelet Catalog vulnerability before submitting a report. |
| * *Automated triage tooling* (CVE scanners, AI-assisted security review) that |
| needs an authoritative scope statement to distinguish a real catalog |
| vulnerability from intentional, documented design. |
| * *Kamelet authors and reviewers* contributing or reviewing Kamelet YAML, who |
| need to know which template patterns and property defaults are acceptable. |
| * *Route authors and deployment operators* who embed Kamelets in an |
| integration, and need to know which responsibilities the catalog delegates to |
| them. |
| |
| == What a Kamelet is (and what this changes) |
| |
| A Kamelet is a single YAML file containing a *Camel route template* (in |
| `spec.template`, YAML DSL) plus a JSON-schema declaration of the *configuration |
| properties* the route author binds (in `spec.definition.properties`). The |
| catalog ships about 250 of these (94 sources, 95 sinks, 61 actions). A Kamelet |
| is referenced by name from a route or `Pipe`; the runtime substitutes |
| `{\{property}}` placeholders with the bound values and runs the template like any |
| other Camel route. |
| |
| The security-relevant consequence: *in a hand-written Camel route, the route |
| author writes the route; in a Kamelet, the catalog author (the Camel community, |
| reviewed by the PMC) writes the route fragment and the route author only |
| supplies bound property values.* The trust boundary between trusted route code |
| and untrusted message data is unchanged from Camel's model - but the *author of |
| the trusted code* is now the catalog. That is the single fact that shapes |
| everything below: a Kamelet template must be safe-by-default for the |
| untrusted-data boundary, because the operator who deploys it generally does not |
| inspect or rewrite the template. |
| |
| == Trust model |
| |
| === Roles |
| |
| [cols="1,1,3"] |
| |=== |
| | Role | Trust level | What this role can do |
| |
| | Kamelet authors and the Camel PMC |
| | Trusted |
| | Author and review the Kamelet template (which is route code), choose property |
| defaults, decide which inbound headers a template maps where, and select the |
| underlying Camel component. The catalog relies on PMC review to ship templates |
| that are safe by default. |
| |
| | Route authors (who reference a Kamelet and bind its properties in Java, XML, |
| YAML DSL or a `Pipe`) |
| | Fully trusted |
| | Choose which Kamelet to use and where to place it in a route, and bind every |
| property - URLs, queries, file paths, OS commands, template/expression |
| strings, credentials - from configuration. Binding a property to an |
| attacker-controlled value is route-author error, not a catalog vulnerability. |
| |
| | Deployment operators |
| | Fully trusted |
| | Decide network exposure of source Kamelets, supply secrets and the secrets |
| backend, choose the Camel runtime and JVM, and decide which catalog to load |
| Kamelets from. Loading a Kamelet from an untrusted source is operator error |
| (see _Known limitations_). |
| |
| | External message senders / data flowing through the Kamelet |
| | Untrusted |
| | Provide the message body, headers and attachments that a source Kamelet emits |
| or that a sink/action Kamelet consumes. This is the primary attacker model. |
| The catalog's templates must not turn this data into code execution, endpoint |
| redirection, unsafe deserialisation, remote-resource resolution or auth bypass |
| on their own. |
| |=== |
| |
| === Trust boundaries |
| |
| The fundamental trust boundary is identical to Camel's: between *the Kamelet |
| (its template plus the operator's bound configuration)* and *the data flowing |
| through it*. The Kamelet template and every `{\{property}}` value are trusted; |
| anything that arrives in an `Exchange` body, header or attachment from the wire |
| or filesystem is untrusted. |
| |
| The Kamelet Catalog adds one internal boundary of its own: the boundary between |
| *the catalog as a distribution* (the set of YAML files the PMC signs and |
| releases) and *the consumer that loads them*. An entity that can introduce or |
| modify a Kamelet definition in the catalog a runtime loads is, by design, a |
| trusted route author with arbitrary route/code execution. Integrity of the |
| catalog artifact is therefore a precondition of this whole model, not a property |
| the runtime re-checks. |
| |
| === Component families |
| |
| The repository ships several artifacts with different threat profiles. Only the |
| first is the security-relevant product. |
| |
| [cols="2,3,1",options="header"] |
| |=== |
| | Family | What it is | In this model? |
| |
| | Kamelet YAML catalog (`kamelets/*.kamelet.yaml`, shipped via the |
| `camel-kamelets` resource bundle) |
| | ~250 PMC-reviewed Camel route templates. The product. All template-level |
| security posture lives here. |
| | *Yes - primary* |
| |
| | `camel-kamelets-catalog` (Java) |
| | Runtime metadata reader. Loads only the YAML bundled on its own classpath at |
| build time, via Jackson `YAMLFactory`, into Fabric8/CRD model objects. No |
| public API accepts a caller-supplied path, URL or stream; not on the message |
| data path. |
| | Yes - metadata API surface only |
| |
| | `camel-kamelets-crds` (Java) |
| | Fabric8-generated Kubernetes model POJOs for the Kamelet CRD. Deserialised by |
| the consumer's Kubernetes client / Fabric8, not by code in this repository. |
| | No - the deserialiser is the consumer's, not this repo's (PMC-confirmed) |
| |
| | `kamelets-maven-plugin` |
| | Build-time validation of catalog YAML against the Camel component model. |
| | No - build tooling |
| |
| | `camel-kamelets-bom`, `camel-kamelets` packaging |
| | Maven BOM (pom only) and the resource bundle that jars family 1. |
| | Only as the delivery vehicle for family 1 |
| |
| | `script/` helper scripts, `crds/` Go client generator, |
| `tests/camel-kamelets-itest` (Citrus), `templates/` (init `.vm` and Pipe |
| examples) |
| | CI, documentation generation, test and scaffolding code. Not shipped to a |
| runtime. |
| | No - unsupported / build / examples |
| |
| | The Kamelet execution runtime: the `kamelet:` component, `{\{property}}` |
| placeholder binding, and `org.apache.camel.kamelets.utils.*` |
| | *Lives in `apache/camel` core, not in this repository* (the |
| `camel-kamelets-utils` module was removed here and folded into core). |
| | No - governed by the Camel Security Model |
| |=== |
| |
| The last row is the most consequential boundary statement: a defect in *how* a |
| Kamelet is executed (placeholder resolution, the `kamelet:` component, the |
| shared utility beans) is an `apache/camel` finding, not a catalog finding. A |
| defect in *what a shipped template does by default* is a catalog finding. |
| |
| == Vulnerability scope |
| |
| A report is in scope when it demonstrates that a *shipped Kamelet template*, in |
| its default configuration, lets untrusted message data cross a trust boundary |
| that an equivalent competently-written hand route would not have crossed - |
| because the defect is in the template the catalog authored, not in how the |
| operator wired it. |
| |
| === Security properties and violation severity |
| |
| The catalog commits to a small set of properties *on top of* whatever the |
| underlying Camel component already provides. The Camel Security Model's |
| property/severity table applies unchanged to the component layer; the table |
| below is the catalog-template layer. |
| |
| [cols="3,3,1",options="header"] |
| |=== |
| | Property the catalog upholds (default configuration) |
| | What a violation looks like |
| | Indicative severity |
| |
| | A sink/action template that maps an untrusted inbound header or body into a |
| dispatch-controlling position strips or fixes the Camel-internal dispatch |
| headers it does not intend to expose |
| | A wire-supplied `CamelHttpUri`, `CamelFileName`, `Camel*DestinationName`, |
| `CamelExec*` (etc.) header survives into a `to:` / component call and |
| redirects the sink, when the Kamelet's stated purpose did not require it |
| | High to Critical (CVSS 7.5-9.8) |
| |
| | A template does not pass untrusted message data to an expression/template/ |
| query evaluator the Kamelet's purpose did not call for |
| | The template feeds `$\{body}` / an inbound header into `simple`, a template |
| language, JSONPath or a query string in a way the operator never asked for |
| | High to Critical (CVSS 8.1-9.8) |
| |
| | A shipped template does not enable a security-relevant component default that |
| the Camel model classes as insecure (Java deserialisation on an untrusted |
| consumer, TLS verification disabled, an admin surface bound to `0.0.0.0`) |
| | Adding the Kamelet to a route and sending a message reaches the insecure |
| behaviour with no risky property set |
| | Severity of the underlying Camel class; in scope |
| |
| | Secret-bearing properties are declared so tooling can mask them |
| (`format: password`, `x-descriptors: urn:camel:group:credentials`) |
| | A credential property is rendered or logged in plaintext by tooling that |
| honoured the schema, because the Kamelet failed to mark it |
| | Medium (CVSS 4.0-6.5) |
| |
| | Free-form destination-like properties constrain their accepted shape |
| (`pattern:` regex on URLs, template resource URIs, etc.) |
| | A property documented as an HTTP URL accepts a `file:` / `jar:` / `classpath:` |
| value because the template declared no constraint - widening operator error |
| into reachable behaviour |
| | Low to Medium (CVSS 3.7-6.1); see the false-friend note in _Out of scope_ |
| |=== |
| |
| These tiers are indicative. The PMC assigns the definitive CVSS per report. A |
| property only counts here if the catalog has actually committed to it in a |
| template, the README/developer guide, or a PMC statement. |
| |
| === In-scope vulnerability classes |
| |
| ==== Template-introduced header / dispatch injection |
| |
| A sink or action template that copies an untrusted inbound header or body into |
| a Camel-internal dispatch header (`CamelHttpUri`, `CamelFileName`, |
| `Camel*DestinationName`, `CamelExecCommand*`, `CamelBeanMethodName`, ...) - or |
| that fails to strip such a header it does not consume - so that wire input |
| redirects the component. Many catalog templates already defend this (for |
| example `http-sink` performs `removeHeader: CamelHttpUri` before `to: {\{url}}`, |
| and `extract-field-action` sanitises a configurable header name). A *new or |
| changed template* that maps untrusted input into dispatch without that |
| discipline is the catalog analogue of the Camel header-injection CVE family. |
| |
| ==== Template-introduced expression / template / query injection |
| |
| A template that passes untrusted message data (not a `{\{property}}`) to a |
| `simple` expression, a template language (Velocity, Freemarker, Mustache, MVEL, |
| JSLT, XJ, string-template, ...), JSONPath/JQ, or a back-end query string the |
| Kamelet builds. The defect is the template doing this without the route author |
| asking; an operator binding a `{\{template}}` / `{\{query}}` / `{\{expression}}` |
| property to untrusted data is out of scope (route-author responsibility, |
| mirroring Camel). |
| |
| ==== Insecure component default shipped in a template |
| |
| A template that adds a Camel component to the route with a security-relevant |
| option set to the insecure value by default (Java serialisation on a consumer |
| exposed to an untrusted broker, TLS/hostname verification disabled, a |
| permissive header filter, an unfiltered `ObjectInputStream`), reachable simply |
| by deploying the Kamelet. This is the Camel "insecure defaults" class scoped to |
| the template's choice of defaults. |
| |
| ==== Missing or incorrect secret / constraint metadata |
| |
| A property carrying a credential that is not declared `format: password` with |
| the credentials `x-descriptors`, so schema-honouring tooling exposes it; or a |
| destination-like property whose missing `pattern:` turns a documented operator |
| contract into reachable unintended behaviour. Triaged as low/medium hardening |
| unless it produces a concrete disclosure. |
| |
| === Out of scope |
| |
| The following are *not* Kamelet Catalog vulnerabilities and will be closed as |
| such, with a reference to this page. |
| |
| * *A route author or operator binding a Kamelet property to untrusted data.* |
| `{\{template}}`, `{\{query}}`, `{\{expression}}`, `{\{url}}`, `{\{executable}}`, |
| file paths and credentials are configuration. The catalog cannot decide on the |
| operator's behalf whether a bound value is trusted. Template-language Kamelets |
| (`velocity-template-action`, `jslt-action`, `freemarker-template-action`, |
| `mvel-template-action`, `mustache-template-action`, `xj-template-action`, |
| `string-template-action`, `chunk-template-action`) and SQL/NoSQL/GraphQL |
| Kamelets (`postgresql-*`, `mysql-*`, `mariadb-*`, `sqlserver-*`, |
| `oracle-database-*`, `cassandra-*`, `mongodb-*`, `snowflake-*`, |
| `graphql-sink`, ...) evaluate or build their template/query from an |
| operator-bound property. Wiring an untrusted source into that property is |
| route-author error, exactly as in the Camel model. |
| * *A Kamelet doing, by design, the dangerous thing it is named for.* |
| `exec-sink` ("Execute system commands") runs `exec:{\{executable}}` with the |
| executable bound by the operator; `ssh-sink`, `scp-sink`, `ssh-source` run |
| remote commands/transfers. Placing such a Kamelet downstream of untrusted |
| input is operator responsibility - the behaviour is the Kamelet's documented |
| contract, analogous to Camel's "bean-based dispatch via internal headers is |
| intentional" limitation. |
| * *Network exposure of a source Kamelet.* `webhook-source`, `http-source`, |
| `http-secured-source` and similar open a `platform-http` listener. The catalog |
| does not add authentication except where a Kamelet's name and properties say |
| it does (`*-secured-*` variants expose auth *options* the operator must |
| configure). Exposing a source to untrusted networks, or not configuring the |
| offered auth, is operator responsibility. |
| * *Explicitly-named insecure convenience Kamelets.* `*-not-secured-*` / |
| `kafka-not-secured-*` Kamelets advertise their posture in the name and are |
| development/test conveniences. Their lack of transport security is the |
| documented contract, not a defect. |
| * *Vulnerabilities in the underlying Camel component or its transitive |
| dependencies.* "Kamelet X uses component Y which had CVE Z" is a Camel / |
| upstream finding unless the *template* configures Y insecurely by default. A |
| Kamelet's declared `mvn:` dependencies are vetted only for Apache-license |
| compatibility; their CVEs follow Camel's third-party-dependency policy. |
| * *Defects in the Kamelet execution runtime.* The `kamelet:` component, |
| `{\{property}}` placeholder binding and `org.apache.camel.kamelets.utils.*` |
| live in `apache/camel`; route such findings there. |
| * *Denial of service via resource exhaustion.* Unthrottled sources, oversized |
| messages, expansion bombs - operators apply `throttle`, `circuitBreaker`, |
| resilience and JVM limits, exactly as in the Camel model. |
| * *The `data:image` icon annotation as an injection vector.* It is base64 |
| metadata for catalog tooling, never executed by the route runtime; safe |
| rendering of catalog metadata is the consuming UI's concern. |
| * *`camel-kamelets-catalog` "deserialises YAML".* It parses only YAML bundled |
| on its own build-time classpath into model objects; it is not an |
| untrusted-document parser, and exposes no API that accepts caller-supplied |
| YAML. |
| * *Build, CI, scaffolding and test code* (`script/`, `crds/` generator, |
| `tests/`, `templates/`, `kamelets-maven-plugin`) - separately authored, |
| not shipped to a runtime. |
| * *Reports from automated scanners with no proof of a concrete trust-boundary |
| breach through a shipped template.* |
| |
| === Known limitations |
| |
| These look like vulnerabilities at first glance but are documented design |
| points. They may be tightened over time through the normal upgrade-guide |
| channel. |
| |
| * *The `exec-sink` argument path is intentional.* It reads an untrusted inbound |
| header into command arguments by design; the Kamelet is literally named |
| "Exec Sink" and lives in the `System` namespace. The mitigation is operator |
| placement, not a template change. |
| * *Kafka source Kamelets default `deserializeHeaders: true`.* Inbound Kafka |
| message headers are converted to their String representation by a fixed |
| `KafkaHeaderDeserializer` bean (CAMEL-21843). This is a documented default |
| with a per-Kamelet opt-out property; it is a String conversion, not Java |
| object deserialisation. |
| * *A `pattern:` regex on a property is shape validation, not an attack control.* |
| It constrains what an operator may type (e.g. a URL must start `http`/ |
| `https`); it does not make an attacker-controlled bound value safe and is not |
| an SSRF defence. See the false-friend note below. |
| * *`kamelet.verified=true` is a functional-test marker, not a security audit.* |
| It records that Citrus tests assert the Kamelet's behaviour; it makes no |
| security assertion. |
| * *A Kamelet inherits the security posture of its underlying component.* A |
| report must show the *template*, not the Camel component, is the cause. |
| * *There are no global build-time or compile flags that change the security |
| envelope.* The catalog is data (YAML); the only security-relevant "variants" |
| are per-Kamelet defaults and the explicitly-named insecure-convenience |
| Kamelets, both covered above. "The project" is the catalog as released, not a |
| configurable family of binaries. |
| |
| ==== False-friend properties |
| |
| Single highest-value note for an integrator: |
| |
| * *An "action" Kamelet between an untrusted source and a sink is not a |
| sanitiser, WAF, or trust boundary.* It transforms or filters per its |
| documented purpose only. `predicate-filter-action` / |
| `header-matches-filter-action` decide pass/drop on a JSONPath/header; they do |
| not neutralise hostile content. |
| * *A `pattern:` regex looks like input security; it is operator-typo |
| containment.* It restricts scheme/shape, not trust. |
| * *`*-secured-*` in a Kamelet name means "auth options exist", not "auth is on |
| by default".* The operator must configure them. |
| * *`kamelet.verified=true` looks like a security seal; it is a test marker.* |
| |
| == Downstream responsibilities |
| |
| For these assumptions to hold, the route author and operator must: |
| |
| * *Treat a deployed Kamelet exactly like a route they wrote* - it runs with |
| their privileges and trust. |
| * *Load Kamelets only from a trusted, integrity-checked catalog.* An entity that |
| can add or modify a Kamelet definition has arbitrary code execution by design. |
| * *Bind every property from trusted configuration* - never bind |
| `{\{template}}` / `{\{query}}` / `{\{expression}}` / `{\{url}}` / |
| `{\{executable}}` / credentials / file paths from untrusted message data. |
| * *Strip `Camel*` headers from untrusted producers* before a sink Kamelet, even |
| though many templates also do this for the dispatch headers they know: |
| + |
| [source,yaml] |
| ---- |
| - from: |
| uri: "platform-http:///ingest" |
| steps: |
| - removeHeaders: { pattern: "Camel*" } |
| - to: "kamelet:http-sink?url=https://trusted/backend" |
| ---- |
| * *Not place command/transfer Kamelets* (`exec-sink`, `ssh-*`, `scp-sink`) |
| downstream of untrusted input. |
| * *Secure inbound source Kamelets* with network controls and, where offered, the |
| `*-secured-*` auth options. |
| * *Resolve credentials through a Camel vault*, not plaintext Kamelet properties. |
| * *Pin the catalog and Camel versions* and follow Camel security announcements. |
| |
| == Guidance for Kamelet authors and reviewers |
| |
| When contributing or reviewing a Kamelet, these questions decide whether the |
| change matches this model: |
| |
| * *Does the template map an untrusted inbound header or body into a |
| dispatch-controlling position?* If so it must strip or fix every |
| Camel-internal header it does not deliberately consume, before the dispatching |
| step. |
| * *Does the template pass message data (not a `{\{property}}`) to an |
| expression/template/query evaluator?* If yes, that is the in-scope injection |
| class - the evaluated input must be a bound property, not the body/headers. |
| * *Does the template add a component with a security-relevant default?* Ship the |
| safe default; if a Kamelet must relax one, name it (e.g. `*-not-secured-*`), |
| document it, and get PMC sign-off. |
| * *Does a property carry a secret?* Mark it `format: password` with |
| `x-descriptors: [urn:camel:group:credentials]`. |
| * *Does a free-form property feed an endpoint URI or resource?* Add a `pattern:` |
| to contain operator error - and remember it is not a trust control. |
| * *Does the change relax a default or widen what a template forwards?* It needs |
| an upgrade-guide entry and PMC review. |
| |
| == Reporting a vulnerability |
| |
| The Kamelet Catalog uses the standard Apache Camel / ASF vulnerability process: |
| |
| * Read link:/security/[Apache Camel Security]. |
| * Email `private-security@camel.apache.org` with the affected catalog |
| version(s), the specific Kamelet, and a proof of concept that demonstrates the |
| trust-boundary breach *through a shipped template in its default |
| configuration*. |
| * Do not open a public issue, pull request, or mailing-list/social post about an |
| unpublished vulnerability. Follow the ASF Security team's instructions. |
| |
| Reports matching _In-scope vulnerability classes_ are triaged on the private |
| list, fixed in a coordinated release, and published as a CVE advisory under the |
| Camel project. Reports matching _Out of scope_ or _Known limitations_ are closed |
| with a reference to this page. |
| |
| === Triage dispositions |
| |
| The closed set of outcomes for a report, scanner finding, or AI analysis: |
| |
| [cols="2,3,1",options="header"] |
| |=== |
| | Disposition | Meaning | Licensed by |
| |
| | `VALID` |
| | A shipped template, in default configuration, turns untrusted data into |
| execution / redirection / unsafe deserialisation / remote-resource fetch / |
| auth bypass that the template - not the operator's wiring - introduced. |
| | _In-scope vulnerability classes_ |
| |
| | `VALID-HARDENING` |
| | No property above is broken, but a template could reasonably strip a header, |
| tighten a `pattern:`, add secret metadata, or flip a default. Fixed at PMC |
| discretion; usually no CVE. |
| | _Missing or incorrect secret / constraint metadata_ |
| |
| | `OUT-OF-MODEL: operator-bound-input` |
| | Requires attacker control of a `{\{property}}` (template, query, expression, |
| URL, command, path, credential). |
| | _Out of scope_, item 1 |
| |
| | `OUT-OF-MODEL: by-design-named-behaviour` |
| | Requires the Kamelet to do the dangerous thing it is explicitly named for, or |
| network exposure of a source. |
| | _Out of scope_, items 2-4 |
| |
| | `OUT-OF-MODEL: runtime-not-in-this-repo` |
| | The defect is in the `kamelet:` component, placeholder binding, or |
| `kamelets.utils` - route to `apache/camel`. |
| | _Component families_, last row |
| |
| | `OUT-OF-MODEL: unsupported-component` |
| | Lands in `script/`, `crds/` generator, `tests/`, `templates/`, or the build |
| plugin. |
| | _Component families_ / _Out of scope_ |
| |
| | `BY-DESIGN: property-disclaimed` |
| | Concerns a behaviour _Known limitations_ documents (Kafka header |
| deserialisation, `pattern:` not a trust control, verified marker, component |
| inheritance). |
| | _Known limitations_ |
| |
| | `OUT-OF-MODEL: third-party` |
| | Underlying Camel component or transitive dependency CVE not caused by the |
| template. |
| | _Out of scope_, item 5 |
| |
| | `MODEL-GAP` |
| | Cannot be routed to any of the above - triggers a revision of this model |
| rather than an ad-hoc call. |
| | this section |
| |=== |
| |
| === Conditions that would change this model |
| |
| Revise this document when: a new Kamelet introduces a sink-side dispatch |
| surface or evaluates message data as an expression/template by default; a |
| template ships an insecure component default; the catalog gains a runtime that |
| parses untrusted Kamelet YAML; `camel-kamelets-utils` returns to this |
| repository; a `script/` / example artifact is promoted into shipped runtime; or |
| a report arrives that cannot be cleanly assigned a disposition above. |
| |
| == Maintainer ratification |
| |
| The structural inferences in the initial draft were put to the Apache Camel PMC |
| and *confirmed on 2026-05-15*. They are now folded into the body as fact; this |
| record preserves the chain of authority so a triager can cite |
| "_(maintainer, 2026-05)_" when closing a report. |
| |
| [cols="3,2",options="header"] |
| |=== |
| | Question put to the PMC | Ratified answer (now in the body) |
| |
| | Is the catalog covered by Camel's existing security process, with this page |
| as the Kamelet-specific annex? |
| | *Yes.* `private-security@camel.apache.org`, the Camel PMC, CVEs under the |
| Camel project. (Header / _Reporting a vulnerability_.) |
| |
| | Must a sink/action template that maps untrusted input into a dispatch |
| position strip the dispatch headers it does not consume - committed property |
| or per-Kamelet practice? |
| | *Committed property.* Every such new or changed template must satisfy it. |
| (_Security properties_ / _Guidance for Kamelet authors and reviewers_.) |
| |
| | Is loading a Kamelet from an untrusted/user-writable source "attacker is a |
| trusted route author - RCE by design, out of scope"? |
| | *Yes.* (_Trust boundaries_; _Downstream responsibilities_.) |
| |
| | Is `deserializeHeaders: true` on Kafka source Kamelets the supported |
| production default? |
| | *Yes* - supported default, String conversion only, per-Kamelet opt-out |
| documented; a report against it is `BY-DESIGN`. (_Known limitations_.) |
| |
| | Are the `*-not-secured-*` Kamelets shippable / out of scope? |
| | *Out of scope* as a "vulnerability" - documented dev/test convenience, |
| explicit in the name. (_Out of scope_.) |
| |
| | Is `camel-kamelets-crds` in or out of model? |
| | *Out of model* - the deserialiser is the consumer's Kubernetes client / |
| Fabric8, not this repository's code. (_Component families_.) |
| |
| | Document placement and pointers (this page, root `SECURITY.md`, `AGENTS.md` |
| mirroring `apache/camel`)? |
| | *Confirmed* and in place. (_Related documents_.) |
| |
| | Publish a machine-readable triage sidecar (per-Kamelet trust / in-out / |
| dispositions) for automated review? |
| | *Deferred by PMC decision* - revisit once the prose model has lived through |
| a few triage cycles. This is a deliberate non-goal for now, not an open |
| question. (_Conditions that would change this model_.) |
| |=== |
| |
| A future revision is triggered by the events listed under |
| _Conditions that would change this model_ - in particular a report that cannot |
| be assigned a disposition, which is treated as a `MODEL-GAP` and a prompt to |
| revise this page rather than make an ad-hoc call. |
| |
| == Related documents |
| |
| * link:/manual/security-model.html[Apache Camel Security |
| Model] - the parent model this page specialises. |
| * xref:development.adoc[Kamelets Developer Guide] - how Kamelets are authored. |
| * xref:apis/spec.adoc[Kamelet CRD specification] - the YAML contract. |
| * link:/security/[Apache Camel Security] - the public |
| advisory index and reporting process. |
| * `SECURITY.md` (repository root) - the GitHub-rendered security pointer. |