This is an automated email from the ASF dual-hosted git repository.
PragmaTwice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks-controller.git
The following commit(s) were added to refs/heads/unstable by this push:
new a028361 Add draft threat model + SECURITY.md + AGENTS.md for
security-model discoverability (#397)
a028361 is described below
commit a02836134e6d5c31fa2129f74bc52475ae771bf4
Author: Jarek Potiuk <[email protected]>
AuthorDate: Fri Jun 5 04:22:58 2026 +0200
Add draft threat model + SECURITY.md + AGENTS.md for security-model
discoverability (#397)
* Add draft THREAT_MODEL.md + SECURITY.md + AGENTS.md for security-model
discoverability
Adds a draft (v0) threat model for the control plane plus the SECURITY.md
and
AGENTS.md scaffold so an automated scan agent can mechanically discover the
model
via AGENTS.md -> SECURITY.md -> THREAT_MODEL.md. The model is a proposal
for the
PMC to review; most claims are (inferred) and route to open questions in
section 14.
Generated-by: Claude Code (Claude Opus 4.8)
* Revise threat model per PMC review
Generated-by: Claude Code
* Revise threat model per git-hulk PR review (resolve §14 Q10-Q13)
---
AGENTS.md | 31 ++++++
SECURITY.md | 14 +++
THREAT_MODEL.md | 322 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 367 insertions(+)
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..9582427
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,31 @@
+<!--
+SPDX-License-Identifier: Apache-2.0
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+# Agent Guide for Apache Kvrocks Controller
+
+This file is read by automated agents (security scanners, code analyzers,
+AI assistants) operating on this repository. It points them at the
+human-authored references they should consult before producing output.
+
+## Security
+
+Security model: [SECURITY.md](./SECURITY.md) →
[THREAT_MODEL.md](./THREAT_MODEL.md)
+
+Agents that scan this repository should consult `SECURITY.md` and the linked
+`THREAT_MODEL.md` for the project's threat model — in particular the
+control-plane API/UI authentication posture, the controller's failover
+authority over managed Kvrocks clusters, metadata-store trust, and the SSRF
+surface of node registration — before reporting issues.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..1dbd7e5
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,14 @@
+# Security Policy
+
+## Reporting a Vulnerability
+
+Apache Kvrocks Controller follows the [Apache Software Foundation security
process](https://www.apache.org/security/).
+Please report suspected vulnerabilities **privately** to `[email protected]`
(the Kvrocks PMC is reachable
+at `[email protected]`). Do **not** open public GitHub issues or pull
requests for security reports.
+
+## Threat Model
+
+What the controller treats as in/out of scope, the security properties it
claims and disclaims (the
+control-plane API/UI authentication posture, its failover authority over
managed clusters, metadata-store
+trust, and the SSRF surface of node registration), the adversary model, and
how findings are triaged are
+documented in [THREAT_MODEL.md](./THREAT_MODEL.md). Reporters and triagers
should consult it alongside this policy.
diff --git a/THREAT_MODEL.md b/THREAT_MODEL.md
new file mode 100644
index 0000000..11ab193
--- /dev/null
+++ b/THREAT_MODEL.md
@@ -0,0 +1,322 @@
+<!--
+SPDX-License-Identifier: Apache-2.0
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+# Threat Model — Apache Kvrocks Controller
+
+## §1 Header
+
+- **Project:** Apache Kvrocks Controller — a Go cluster-management control
plane for Apache Kvrocks.
+ It probes managed Kvrocks nodes and performs **failover**, scales clusters
out/in, manages many
+ clusters from one (itself-clustered) controller, and stores cluster metadata
in a pluggable backend
+ (ETCD by default; ZooKeeper / Consul / Raft optional) *(documented — README,
`config/config.yaml`)*.
+- **Modelled against:** `apache/kvrocks-controller` `unstable`/HEAD
(2026-05-31).
+- **Status:** **DRAFT — v0, maintainer-reviewed (git-hulk — all §14 questions
answered), pending PMC sign-off.** Produced by the ASF
+ Security team via the `threat-model-producer` rubric
+ (<https://gist.github.com/potiuk/da14a826283038ddfe38cc9fe6310573>).
Companion to the
+ `apache/kvrocks` model; this one covers the **control plane**, whose trust
surface differs.
+- **Version binding:** versioned with the project.
+- **Reporting cross-reference:** §8-property violations → report privately per
`SECURITY.md` /
+ <https://www.apache.org/security/>; §3 / §9 findings closed citing this
document.
+- **Provenance legend:** *(documented)* / *(maintainer)* / *(inferred)* as in
the sibling model; each
+ *(inferred)* routes to a §14 question.
+- **Draft confidence:** with git-hulk's review folded in, the core model
(§2–§13) is maintainer-confirmed and all §14 questions are answered; the
residual *(inferred)* tags are limited to low-stakes details.
+
+The controller exposes an **HTTP API** (default `addr: 127.0.0.1:9379`) and a
bundled **web UI**, through
+which operators create clusters, add/remove nodes, migrate slots, and trigger
or automate failover
+*(documented — README, config)*. It is, in effect, the **administrative
authority** over every Kvrocks
+cluster it manages: whoever controls the controller controls those clusters'
topology and data placement.
+
+## §2 Scope and intended use
+
+Primary intended use *(documented)*: an operations control plane that a
cluster administrator runs to
+manage one or more Kvrocks clusters, backed by a consensus/metadata store for
its own state and HA. The
+controller is **required to be deployed inside a trusted environment**
*(maintainer — git-hulk)*.
+
+Caller roles:
+
+- **API / UI client** — whoever can reach `:9379` or the web UI. **There is no
built-in
+ authentication or authorization** *(maintainer — git-hulk)*, so this role is
*unauthenticated* and
+ gated only by `addr` / network reachability. Exposing an unauthenticated API
is **expected behaviour**
+ today; authentication/authorization is **planned** (tracking issue
+
[apache/kvrocks-controller#390](https://github.com/apache/kvrocks-controller/issues/390))
*(maintainer
+ — git-hulk)*.
+- **Metadata store (ETCD/…)** — trusted source of truth for cluster topology;
the controller believes it,
+ and is expected to *(maintainer — git-hulk; trusted environment)*.
+- **Managed Kvrocks node** — a data node the controller connects to and issues
admin/cluster commands to;
+ trusted as honest *(maintainer — git-hulk)*.
+- **Peer controller** — another controller instance in the same HA group,
coordinating via the store;
+ trusted as honest *(maintainer — git-hulk)*.
+- **Operator / deployer** — controls `config.yaml`, the store, TLS material,
network exposure, and the
+ managed-node credentials. Fully trusted; **out of model** as adversary (§3).
+
+**Component-family table:**
+
+| Family | Entry point | Touches outside process | In model? |
+| --- | --- | --- | --- |
+| HTTP control-plane API | `:9379`, `server/` | network; store; managed nodes
| **Yes** |
+| Web UI / dashboard | `webui/` | browser; the API | **Yes** |
+| Metadata store engine | `store/engine` (etcd/zk/consul/raft) | network (the
store) | **Yes** |
+| Controller → Kvrocks-node client | probing, cluster ops, failover | network
(managed nodes) | **Yes** |
+| Controller HA / leader election | via the store | network | **Yes** |
+| Build / tooling | `cmd`, `scripts`, `x.py`, `Makefile` | — | No → §3 |
+
+## §3 Out of scope (explicit non-goals)
+
+- **The operator / deployer as adversary** — controls `config.yaml`, the
metadata store, and the
+ deployment (§9) *(inferred)*.
+- **Hardening of the metadata store itself** (ETCD/ZK/Consul auth, ACLs, TLS)
— the controller consumes
+ it; securing it is the operator's job, though the controller must use the
credentials/TLS the operator
+ supplies *(documented — etcd `username`/`password`/`tls` fields exist,
default empty/off)*.
+- **The managed Kvrocks nodes' own threat model** — covered by the
`apache/kvrocks` model; this document
+ covers the controller's *use* of them.
+- **Network/transport hardening** — the controller does **not** provide
built-in TLS; operators front it
+ with a TLS proxy such as Nginx *(maintainer — git-hulk)*.
+- **A tampered metadata store or a Byzantine peer controller** — the store and
peer nodes are trusted as
+ honest because the deployment is required to be in a trusted environment
*(maintainer — git-hulk)*.
+- **Build tooling and tests.**
+
+## §4 Trust boundaries and data flow
+
+The primary trust boundary is the **HTTP API / web-UI surface**. A request
that reaches it can read or
+mutate cluster topology — create/delete clusters, add/remove nodes, migrate
slots, force failover
+*(documented — feature list)*. With **no built-in auth** *(maintainer —
git-hulk)*, the boundary is
+effectively the network ACL around `:9379`, and the deployment is required to
sit in a trusted
+environment.
+
+Secondary boundaries:
+
+- **Controller ↔ metadata store:** the controller trusts store contents as
ground truth for topology and
+ leadership, and is expected to — the store is trusted as honest *(maintainer
— git-hulk)*.
+- **Controller → managed node:** the controller connects out to node addresses
taken from its
+ metadata/API input and issues admin/cluster commands, holding whatever node
credentials the operator
+ configured (expected to be **stored inside the metadata store**)
*(maintainer — git-hulk)*. Node
+ addresses supplied via the API are accepted but **validated to be a real
Kvrocks node**; no further
+ SSRF hardening is considered necessary *(maintainer — git-hulk)* (§9).
+
+**Reachability preconditions:**
+
+- A finding in the **API/UI** path is in-model only when it breaks a §8
property; "the API is
+ unauthenticated" is by-design (§9), since the deployment is a trusted
environment.
+- A finding in **store handling** is in-model if reachable from API input; the
store contents themselves
+ are trusted (§7).
+- A finding in the **node client** (e.g. credential mishandling) is in-model
if a connection parameter is
+ attacker-influenceable via the API; arbitrary node addresses are accepted
but Kvrocks-validated
+ *(maintainer — git-hulk)*.
+- A finding reachable only from `config.yaml` or operator-held credentials is
out of model (§3).
+
+## §5 Assumptions about the environment
+
+- **Runtime:** a Go binary on a POSIX host; default API bind `127.0.0.1:9379`
*(documented)*.
+- **Deployment:** the controller, its store, its peers and its managed nodes
are deployed together in a
+ **trusted environment** *(maintainer — git-hulk)*.
+- **Metadata store:** an operator-run ETCD (default) or alternative, reachable
at the configured addr,
+ with operator-chosen auth/TLS (defaults: no auth, `tls.enable: false`)
*(documented — config)*; trusted
+ as honest *(maintainer — git-hulk)*.
+- **Managed nodes:** reachable Kvrocks instances the operator has provisioned;
the controller is assumed
+ to be authorized to administer them, and the nodes are trusted as honest
*(maintainer — git-hulk)*.
+- **Network:** the operator controls who can reach the API, the store, and the
nodes; there is no
+ built-in API auth or TLS, so network controls (and an optional TLS proxy)
are the boundary *(maintainer
+ — git-hulk)*.
+- **What the controller does to its host/network (*(inferred)* — wave-2):**
binds the API port; connects
+ out to the store and to managed nodes; reads `config.yaml`; may write
logs/metrics. Not assumed to
+ execute arbitrary host commands.
+
+## §5a Build-time and configuration variants
+
+| Knob | Default *(documented — config)* | Effect | Insecure-default ruling |
+| --- | --- | --- | --- |
+| API `addr` | `127.0.0.1:9379` | Localhost-only by default | Safe default;
exposing it on an untrusted network is operator misuse (§11) |
+| API authentication | **none** *(maintainer — git-hulk)* | Control plane is
unauthenticated by design | By-design today; auth/authz planned in #390.
Trusted-environment deployment is the supported posture |
+| API/UI TLS | **none built-in** *(maintainer — git-hulk)* | Plaintext
control-plane traffic | By-design; operators front with a TLS proxy (e.g.
Nginx) |
+| `storage_type` | `etcd` | Choice of metadata backend (etcd/zk/consul/raft;
raft = experimental, "not recommended for production") | raft-in-prod is an
operator misuse (§11) |
+| etcd `username`/`password`/`tls.enable` | empty / `false` | Store auth +
encryption off unless set | Operator responsibility (§10) |
+
+## §6 Assumptions about inputs
+
+| Entry point | Parameter | Attacker-controllable? | Caller/operator must
enforce |
+| --- | --- | --- | --- |
+| API: create/scale/failover/migrate | cluster/node/slot args | only if API
reachable; no built-in auth *(maintainer)* | deploy in a trusted environment;
network ACL / TLS proxy |
+| API: add node | **node address/host:port** | accepted, but Kvrocks-validated
*(maintainer)* | trusted-environment deployment; restrict network access |
+| Web UI | form/query fields | only if reachable; no auth/CSRF *(maintainer)*
| front with auth proxy; trusted-environment deployment |
+| metadata store reads | topology/leadership records | from a **trusted**
store *(maintainer)* | store auth/TLS (operator) |
+| node responses | probe/command replies | from a **trusted** node
*(maintainer)* | node authenticity (TLS/credentials) |
+| `config.yaml` | all keys | **no — operator-trusted** | never sourced from a
request |
+
+## §7 Adversary model
+
+- **Primary adversary:** because the controller is required to be deployed in
a **trusted environment**
+ with no built-in auth *(maintainer — git-hulk)*, the modelled adversary is
**not** an arbitrary network
+ client but an actor who can subvert a §8 safety property of the control
plane (e.g. crafted API input
+ that crashes or corrupts the controller despite trusted callers).
+- **Goals against a §8 property:** crash/corrupt the controller via malformed
input; induce incorrect
+ failover or split-brain through a §8 logic flaw (not through a tampered
store).
+- **Out of model:** the operator; anyone with `config.yaml` / store /
managed-node credentials; a
+ malicious peer controller or a tampered/Byzantine metadata store (the store
and peers are trusted as
+ honest — *(maintainer — git-hulk)*); and an unauthenticated network client
reaching `:9379`, since
+ exposing an unauthenticated API in a trusted environment is by-design (§9).
+
+## §8 Security properties the project provides
+
+*(Thin by design for a control plane required to run in a trusted
environment.)*
+
+1. **Failover correctness under trusted operation.** Given a healthy store and
honest peers, failover
+ promotes a valid replica rather than corrupting topology *(inferred — core
function)*. *Symptom:* split
+ brain / promotion of a stale or wrong node / topology corruption.
*Severity:* high (availability/integrity).
+2. **Leader-election / split-brain safety — store-dependent.** HA controllers
coordinate via the store;
+ split-brain resolution **depends on the store engine** and is
**majority-win** when using Raft / ETCD /
+ ZooKeeper *(maintainer — git-hulk)*. *Symptom:* two controllers issuing
conflicting cluster ops under a
+ non-majority store. *Severity:* high.
+3. **Memory/handler safety on API input.** Malformed API/UI requests do not
crash or corrupt the controller
+ *(maintainer — git-hulk: a crash from crafted input is a `VALID` issue,
even though callers are nominally trusted)*. *Symptom:* panic/crash/OOB from
crafted input. *Severity:* medium–high.
+4. **Authentication / authorization — NOT PROVIDED (by design).** The API/UI
have **no built-in
+ authentication or authorization** *(maintainer — git-hulk)*; the controller
claims **no** access-control
+ property and relies entirely on §10 network controls and a
trusted-environment deployment. Auth/authz is
+ planned in [#390](https://github.com/apache/kvrocks-controller/issues/390).
+
+## §9 Security properties the project does NOT provide
+
+- **No built-in control-plane authentication or authorization** *(maintainer —
git-hulk)* — exposing
+ `:9379` (or the UI) yields an unauthenticated administrative control plane;
this is **expected behaviour**
+ in the required trusted-environment deployment, with auth/authz **planned in
#390**.
+- **No transport encryption** for the API/UI *(maintainer — git-hulk)* —
operators front the controller
+ with a TLS proxy (e.g. Nginx); store TLS is off unless configured.
+- **No web-UI authentication or CSRF protection** *(maintainer — git-hulk)*.
+- **No defence against a malicious operator** or anyone holding
store/managed-node credentials (§3).
+- **The controller trusts its metadata store, its peers and its managed nodes
as honest** *(maintainer —
+ git-hulk)* — it is not a defence against a tampered store, a Byzantine peer,
or a hostile node; the
+ trusted-environment requirement covers this.
+- **No SSRF allow-listing of registered node addresses** — any address is
accepted, but the controller
+ **validates that it is a real Kvrocks node**, which the PMC considers
sufficient *(maintainer —
+ git-hulk)*.
+
+**False friends:**
+
+- *A bundled web UI looks like an admin console with a login, but it has **no
authentication and no CSRF**
+ protection* *(maintainer — git-hulk)* — its presence does not imply an
access-control boundary.
+- *Managing "clusters" implies isolation, but the controller is a single
authority across all managed
+ clusters* — compromising it is not contained to one cluster.
+
+**Well-known attack classes left to the operator / the trusted-environment
requirement:** unauthenticated
+admin-API exposure; CSRF/XSS on the web UI; plaintext control traffic; an
unsecured ETCD that anyone can
+rewrite. These are accepted given the trusted-environment deployment model.
+
+## §10 Downstream (operator) responsibilities
+
+- **Deploy the controller, store, peers and managed nodes in a trusted
environment** — the supported
+ posture, since there is no built-in API/UI auth *(maintainer — git-hulk)*.
+- **Do not expose the API/UI to an untrusted network**; front it with an
authenticating reverse proxy /
+ network ACL and a TLS proxy (e.g. Nginx) for transport encryption
*(maintainer — git-hulk)*.
+- Enable TLS for the store connection (`etcd.tls`) and for managed-node
connections on untrusted networks.
+- Secure the metadata store (ETCD/ZK/Consul) with its own auth + ACLs; supply
those credentials to the
+ controller; do not run the experimental `raft` engine in production.
+- Restrict and protect the credentials the controller uses to administer
managed nodes (these are
+ **expected to be stored inside the metadata store** *(maintainer —
git-hulk)*).
+
+## §11 Known misuse patterns
+
+- Deploying the controller outside a trusted environment / exposing its API or
UI to an untrusted network
+ (there is no built-in auth) *(maintainer — git-hulk)*.
+- Binding the controller API to `0.0.0.0` on a shared network without a
fronting auth + TLS proxy.
+- Running the experimental `raft` store engine in production (the README warns
against it).
+- Pointing the controller at an ETCD with no auth/TLS on a reachable network.
+- Treating the web UI as an authenticated admin console when it has no auth or
CSRF protection.
+
+## §11a Known non-findings (recurring false positives)
+
+*(Seed list; the PMC reports **no scanner/researcher findings yet**
*(maintainer — git-hulk)*, so this
+list is provisional — §14 Q8.)*
+
+- **"Unauthenticated admin API / no login on the UI / no CSRF"** against any
config — **by design**; the
+ controller deliberately ships no auth and is deployed in a trusted
environment; auth/authz is planned in
+ #390 *(maintainer — git-hulk)*. Disposition `BY-DESIGN`.
+- **"Controller connects to arbitrary node addresses (SSRF)"** — addresses are
accepted but Kvrocks-node
+ validated; the PMC considers this sufficient and not in need of hardening
*(maintainer — git-hulk)*.
+- **"Tampered ETCD / Byzantine peer redirects the controller"** — store and
peers are trusted as honest in
+ the required trusted environment *(maintainer — git-hulk)*. Disposition
`OUT-OF-MODEL`.
+- **"No transport encryption on the API"** — by design; operators front with a
TLS proxy *(maintainer —
+ git-hulk)*.
+- **Findings in `cmd/`, `scripts/`, `x.py`, build tooling, tests** — out of
scope (§3).
+- **Controller can delete/failover clusters** — that is its purpose; an
authorized call is not a finding (§7).
+
+## §12 Conditions that would change this model
+
+- Landing of built-in API/UI authentication/authorization (tracked in #390) —
would add §8 properties and
+ shrink §9/§10, and remove the trusted-environment requirement from several
rows.
+- A change to the default `addr` / TLS posture, or built-in TLS support.
+- A new API surface or store engine, or promotion of the `raft` engine to
supported.
+- Treating peer controllers or the metadata store as untrusted (pulls them
into §7).
+- Any report not cleanly routable to a §13 disposition.
+
+## §13 Triage dispositions
+
+| Disposition | Meaning | Licensed by |
+| --- | --- | --- |
+| `VALID` | Violates a claimed property via an in-scope adversary/input. | §8,
§6, §7 |
+| `VALID-HARDENING` | No §8 property broken, but a §11 misuse warrants
hardening. | §11 |
+| `OUT-OF-MODEL: trusted-input` | Requires control of config / store / node
credentials. | §6 |
+| `OUT-OF-MODEL: adversary-not-in-scope` | Requires operator / store / peer
capability, or an untrusted-network client (trusted-environment deployment
assumed). | §7, §3 |
+| `OUT-OF-MODEL: unsupported-component` | Lands in tooling/tests, or the
experimental `raft` engine. | §3, §5a |
+| `OUT-OF-MODEL: non-default-build` | Only under a discouraged/non-default
config. | §5a |
+| `BY-DESIGN: property-disclaimed` | Concerns a §9-disclaimed property (no
built-in auth/TLS, no web-UI CSRF, single cross-cluster authority). | §9 |
+| `KNOWN-NON-FINDING` | Matches a §11a entry. | §11a |
+| `MODEL-GAP` | Routes to none of the above → revise the model. | §12 |
+
+## §14 Open questions for the maintainers
+
+*Wave-1 and most of wave-2/3 were answered by git-hulk on PR #397 (folded
above as *(maintainer)*); they are
+retained here for traceability with their resolutions. Genuinely open items
remain tagged *(inferred)*.*
+
+**Wave 1 — auth, TLS (§2/§5a/§8/§9):**
+1. **[ANSWERED — git-hulk]** Built-in API authentication/authorization? **No**
— none today; an
+ unauthenticated API is expected behaviour; auth/authz is planned in
+ [#390](https://github.com/apache/kvrocks-controller/issues/390). Supported
posture is a
+ trusted-environment deployment.
+2. **[ANSWERED — git-hulk]** Web-UI authentication / CSRF? **None of them** —
no auth, no CSRF.
+3. **[ANSWERED — git-hulk]** TLS for the API / managed-node connections? **Not
built-in** — operators use a
+ TLS proxy such as Nginx.
+
+**Wave 2 — store, nodes, SSRF (§4/§6/§9):**
+4. **[ANSWERED — git-hulk]** How are managed-node admin credentials stored?
**Expected to be stored inside
+ the (metadata) store.** *(Sub-item answered — git-hulk: controller-side
encryption of stored credentials
+ **is intended**, tracked as a follow-up issue. See Q13.)*
+5. **[ANSWERED — git-hulk]** Are node addresses validated/allow-listed? **All
addresses are allowed, but the
+ controller validates that the target is a Kvrocks node**; no further
hardening considered necessary.
+6. **[ANSWERED — git-hulk]** Trust the metadata store and peers as honest?
**Yes** — required to be deployed
+ inside a trusted environment.
+
+**Wave 3 — properties & §11a (§8/§11a):**
+7. **[ANSWERED — git-hulk]** Failover-correctness / split-brain guarantees?
**Depends on the store engine** —
+ majority-win with Raft / ETCD / ZooKeeper.
+8. **[ANSWERED — git-hulk]** Most common scanner/researcher non-findings? **No
report yet** — §11a stays a
+ provisional seed *(inferred)* until real reports arrive.
+9. **[ANSWERED — git-hulk]** Confirm this model lives as root
`THREAT_MODEL.md` referenced from a new
+ `SECURITY.md`, separate from the `apache/kvrocks` model? **Yes.**
+
+**Wave 4 — adversary, memory safety, credentials (all [ANSWERED — git-hulk]):**
+10. **[ANSWERED — git-hulk]** The operator/deployer is the only out-of-scope
adversary class; no in-process
+ privilege boundary is claimed between API roles (none exist today). **Yes,
for now.**
+11. **[ANSWERED — git-hulk]** Memory/handler safety on malformed API/UI input
(§8.3): a panic/crash from
+ crafted input **is considered `VALID`** — even though callers are
nominally trusted.
+12. **[ANSWERED — git-hulk]** Wave-2 host/network behaviour (§5): the
controller **does not execute arbitrary
+ host commands**; it only binds the API port and connects out to the store
and nodes.
+13. **[ANSWERED — git-hulk]** Node-credential protection at rest (follow-up to
Q4): controller-side
+ encryption of stored credentials **is intended** — a gap the PMC will
track via a follow-up issue, so a
+ finding about plaintext-at-rest credentials is `VALID` (hardening to fix).
+
+## §15 Machine-readable companion
+
+Deferred for v0; a `threat-model.yaml` can later encode the §6 trust table,
§2/§3 scoping, §8 rows, §9 false
+friends, §11a non-findings, and §13 dispositions.