This is an automated email from the ASF dual-hosted git repository. luigidemasi pushed a commit to branch fix/security-model-verification-153-158 in repository https://gitbox.apache.org/repos/asf/camel-kit.git
commit 26b2f4bc6586a207d8c5eea367952c8800d20599 Author: Luigi De Masi <[email protected]> AuthorDate: Mon Nov 9 19:15:21 2026 +0100 Fix #156: verify and correct the process side-effect inventory Fixes #156 Co-authored-by: OpenAI Codex <[email protected]> --- CHANGELOG.md | 2 + docs/security-model.md | 117 ++++++++++++++++++++++-------------------- docs/security-model.yaml | 33 ++++++------ docs/security-verification.md | 28 ++++++++++ 4 files changed, 109 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95ba9893..7a771036 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- **Verified process inventory (#156)** — correct CLI/Ship/Knowledge host effects and clock assumptions, distinguish source evidence from runtime observations, and record the six verification outcomes. + - **Knowledge runtime boundaries (#158)** — enforce offline CPU tokenizer initialization, cover query/cap/fallback and transport behavior, document native caches, and accept conventional CVE severity spellings. - **Generated and cached path confinement (#157)** — refuse descendant symlinks before init/catalog writes and validate catalog versions before extraction or replacement. diff --git a/docs/security-model.md b/docs/security-model.md index a33b0ff3..7ffce5d7 100644 --- a/docs/security-model.md +++ b/docs/security-model.md @@ -12,11 +12,11 @@ | Field | Value | | --- | --- | | Project | Apache Camel Kit — the Kit and Knowledge products (`apache/camel-kit`) | -| Version / source baseline | Kit `0.4.2-SNAPSHOT` (source baseline commit `70796c02`); Knowledge `0.0.3-SNAPSHOT` (baseline commit `9c8173cb`) | +| Version / source baseline | Kit `0.4.2-SNAPSHOT`; Knowledge `0.0.3-SNAPSHOT`; main `2863e915` plus PR #6 and verification fixes #153–#158 | | Repository layout | Monorepo since commit `9c8173cb`: `kit/` and `knowledge/` with independent release lines | -| Date | 2026-10-22; revised 2026-10-27 after review round 2; revised 2026-11-02 after review round 3 | +| Date | 2026-10-22; policy decisions 2026-10-27; verification revision 2026-11-09 | | Author(s) | Camel-Kit maintainers; drafted with the threat-model-producer procedure in draft-first mode for [apache/camel-kit#5](https://github.com/apache/camel-kit/issues/5) | -| Status | **DRAFT — policy ratified, acceptance pending verification.** All thirteen §4.14 questions were answered by a maintainer on 2026-10-27 (§4.14.1). Acceptance is blocked on the verification items V1–V6 of §4.14.2: tested parser guarantees, graph confinement and bounds, narrower Claude MCP defaults, a verified per-process side-effect inventory, init and download path controls, and verification of the Knowledge section; each item has a tracking issue (#153–#158). Claims tagged *(i [...] +| Status | **DRAFT — implementation verification complete; maintainer acceptance pending.** Policy decisions remain those recorded on 2026-10-27. Changes for #153–#158 implement V1–V6 with [source and executable evidence](security-verification.md). Acceptance/merge and publication under #131 remain maintainer actions; this revision does not claim their approval. | **Version binding.** This model is versioned with the project. A report against Camel-Kit version *N* is triaged against the model as it stood at *N*, not at `HEAD`. Camel Ship is a Technology Preview *(documented — README, @@ -32,8 +32,7 @@ assumptions, but also introduces specific surfaces and trust boundaries related workflow execution, graph parsing of migration sources, and dynamic classloader resolution")*. **Inherited properties bind before they are verified.** Where this document records that the enforcement of an -inherited property is unverified or incomplete (today: the confinement and bounded-resource clauses of the graph -source-reading contract, §4.8 P1), the property still binds and a report that breaks it is triaged `VALID`; the gap +inherited property is unverified or incomplete, the property still binds and a report that breaks it is triaged `VALID`; the gap is tracked as a §4.14.2 verification item, never disclaimed in §4.9 *(maintainer, 2026-10-27 — Q2)*. **Provenance legend.** *(documented)* = stated in Camel-Kit's own documentation, source-level Javadoc, shipped @@ -42,14 +41,14 @@ cited. *(maintainer, date)* = stated by a maintainer in answer to a §4.14 quest apache/camel-kit#6, or as a recorded decision. *(inferred)* = reasoned from code structure or the absence of a feature; every *(inferred)* tag names the §4.14.2 verification item (`Vn`) that will settle it. -**Draft confidence.** 200 documented / 33 maintainer / 21 inferred tags. Update as §4.14.2 items are -verified. +**Verification basis.** Source references and executable results are recorded per item in +[security-verification.md](security-verification.md). Historical policy decisions remain attributed +to their maintainers; automated evidence does not imply human approval. **Products covered.** This model covers both products of the monorepo: **Kit** in `kit/` (families A–E, G and H in §4.2) and **Knowledge** in `knowledge/` (families K and K2, §4.4a). Knowledge joined this model by maintainer decision after the consolidation in [apache/camel-kit#2](https://github.com/apache/camel-kit/issues/2) -*(maintainer, 2026-10-27 — Q11)*; its statements are drafted from code and the Knowledge README and await -verification (V6). External MCP servers remain out of scope (family F). References to the product README below mean +*(maintainer, 2026-10-27 — Q11)*; its statements are supported by source and executable evidence (V6). External MCP servers remain out of scope (family F). References to the product README below mean `kit/README.md` unless they name `knowledge/README.md`. **Purpose (one paragraph).** Camel-Kit is a developer tool that adds structured workflows ("skills", Markdown @@ -98,7 +97,7 @@ metadata; Kit configures it for each harness, and it also serves MCP clients tha | Family | Representative entry points | Touches outside the process? | In this model? | | --- | --- | --- | --- | - | **A. Workspace CLI** — `init`, `doctor`, `doc`, `nextId`, `plan analyze`, `graph *` (`camel-kit-core` commands, services, generators, catalog downloaders; `camel-kit-main` JBang launcher; `camel-jbang-plugin-kit`) | picocli commands | Writes the target workspace; reads `~/.camel-kit/config.properties`; `init` downloads catalogs over HTTPS unless `--no-fetch`; version probes spawn `java`, `jbang`, `camel`, `mvn`/`mvnw`, `pi` | **In** | + | **A. Workspace CLI** — `init`, `doctor`, `doc`, `nextId`, `plan analyze`, `graph *` (`camel-kit-core` commands, services, generators, catalog downloaders; `camel-kit-main` JBang launcher; `camel-jbang-plugin-kit`) | picocli commands | Writes the target workspace; reads `~/.camel-kit/config.properties`; `init` downloads catalogs over HTTPS unless `--no-fetch`; prerequisite probes spawn `java`, `jbang`, `camel` (including `camel test --help`) and `mvn` when no wrapper exists; see §4.5 [...] | **B. Graph analysis** (`camel-kit-graph`: Pom, Java, Groovy, XML route, Mule XML, DataWeave, BizTalk, YAML route, Config parsers plus the cross-linker and property-binding post-processors) | `camel-kit graph …`; `init --here` auto-analysis | Reads the analysed tree; writes `.camel-kit/project-graph.json`; no network, no child process *(documented — `ParserSourceReadingContractTest`; [V1 evidence](security-verification.md#v1-source-reading))* | **In** — the analysed tree is untrusted input | | **C. Skills, templates, traits, agent registry, workflow manifest** (`kit/camel-kit-core/src/main/resources/{skills,templates,agents,workflow}`) | installed by `init` into the workspace | Nothing by itself; the harness executes the instructions with its own permissions; generated MCP configs make the harness launch MCP servers through `jbang` at pinned coordinates | **In** as shipped instructions and generated configuration; the harness and the model are out (§4.3) | | **D. Ship controller** (Technology Preview; `camel-kit-core` `ship/**`, `command/ship`) | `camel-kit ship`, `/camel-ship` delegates | Spawns `pi`/`node` (Pi backend), `/usr/bin/setsid`, `/bin/kill`, its own `java`; writes `.camel-kit/ship/state` or `$CAMEL_KIT_SHIP_STATE_HOME`; publishes into the live project; HTTPS to Maven Central through family E | **In** | @@ -146,7 +145,7 @@ metadata; Kit configures it for each harness, and it also serves MCP clients tha Docker and the coding harnesses belong to their projects. Kit's generated configuration for them is in (§4.8 P4, P10). Knowledge is maintained in this repository and is in this model (§4.4a). - **The content of the upstream sources Knowledge indexes.** Apache documentation, release notes, advisories and - catalog metadata are ingested at release tags from Apache repositories, Maven Central, Apache JIRA, NVD and CIRCL + catalog metadata are ingested from selected Apache product refs, Maven Central, Apache JIRA, NVD and CIRCL; version discovery also reads camel-website main (§4.4a); hostile content there would require a compromised upstream source (§4.7). What that content says is data for the consumer, never an instruction. - **Vulnerabilities in transitive dependencies not reachable through Camel-Kit code**, as in the umbrella model @@ -223,7 +222,7 @@ trusted")*. Maven Central response, or by another local account — never when it requires the developer's own OS account. - **K (Knowledge server and index):** in-model if reachable from a tool argument, from a release-list, manifest or archive response, from the cache directory contents, or by another local account — never when it requires the - developer's own OS account. **K2 (indexer):** its inputs are upstream Apache sources at release tags; a finding needs + developer's own OS account. **K2 (indexer):** its inputs are upstream Apache sources at selected product refs plus camel-website main discovery; a finding needs hostile upstream content (§4.7, out) unless the indexer breaks its own path or process boundary. - **F, G, H:** out; route to the owning project or to the Apache Camel Security Model. @@ -268,8 +267,8 @@ Knowledge README, code and executable checks recorded in [V6 evidence](security- on the supported bundled CPU path; it is not an OS sandbox or permission to install arbitrary native-library overrides. `OfflineModelsTest` exercises both model initialization orders. - *Indexer* (`knowledge/indexer`, `IndexerMain`): a maintainer-run build tool that "runs during CI/CD to produce the - pre-built index artifact", invoked by the `-Prebuild-index` profile and the `Index Release` workflow. It clones - Apache repositories at release tags with JGit, converts AsciiDoc, downloads Camel Catalog JARs, fetches Apache JIRA + pre-built index artifact", invoked by the `-Prebuild-index` profile and the `Index Release` workflow. It reads camel-website main for version discovery, then clones + selected Apache product refs with JGit, converts AsciiDoc, downloads Camel Catalog JARs, fetches Apache JIRA issues and enriches advisories from NVD with a CIRCL fallback, then writes the Lucene index *(documented — `IndexerMain` Javadoc; `knowledge/README.md`)*. It never runs inside the shipped server. @@ -295,7 +294,7 @@ Knowledge README, code and executable checks recorded in [V6 evidence](security- *(documented — `knowledge/README.md`, "Index Distribution")*. Search results are the upstream authors' text and are data for the consumer (§4.4; `context-authority.md`). 4. *Indexer ← upstream sources.* Inputs are `apache/camel`, `apache/camel-website`, `apache/camel-quarkus` and - `apache/camel-spring-boot` at release tags, Camel Catalog JARs from Maven Central, Apache JIRA, NVD and CIRCL + `apache/camel-spring-boot` at selected product refs, plus camel-website main for version discovery, Camel Catalog JARs from Maven Central, Apache JIRA, NVD and CIRCL *(documented — `knowledge/README.md`, "Data Sources", "CVE enrichment and fallback")*. These are trusted upstream sources; a hostile document would require a compromised Apache repository or mirror (§4.7). @@ -339,35 +338,51 @@ a report against `0.0.2` is triaged on what that release documents. *(documented — `ShipSecureFilesystem` Javadoc: "Internal bounded read policy for Ship trees"; unsupported filesystems fail closed)*. - **Concurrency.** Graph parsers run in a thread pool bounded by the CPU count and results are merged - deterministically *(inferred — V4)*. Ship holds run and project mutation locks for live-tree operations + deterministically *(documented — `GraphBuilder`; V4 source inventory)*. Ship holds run and project mutation locks for live-tree operations *(documented — `ShipPublicationService` Javadoc)*; "ordinary process interruption is recoverable … but Ship is not a daemon or a guarantee against OS or power loss" *(documented — `docs/commands.md`)*. -- **Time.** Only timeouts and deadlines depend on the clock (stage timeout default 10 minutes; native task deadlines) - *(documented — `docs/commands.md`, `docs/ship-native.md`)*; no security decision depends on wall-clock trust. -- **Network.** Outbound HTTPS only, to fixed or operator-configured origins; the JVM's standard proxy and TLS system - properties are honoured by the Ship resolver *(documented — `ShipMavenResolver` session comment)*. Knowledge needs - a cache filesystem that "must support advisory file locks and atomic moves" *(documented — `knowledge/README.md`)*. - -**Per-process side-effect inventory.** Negative claims are scoped to the process and configuration that support them -*(maintainer, 2026-10-27 — Q6)*. A cell marked *documented* cites a source or a code constant; a cell marked -*inspected* comes from code inspection and is *(inferred — V4)* until a maintainer verifies it. - -| Process (configuration) | Listening sockets | Child processes | Network | Filesystem writes | Environment read | Telemetry | Limits | +- **Time.** Wall-clock time is used for audit metadata, native task expiration, evidence ordering, + release/version metadata and enrichment cooldowns. Clock changes can affect persisted deadlines + *(documented — `ShipNativeWorker`, `ShipLocalStamp`, `ShipMainValidator`, `VersionResolver`, `IndexerMain`, `CveParser`)*. +- **Network.** Policy is component-specific: Kit downloaders use HTTPS; Knowledge also permits local + files and loopback HTTP; serving HTTP is opt-in; external workers retain their own network behavior. + Ship's resolver honors JVM proxy/TLS properties. Knowledge cache updates require advisory file locks + and atomic moves *(documented — downloader/resolver implementations and `knowledge/README.md`)*. + +**Per-process side-effect inventory.** Each row is tied to concrete implementation sources below. +“No direct call” describes the named first-party code path, not a guarantee about arbitrary JVM +startup agents, configured native libraries or external tools. [Verification evidence](security-verification.md#v4-process-inventory) +distinguishes source audit, dependency behavior and executable observations; it does not claim human +maintainer approval. Negative claims apply only to the listed process and configuration. + +| Process/configuration | Listening sockets | Child processes | Network | Filesystem writes | Environment and configuration inputs | Telemetry | Limits | | --- | --- | --- | --- | --- | --- | --- | --- | -| **Kit CLI** `camel-kit` / `camel kit`: `init`, `doctor`, `doc`, `nextId`, `plan analyze`, `graph` | none (inspected) | version probes only: `java -version`, `jbang version`, `camel --version`, `mvn`/`mvnw`, `pi -a` *(documented — `PrerequisiteChecker`, `DoctorService`, `docs/agent-architectures.md`)* | `init` without `--no-fetch`: HTTPS to `repo1.maven.org`, `raw.githubusercontent.com/apache/camel`, `api.github.com` (Kamelet listing) and `search.maven.org`; redirects followed except HT [...] -| **Graph analysis** (inside the CLI process) | none (inspected) | none *(documented — `ParserSourceReadingContractTest`; [V1 evidence](security-verification.md#v1-source-reading))* | none *(documented — `ParserSourceReadingContractTest`; [V1 evidence](security-verification.md#v1-source-reading))* | `.camel-kit/project-graph.json` or the `--output` path *(documented — `GraphGenerateCommand`)* | none (inspected) | none (inspected) | 60 s per parser including POM; 16 MiB/source, 64 MiB agg [...] -| **Ship controller** `camel-kit ship` | none (inspected) | `pi` and `node` (Pi backend), `/usr/bin/setsid`, `/bin/kill`, the controller's own `java` for evidence *(documented — `PiWorker`, `LocalCommandRunner`, `EvidenceRunner`)* | HTTPS to Maven Central through the resolver; no redirects; checksum `fail` *(documented — `ShipMavenResolver`)* | `.camel-kit/ship/state/` or `$CAMEL_KIT_SHIP_STATE_HOME`; the live project only through journaled publication *(documented — `docs/commands.md`, [...] -| **Ship Pi worker** (`--backend pi`) | Pi's own process | Pi's tools — `bash`, `edit`, `write` in EXECUTE — started in the staging cwd, which is a working directory, not a confinement *(documented — `PiWorker` Javadoc)* | whatever Pi and its provider need — external behaviour, outside this model (§4.3); launched with `--offline`, `--no-extensions`, `--no-skills`, `--no-context-files` *(documented — `PiWorker` arguments)* | *Intended:* the staging workspace and its session directory unde [...] -| **Ship evidence JVMs** | none (inspected) | none (inspected) | none by design: every non-direct endpoint stubbed *(documented — `docs/commands.md`)* | private `HOME` and `TMPDIR` under the run; frozen read-only copy *(documented — `EvidenceRunner`)* | scrubbed to `LANG`, `LC_ALL`, `HOME`, `TMPDIR`, `GIT_CEILING_DIRECTORIES` and controller-provided variables *(documented — `EvidenceRunner`)* | none (inspected) | 64 MiB log cap; stage timeout *(documented — `EvidenceRunner`)* | -| **Knowledge MCP server** (default configuration) | none — stdio *(documented — `knowledge/README.md`)*; HTTP/SSE only with `quarkus.http.host-enabled=true` | none *(inferred — V6)* | first query only: the configured releases endpoint, manifest and asset URLs over `https` (`http` only to a loopback host), each redirect target checked before the hop *(documented — `IndexDownloader`; apache/camel-kit#143)*; nothing else *(inferred — V6)* | `~/.camel-kit/knowledge-index` or `knowledge.inde [...] -| **Knowledge indexer** (maintainer tool: `-Prebuild-index`, `index-release.yml`) | none (inspected) | none — JGit runs in-process (inspected) | `github.com` (clones, `ls-remote`), `raw.githubusercontent.com`, Maven Central, `issues.apache.org`, `services.nvd.nist.gov`, `vulnerability.circl.lu` *(documented — `knowledge/README.md`, `VersionResolver`, `JiraFetcher`, `CveParser`)* | `knowledge/indexer/src/main/resources/apache-camel/{repos,catalog-cache,embedding-cache,cve-cache}` and the [...] +| Kit CLI: init, doctor, doc, nextId, plan analyze, graph | No direct listener in these command paths [I1]. | Init/doctor prerequisites invoke java -version, jbang version, camel --version; init also invokes camel test --help. Doctor invokes mvn -version if no wrapper is present. Probes inherit environment [I1]. | Init fetchers use HTTPS Maven Central, raw GitHub, GitHub API and Maven Search; redirects except HTTPS downgrade; no independent checksum/signature. Other listed implementation [...] +| Graph analysis/visualization in CLI | No direct listener [I3]. | No direct launcher [I3]. | No direct fetch in source-parsing path [I3]. | Generate: project-graph.json or --output; visualize: project-graph.html or --output [I3]. | Selected paths; source placeholders are data, not process-environment substitution [I3]. | No first-party export call found [I3]. | CPU-limited pool, sorted merge; all parsers including POM 60 s; source 16 MiB/file and 64 MiB total; 100000 visited entries. Co [...] +| Ship controller | No direct listener [I4]. | Pi: setsid launches node with Pi script; kill cleanup helper. Evidence: controller Java. Native mode writes tasks for external host [I4]. | Fixed https://repo.maven.apache.org/maven2/; no redirects, checksum fail for downloaded artifacts; preexisting local artifacts trusted. JVM proxy/TLS settings apply [I4]. | State root; private Maven repository (stateRoot/catalog-repository or --maven-repository); run/lock/dispatch/evidence artifacts. Liv [...] +| Ship Pi worker | External Pi/provider behavior. | Pi tools selected by stage; staging cwd is not confinement [I5]. | External Pi/provider behavior. Offline/no-extensions/no-skills/no-context-files arguments do not create an OS network restriction [I5]. | Intended staging/session paths; same-account-reachable paths remain accessible. Native hosts have separate external policies [I5]. | Full captured controller environment; bounded Git discovery for EXECUTE [I5]. | External Pi/provider b [...] +| Ship evidence JVMs | No listener requested by inspected launcher/payload; no OS socket restriction [I6]. | Direct Java launch, payload in process; no OS process restriction [I6]. | Non-direct endpoints stubbed by validator; no OS egress restriction [I6]. | Private HOME/TMP, accepted frozen tree, stdout/stderr; nested payload JARs extracted under private JVM temp. Same OS account remains privilege boundary [I6]. | Environment cleared then fixed LANG/LC_ALL/HOME/TMPDIR, controller variab [...] +| Knowledge MCP, default stdio | HTTP host disabled by property; opt-in HTTP/SSE changes this. Runtime proof is configuration-specific [I7]. | No first-party launcher; OfflineTokenizer disables CUDA child discovery and implicit JNA ldconfig lookup [I7]. | Index releases/manifests/assets when needed; HTTPS/loopback HTTP and local file inputs; validated redirects. Models/tokenizer data are classpath resources. OfflineTokenizer enforces offline CPU initialization: no metadata/telemetry or n [...] +| Knowledge indexer, maintainer build process | No direct listener [I8]. | JGit/AsciidoctorJ called in process; no first-party launcher; shared OfflineTokenizer policy disables implicit CUDA/JNA subprocess discovery [I8], [D1]. | GitHub/raw files, Maven Central, Apache JIRA, NVD, CIRCL; shared offline CPU embedding initialization above. This is implemented origins, not an OS allowlist [I8], [D1]. | Selected resources root apache-camel/{repos,catalog-cache,jira-cache,embedding-cache,cve-c [...] + + +[I1]: ../kit/camel-kit-core/src/main/java/org/apache/camel/kit/service/DoctorService.java +[I2]: ../kit/camel-kit-core/src/main/java/org/apache/camel/kit/catalog/CatalogDownloader.java +[I3]: ../kit/camel-kit-graph/src/main/java/org/apache/camel/kit/graph/GraphBuilder.java +[I4]: ../kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/worker/LocalCommandRunner.java +[I5]: ../kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/worker/PiWorker.java +[I6]: ../kit/camel-kit-core/src/main/java/org/apache/camel/kit/ship/evidence/EvidenceRunner.java +[I7]: ../knowledge/mcp/src/main/java/org/apache/camel/kit/knowledge/mcp/IndexDownloader.java +[I8]: ../knowledge/indexer/src/main/java/org/apache/camel/kit/knowledge/indexer/IndexerMain.java +[D1]: ../knowledge/embedding/src/main/java/org/apache/camel/kit/knowledge/embedding/OfflineTokenizer.java +[D2]: ../knowledge/embedding/src/main/java/org/apache/camel/kit/knowledge/embedding/OnnxEmbeddingProvider.java Camel-Kit never runs `git` against the live project: Ship bounds Git discovery at the staged workspace with `GIT_CEILING_DIRECTORIES` so "Git commands run by the Execute worker, by local commands, or by validation inside it do not reach the project's repository" *(documented — `docs/commands.md`)*; neither product commits or pushes (inspected), and the generated Copilot hook and Pi guard deny `git push` by the agent *(documented — `docs/agent-architectures.md`)*. Deletions are confined to generated assets inside the project (refusing symbolic -links), controller-owned state, caches and private temporary directories *(documented — `GeneratedAssetCleaner`, +links), controller-owned state, caches and private temporary directories *(documented — `GeneratedAssetCleaner`, `InitService`, `ConfinedPaths`, `IndexDownloader`)*. --- @@ -390,7 +405,7 @@ Camel-Kit is a family of postures. The knobs that move the security envelope: | `camel-kit ship --maven-repository PATH` | `<state root>/catalog-repository` | Private repository for validation payloads. "Checksum enforcement applies to downloads only, so protecting the repository between runs belongs to the caller" *(documented — `ShipMavenResolver` Javadoc)*. | Documented. | | `CAMEL_KIT_SHIP_STATE_HOME` | unset → `.camel-kit/ship/state/` in the project | Relocates run records, retained evidence, Pi transcripts and the staged workspace *(documented — `docs/commands.md`)*. | Documented; location choice is the developer's (§4.10). | | `camel-kit ship --stage-timeout` | `10m` | Bounds one stage attempt. | Documented. | -| `knowledge.index.path` (`KNOWLEDGE_INDEX_PATH`) | unset | Uses a local index directory in place: no network, no cache *(documented — `knowledge/README.md`)*. | Documented (development, tests, air-gapped use). | +| `knowledge.index.path` (`KNOWLEDGE_INDEX_PATH`) | unset | Uses a local index directory in place: no index-acquisition network or index cache; native-library caches still apply *(documented — `knowledge/README.md`)*. | Documented (development, tests, air-gapped use). | | `knowledge.index.url` (`KNOWLEDGE_INDEX_URL`) | unset → release discovery | Explicit manifest URL; `https` and `file` are accepted anywhere, `http` only to a loopback host (`localhost`, `127.0.0.0/8`, `::1`) — a plaintext manifest from a remote host is refused before any request, and so is a redirect to one *(documented — `knowledge/README.md`; `IndexDownloader.requireFetchableUri`; apache/camel-kit#143)*. | Documented; an operator-selected origin is trusted input (§4.10). | | `knowledge.index.version` (`KNOWLEDGE_INDEX_VERSION`) | unset → newest compatible published index | Exact index pin; never falls back to another version *(documented — `knowledge/README.md`)*. | Documented. | | `knowledge.index.releases-url`, `knowledge.index.cache-dir` | `https://api.github.com/repos/apache/camel-kit/releases`, `~/.camel-kit/knowledge-index` | Discovery endpoint and cache location *(documented — `knowledge/README.md`)*. | Documented; operator input. | @@ -399,7 +414,7 @@ Camel-Kit is a family of postures. The knobs that move the security envelope: | `camel.main.profile` and other Camel knobs in generated projects | Camel's | Belong to the generated integration and the umbrella model. | Downstream (§4.10). | The **insecure-default cases** were ruled on 2026-10-27: the generated Claude MCP wildcard pre-approval is not the -accepted posture and must be narrowed before acceptance (Q3, V3); the Maven pre-approval stands as documented; snapshot +accepted posture and is narrowed by V3 (Q3, V3); the Maven pre-approval stands as documented; snapshot repositories stay as a development convenience with their mutability documented (Q4). --- @@ -416,8 +431,8 @@ Per-entry-point trust table. "Caller" is the developer unless stated otherwise. | `~/.camel-kit/config.properties`, `.camel-kit/config.properties` | properties | no — operator | — | | `camel-kit graph <sub> [root]` | file bodies, names and link targets under `root` | **yes** | Same as `init --here`; confinement to `root` and bounded time and memory are claimed by P1, with enforcement verified under V2 | | `camel-kit graph …` output, `.camel-kit/project-graph.json` | graph JSON consumed by skills | derived from the tree | Treat as data in prompts *(documented — umbrella "Reading route sources")* | -| `camel-kit doc check/stale/unstale <file>` | YAML frontmatter of pipeline artifacts | model-authored → **yes** | Parsed as data with a bounded YAML tree parser *(inferred — V4)*; digests are staleness markers only (§4.9) | -| `camel-kit plan analyze` | `implementation-plan.md` task metadata | model-authored → **yes** | Same | +| `camel-kit doc check/stale/unstale <file>` | YAML frontmatter of pipeline artifacts | model-authored → **yes** | Parsed as data by `FrontmatterHandler` (Jackson YAML); no separate byte quota is claimed here; digests are staleness markers only (§4.9) | +| `camel-kit plan analyze` | `implementation-plan.md` task metadata | model-authored → **yes** | Parsed as data by `PlanAnalyzer`; no project execution | | `camel-kit nextId <slug>` | slug → `docs/camel-kit/NNN-slug/` | no — operator | — | | `camel-kit ship --text`, `--document PATH` | context for the model | supplied by the developer; **content is loaded context** for the model | Do not pass secrets; third-party documents can carry instruction-like text (§4.3, §4.10) | | `camel-kit ship` native result envelope (`--result PATH`; `bob2-native`, `copilot-native`, `claude-native`, `codex-native`) | stage result JSON and file proposals | **yes** — model output | Controller: strict JSON schema (`FAIL_ON_UNKNOWN_PROPERTIES`, no coercion); a proposal is written only for the approved route and test paths, `pom.xml` and `.camel-kit/config.properties`, after a known-secret scan; then the same candidate checks as the Pi backend (§4.8 P5–P9) | @@ -918,7 +933,7 @@ Suitable as a suppression or negative-prompt list for scanners and AI-assisted t - **Lucene `QueryParser` fed with tool arguments**: query text is escaped with `QueryParser.escape` and results are bounded (P14). - **ONNX Runtime native library loaded in the Knowledge server**: the bundled embedding model and reranker are - packaged at build time and copied to a private temporary directory; no runtime model download (§4.4a). + packaged at build time; the embedding model uses private temporary files and the reranker loads model bytes in memory; native libraries have their own cache/temp paths; no runtime model download (§4.4a). - **The Knowledge indexer clones repositories and calls Apache JIRA, NVD and CIRCL**: a maintainer-run build tool on trusted upstream sources, not part of the shipped server (§4.4a). - **Scanner hits in `examples/`, `tools/`, `camel-kit-dispatch/`, `src/test/**`**: `OUT-OF-MODEL: @@ -931,7 +946,7 @@ Suitable as a suppression or negative-prompt list for scanners and AI-assisted t - A new CLI command, parser or input format that reads external content; a parser moving to a later compilation phase or to symbol resolution against the analysed tree's classpath. - A change to the graph parser timeout or the POM parser path, or the addition of size, memory or symbolic-link - checks in `camel-kit-graph` (which closes V2 items and promotes P1 tags). + checks in `camel-kit-graph` (review V2 coverage and P1 claims). - Knowledge: a new tool, a tool argument that names a path, URL or command, the SSE transport enabled by default, a new download origin or manifest scheme, a change to the `IndexDownloader` transport rule or redirect validation, a new index format channel, authentication added to the transport, the indexer promoted into the runtime server, or @@ -941,7 +956,7 @@ Suitable as a suppression or negative-prompt list for scanners and AI-assisted t redirect policy. - `init` writing outside the target directory or under `$HOME`; Ship state moving back to a user-level default. - A new generated harness asset that grants permissions, installs hooks or auto-approves tools; a change to an - existing allow-list, hook or guard policy. Completion of V3 promotes P10 to the accepted posture. + existing allow-list, hook or guard policy. Keep V3 regression coverage aligned with P10. - A new remote repository or coordinate in `distribution.properties`, or signature/checksum verification added to `init` downloads (which would move that item from §4.9 to §4.8). - Ship supporting Spring Boot or Quarkus projects, non-Linux hosts, binary or deletion proposals, or leaving @@ -1039,10 +1054,7 @@ tags read *(maintainer, 2026-10-27 — Qn)*. ### 4.14.2 Verification items blocking acceptance -Answering the policy questions did not mark the implementation work complete. Every remaining *(inferred — Vn)* tag -routes to one of these items; the model is accepted when each is verified by a maintainer or closed by a change. -Until then a report that matches an open item is triaged on the model's claim (§4.13). Each item is tracked in its -own issue, linked below. +The following changes implement the six verification items. Evidence records what was tested and what was source-audited; it does not imply maintainer approval or issue closure. A report is always triaged on the claimed boundary (§4.13), even when implementation work is in flight. - **V1 — Per-parser regression coverage (Q1; #153): implemented.** `ParserSourceReadingContractTest` exercises all nine parsers, with observable output and hostile source canaries. See [V1 evidence](security-verification.md#v1-source-reading), including mutation controls. A demonstrated breach remains `VALID` under P1. @@ -1050,11 +1062,8 @@ own issue, linked below. - **V3 — Narrower Claude MCP grants (Q3; #155): implemented.** Fresh and repeated generation emit exactly the manifest-listed MCP grants. Real Claude Code 2.1.316 probes cover allowed and unlisted tools for all three servers, plus wildcard/removal controls. [V3 evidence](security-verification.md#v3-claude-permissions). -- **V4 — Verified per-process side-effect inventory (Q6; #156) → §4.5, §4.4a.** Maintainer verification of every row of the - §4.5 inventory — Kit CLI, graph analysis, Ship controller, Pi worker, evidence JVMs, Knowledge server, Knowledge - indexer — for listeners, child processes, network origins, filesystem writes, environment reads, telemetry and - actual parser limits. *Interim triage:* inspected statements stay *(inferred)*; a breach of a claimed property is - `VALID`. +- **V4 — Per-process side-effect inventory (Q6; #156): implemented.** Every row has source references and configuration scope; missing CLI probes/configuration, graph HTML, Ship repository writes, native caches, indexer outputs and clock behavior are corrected. [V4 evidence](security-verification.md#v4-process-inventory) records the verification method. This is source/runtime evidence for maintainer review, not a claim of maintainer sign-off. + - **V5 — Init and download path controls (Q7, Q9; #157): implemented.** Regression tests cover shared init outputs, every agent, generated leaves, cache ancestors, malicious versions and archive paths for Citrus, Forage and Knowledge. [V5 evidence](security-verification.md#v5-generated-and-extracted-paths). Redirected writes remain `VALID`. - **V6 — Knowledge verification (Q11; #158): implemented.** Tool argument/cap tests, pinned/temp fallback tests, real-model offline probes and packaged stdio/SSE checks are recorded in [V6 evidence](security-verification.md#v6-knowledge). Native caches are disclosed, DJL offline initialization is enforced and ordinary severity spellings work. Existing #143/#142 hardening remains covered. A P12–P14 breach remains `VALID`. @@ -1099,7 +1108,5 @@ file changes. | `knowledge/README.md` (transport, tools, index distribution, cache rules, data sources, CVE enrichment, release lines), root `README.md` | §4.1, §4.2, §4.4a, §4.5, §4.5a, §4.8 P12–P14, §4.9, §4.11a | | Knowledge source: `IndexDownloader`, `IndexResolverConfig`, `KnowledgeMcpServer`, `LuceneSearchService`, `OnnxEmbeddingProvider`, `IndexerMain`, `VersionResolver`, `JiraFetcher`, `CveParser` | §4.4a, §4.5, §4.6, §4.8 P11–P14, §4.11a | -> **Self-check status:** every section is substantive; no bullet belongs in a code review or audit report; only the -> three sanctioned provenance tags are used; §4.9 and §4.10 are at least as substantive as §4.8; §4.6 is a -> per-entry-point table; §4.13 is a closed set with citations; every *(inferred)* tag names a §4.14 question with a -> proposed answer. **Status: DRAFT until the §4.14 waves are answered.** +> **Review status:** implementation evidence for V1–V6 is recorded separately from policy. +> Maintainer acceptance and publication under #131 remain pending. diff --git a/docs/security-model.yaml b/docs/security-model.yaml index b307c3d4..2c867e43 100644 --- a/docs/security-model.yaml +++ b/docs/security-model.yaml @@ -14,13 +14,13 @@ products: version: 0.0.3-SNAPSHOT latest_release: 0.0.2 (published under the former io.github.luigidemasi coordinates) index_release_channel: knowledge-index-v1-YYYY.MM.DD-HHMMSS -kit_source_baseline_commit: 70796c02 -knowledge_source_baseline_commit: 9c8173cb +kit_source_baseline_commit: 2863e915 +knowledge_source_baseline_commit: 2863e915 repository_layout_commit: 9c8173cb -revised_at_commit: a19d0529 +verification_revision: "2026-11-09; main2863e915 plus PR6 and #153-#158" date: "2026-10-22" last_review_round: "2026-10-27" -status: "draft - policy ratified 2026-10-27; acceptance pending verification items V1-V6 (tracked in #153-#158); revised 2026-11-02 after review round 3" +status: "draft - policy ratified 2026-10-27; implementation verification for #153-#158 complete; maintainer acceptance and publication #131 pending (2026-11-09)" canonical: docs/security-model.md umbrella_model: https://camel.apache.org/manual/security-model.html reporting: @@ -109,9 +109,9 @@ component_families: entry_points: [-Prebuild-index build, index-release.yml workflow] in_model: true section: "4.4a" - reachability: Its inputs are upstream Apache sources at release tags, trusted; a finding needs hostile upstream content (adversary not in scope) unless the indexer breaks its own path or process boundary. + reachability: Its inputs are selected upstream Apache product refs plus camel-website main discovery, trusted; a finding needs hostile upstream content (adversary not in scope) unless the indexer breaks its own path or process boundary. -processes_inventory_status: See 4.5 - each row records what the process does to the host and whether the statement is documented, code-inspected (V4) or maintainer-verified. +processes_inventory_status: Source-audited per-process inventory with concrete implementation references and configuration-scoped runtime evidence in security-verification.md V4; no human sign-off implied. entry_points: - entry: camel-kit init @@ -256,7 +256,7 @@ configuration_variants: security_relevant: false - knob: knowledge.index.path (KNOWLEDGE_INDEX_PATH) default: unset - effect: Uses a local index directory in place; no network, no cache. + effect: Uses a local index directory in place; no index-acquisition network or index cache; native-library caches still apply. security_relevant: true stance: documented (air-gapped and development use) - knob: knowledge.index.url (KNOWLEDGE_INDEX_URL) @@ -329,11 +329,11 @@ claimed_properties: property: Generated harness assets carry the accepted least-privilege posture - read-only Ship workers, read-only Codex roles, Copilot deny hook, Pi guard policy, no HTTP port for the Camel and Citrus MCP servers, and MCP grants aligned with the manifest allowed_tools (no runtime mutation or control tools) - as availability filters for Codex (enabled_tools), Copilot (tools), Pi (directTools) and Qwen (includeTools), as Bob 2's auto-approval list, with Codex, Copilot, Qwen and OpenCod [...] violation_symptom: "Generated asset grants more than the accepted posture: a worker with edit/shell tools, a filter or auto-approval list wider than manifest allowed_tools, a prompt-mode target auto-approved, or a hook/guard failing open on a documented pattern. Former wildcard exception applied only to the pre-V3 template (review of #6, 2026-10-27); newly generated wildcards are regressions. Any demonstrated breach is evaluated on its impact." severity: hardening; security-critical when the widened grant reaches a credential or destructive action without a prompt - provenance: "documented (docs/agent-architectures.md, docs/ship-claude.md, docs/ship-native.md, templates/mcp-configs/*, templates/claude/settings.json, Claude Code permissions reference); current Claude grant - maintainer, 2026-10-22 (review of #6); accepted posture - maintainer, 2026-10-27 (Q3)" + provenance: "documented (docs/agent-architectures.md, docs/ship-claude.md, docs/ship-native.md, templates/mcp-configs/*, templates/claude/settings.json, Claude Code permissions reference); historical wildcard grant - maintainer, 2026-10-22 (review of #6); accepted posture - maintainer, 2026-10-27 (Q3); implementation and generated-host checks - V3, security-verification.md" - id: P11 property: Stated resource bounds - route/Citrus YAML 2 MiB, native result 16 MiB and 1000 files, Pi prompt 1 MiB, Pi log 16 MiB, session 64 MiB, evidence log 64 MiB, stage timeout 10m, resolver 64 roots/512 artifacts/128 MiB JAR/4 MiB POM, tree quotas, migration-context depth 3 and 50 nodes; all graph parsers including POM 60 s each, source16 MiB/file and64 MiB total, discovery100000 entries (serves P1); Knowledge tool results at most 25 per call, release pages at most 2 MiB and 10 p [...] violation_symptom: A limit not enforced at its documented value. - severity: hardening + severity: hardening except graph source-reading boundary breaches, which are security-critical under P1 provenance: documented (ShipArtifactLimits, ShipNativeWorker, PiWorker, EvidenceRunner, ShipMavenResolver, ShipTreePolicy, docs/commands.md, KnowledgeMcpServer, IndexDownloader) - id: P12 property: Knowledge server transport - stdio by default with no listening socket; the HTTP/SSE transport exists only when the operator enables it (quarkus.http.host-enabled=true) on the configured host and port. @@ -341,7 +341,7 @@ claimed_properties: severity: security-critical provenance: "application.properties and knowledge/README.md; packaged stdio and explicit loopback SSE probe recorded in security-verification.md V6. HTTP/SSE has no built-in authentication; configure bind host explicitly." - id: P13 - property: Knowledge index acquisition integrity - a local knowledge.index.path is used in place without network; otherwise a published knowledge-index-v1-* release (newest compatible, or the exact pinned version) or an explicitly configured manifest is fetched with bounded pages and deadlines, the manifest must match the release tag, format version 1, the bundled embedding model and 384 dimensions, the archive SHA-256 must equal the manifest value before unpacking, zip entries are co [...] + property: Knowledge index acquisition integrity - a local knowledge.index.path is used in place without index-acquisition network; otherwise a published knowledge-index-v1-* release (newest compatible, or the exact pinned version) or an explicitly configured manifest is fetched with bounded pages and deadlines, the manifest must match the release tag, format version 1, the bundled embedding model and 384 dimensions, the archive SHA-256 must equal the manifest value before unpacking, [...] violation_symptom: An archive accepted on SHA-256 mismatch; an entry written outside the staging or version directory; a version name outside the safe-name rules accepted; a pinned client using another version or the classpath fallback; a manifest from a different release tag accepted; a remote fetch or redirect issued over non-loopback http; activation of a partially unpacked version. severity: security-critical (integrity and path escape) provenance: documented (knowledge/README.md "Index Distribution", IndexDownloader, LuceneSearchService, apache/camel-kit#143) @@ -478,7 +478,7 @@ known_non_findings: why: Query text is escaped with QueryParser.escape; results are bounded (P14). disposition: KNOWN-NON-FINDING - pattern: ONNX Runtime native library loaded in the Knowledge server - why: The bundled embedding model and reranker are packaged at build time and copied to a private temp directory; no runtime model download. + why: Bundled resources are packaged at build time; embedding model uses private temporary files, reranker loads bytes in memory; native libraries use separate cache/temp paths; no runtime model download. disposition: KNOWN-NON-FINDING - pattern: The Knowledge indexer clones repositories and calls Apache JIRA, NVD and CIRCL why: Maintainer-run build tool on trusted upstream sources; not part of the shipped server (4.4a). @@ -606,8 +606,9 @@ verification_items: from: [Q6] sections: ["4.5", "4.4a"] work: Maintainer verification of each row of the 4.5 inventory - Kit CLI, graph analysis, Ship controller, Pi worker, evidence JVMs, Knowledge server, Knowledge indexer - covering listeners, child processes, network origins, filesystem writes, environment reads, telemetry and actual parser limits, scoped to the process and configuration that support each statement. - interim_triage: Code-inspected statements remain inferred; a breach of a claimed property is VALID. - status: open + interim_triage: "Source audit and runtime observations are explicitly distinguished from maintainer approval; breaches of claimed properties remain VALID." + status: "implemented" + evidence: "All seven rows source-audited against named implementation classes and pinned dependency behavior; scoped executable checks recorded in security-verification.md V1-V6. Maintainer acceptance remains separate." - id: V5 tracking: apache/camel-kit#157 title: Init and download path controls through symbolic links @@ -626,14 +627,14 @@ verification_items: interim_triage: A breach of P12-P14 is VALID. status: "implemented" - evidence: "KnowledgeInputBoundaryTest, LuceneFallbackBoundaryTest, OfflineModelsTest, existing IndexDownloader/ReleaseDiscovery regressions and packaged stdio/SSE probe; security-verification.md V6" + evidence: "KnowledgeInputBoundaryTest, LuceneFallbackBoundaryTest, OfflineModelsTest, existing IndexDownloader/IndexDiscoveryTest regressions and packaged stdio/SSE probe; security-verification.md V6" revision_triggers: - New CLI command, parser or input format reading external content; parser moving to later compilation phase or symbol resolution. - - Change to the graph parser timeout or the POM parser path, or addition of size, memory or symbolic-link checks in kit/camel-kit-graph (closes V2 items). + - Change to the graph parser timeout or the POM parser path, or addition of size, memory or symbolic-link checks in kit/camel-kit-graph (review V2 coverage). - A new Knowledge tool, a tool argument that names a path, URL or command, the SSE transport enabled by default, a new download origin or manifest scheme, a change to the IndexDownloader transport rule or redirect validation, a new index format channel, authentication added to the transport, or the indexer promoted into the runtime server. - Change to default oversight mode, default backend, Pi tool lists or flags, tree policy rules/quotas, expression gate, secret-scan rules, resolver origin/checksum/redirect policy. - init writing outside the target directory or under $HOME; Ship state moving to a user-level default. - - New or changed generated harness asset granting permissions, installing hooks or auto-approving tools; completion of V3 (promotes P10 to the accepted posture). + - New or changed generated harness asset granting permissions, installing hooks or auto-approving tools; keep V3 coverage aligned with P10. - New remote repository or coordinate in distribution.properties; verification added to init downloads; Kit's Knowledge pin moving to org.apache.camel coordinates. - Ship supporting Spring Boot/Quarkus, non-Linux hosts, binary or deletion proposals, or leaving Technology Preview. - Any report that is a MODEL-GAP. diff --git a/docs/security-verification.md b/docs/security-verification.md index 6277ca6c..7de5a64d 100644 --- a/docs/security-verification.md +++ b/docs/security-verification.md @@ -113,6 +113,7 @@ Website impact: required; Knowledge runtime/reference updated. Published Knowled retroactively changed by these source fixes. + ### Packaged V6 observation (2026-11-09) The checked-in probe passed on Temurin 21.0.8+9 with runner SHA-256 @@ -124,3 +125,30 @@ unauthenticated initialization/query. Lifetime syscall traces contained only the exec, no child executable and no application service connection/send. JVM netlink and UDP port-zero interface discovery was recorded separately. The packaged runner contained all five model/tokenizer resources and no `knowledge-index/` payload. + +## V4: process inventory + +Every §4.5 row was checked against the following sources; this is a source audit, supplemented +by the named runtime tests above, rather than a human maintainer attestation: + +| Row | Sources and verification scope | +| --- | --- | +| CLI | PrerequisiteChecker/ProcessRunner actual argument vectors and inherited environment; DoctorService wrapper existence check versus mvn execution; OpenCodeGenerator global/ancestor/environment configuration; InitService and Doc/NextId command destinations; CatalogDownloader/CitrusSchemaDownloader/ForageCatalogService origins and request settings. External probes retain their own effects. | +| Graph | GraphBuilder/GraphParser concurrency, deterministic merge and bounds; GraphGenerateCommand/GraphVisualizeCommand JSON/HTML outputs; V1/V2 executable tests. | +| Ship controller | LocalCommandRunner, PiWorker, EvidenceRunner, ShipMavenResolver, ShipNativeWorker, ShipPublicationService: launch vectors, repository and state writes, native handoff, deadlines and publication. Existing controller regression suite remains required. | +| Pi worker | PiWorker.runRpc arguments, environment and working directory; no OS confinement. External Pi/provider implementation is not asserted to be silent or isolated. | +| Evidence JVM | EvidenceRunner/ShipJvmPayloadBootstrap and Camel validation: private environment/temp, classpath and stubbing policy. No claim of an OS socket/process sandbox. | +| Knowledge server | IndexDownloader, IndexResolverConfig, LuceneSearchService, KnowledgeMcpServer, application.properties and shared OfflineTokenizer; V6 tests and packaged-process probe. | +| Indexer | IndexerMain, ApacheCamelDomain, VersionResolver, JiraFetcher, CveParser: initial camel-website main discovery, selected product refs, source/cache roots including jira-cache, index.output and its sibling index.json, client-specific limits; shared embedding/native effects. No blanket filesystem/network quota. | + +Dependency audit used resolved DJL0.36.0, ONNX Runtime1.19.0 and JNA5.8.0 source/binary behavior: +DJL InputStream tokenizer factories call Ec2Utils.callHome; generic platform detection consults +CUDA before applying flavor, and JNA can invoke ldconfig unless its platform search path is set. +V6 fixes these observed effects and preserves expected cache/native extraction writes. ONNX +embedding external-data files and reranker in-memory model loading are described separately. + +Negative inventory cells describe inspected application operations and the recorded runtime +configuration. They do not waive P1–P14 or promise behavior for arbitrary external tools, +JVM startup agents or operator-selected native libraries. Website impact: not required for this +source inventory correction; behavior-changing fixes include Antora updates in V2/V3/V5/V6. +Publication of the accepted security model remains tracked by #131.
