This is an automated email from the ASF dual-hosted git repository.

lmccay pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 94f394a73 Add Project Security Threat Model Document (#1312)
94f394a73 is described below

commit 94f394a735df106c4bfdf80a7696ece05c29fbdf
Author: lmccay <[email protected]>
AuthorDate: Sat Jul 18 11:05:34 2026 -0400

    Add Project Security Threat Model Document (#1312)
    
    Co-authored-by: Jarek Potiuk <[email protected]>
---
 AGENTS.md       |  29 +++
 SECURITY.md     |  35 +++
 THREAT_MODEL.md | 661 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 725 insertions(+)

diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 000000000..c23213fae
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,29 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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
+
+  http://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.
+-->
+
+# AGENTS.md
+
+Guidance for coding agents and automated tools working with Apache Knox.
+
+## Security
+
+For Apache Knox's security policy and how to report a vulnerability, see
+[SECURITY.md](SECURITY.md). The project's security **threat model** — what Knox
+trusts, the properties it upholds and disclaims, and how to triage a finding —
+is in [THREAT_MODEL.md](THREAT_MODEL.md) (also linked from SECURITY.md).
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..6682f9693
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,35 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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
+
+  http://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.
+-->
+
+# Security Policy
+
+## Reporting a Vulnerability
+
+Please report security vulnerabilities in Apache Knox **privately** to the
+Apache Security Team at **[email protected]**, following the ASF 
vulnerability
+handling process: <https://apache.org/security/>. Do not open public GitHub
+issues or pull requests for undisclosed security reports.
+
+## Threat Model
+
+Apache Knox's security **threat model** — the assumptions Knox makes about its
+environment and callers, the security properties it upholds, the properties it
+explicitly does *not* uphold, the operator's responsibilities, and how to 
triage
+a security report against the project — is documented in
+[THREAT_MODEL.md](THREAT_MODEL.md).
diff --git a/THREAT_MODEL.md b/THREAT_MODEL.md
new file mode 100644
index 000000000..a20c658e2
--- /dev/null
+++ b/THREAT_MODEL.md
@@ -0,0 +1,661 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you 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
+
+  http://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.
+-->
+
+# Apache Knox — Threat Model (v0 DRAFT)
+
+- **Project:** Apache Knox (apache/knox) — the Apache Knox Gateway.
+- **Scope:** the single repository `apache/knox`.
+- **Date:** 2026-07-02
+- **Status:** v0 **draft**, produced by the ASF Security team for the Knox PMC 
to
+  review, correct, and own. Not yet ratified. The Knox PMC (Larry McCay, chair)
+  confirmed on 2026-07-02 that they want a v0 draft to react to and take
+  ownership of *(maintainer, 2026-07-02)*. Larry McCay completed a line-by-line
+  review on 2026-07-09; his answers to the Wave 1–3 and meta §14 questions are
+  folded in below and the corresponding claims promoted to *(maintainer)*
+  *(maintainer, 2026-07-09 — L. McCay)*.
+- **Version binding:** written against Knox 2.x / current `master`, cross-read
+  against the 1.6.0 User's Guide. A report against Knox version *N* should be
+  triaged against the model as it stood at *N*, not at HEAD. Attach this model
+  to a release tag once ratified.
+- **Reporting cross-reference:** findings that violate a §8 claimed property
+  should be reported per the ASF process ([email protected] — Knox has no
+  project-specific security page; it routes to the Apache Security Team).
+  Findings that fall under §3 (out of scope) or §9 (disclaimed properties)
+  will be closed citing this document.
+
+### Provenance legend
+
+| Tag | Meaning |
+| --- | --- |
+| *(documented)* | Stated in Knox's own docs (project site, User's Guide). 
Cited inline. |
+| *(maintainer)* | Stated by a Knox maintainer in response to this process. |
+| *(inferred)*   | Reasoned from architecture, domain knowledge, or absence of 
a doc statement — not yet confirmed. Has a matching §14 open question. |
+
+### Draft confidence
+
+**~17 documented / ~39 maintainer / ~11 inferred** (after the 2026-07-09 PMC
+review). The Wave 1–3 core answers — deployment shape, adversary boundary,
+the keystone identity-assertion property, backend-hop TLS expectations, the
+`HeaderPreAuth` disposition, the per-surface trust table and resource line, the
+bearer-token/backend-hop false friends, and the reverse-proxy responsibility
+split — are now *(maintainer)*. Still *(inferred)* and awaiting confirmation:
+Q7, Q8, Q9–Q13, Q17, Q21–Q22, Q28, Q29 (data-flow/reachability preconditions,
+remaining environment/host-side-effect inventory, self-signed /
+`-persist-master` stances, secondary adversary capabilities, the
+known-non-findings suppression set, and cross-topology isolation).
+
+### What Knox is (one paragraph)
+
+Apache Knox is an **application gateway / reverse proxy that provides perimeter
+security for the REST APIs and web UIs of Apache Hadoop-ecosystem (and other)
+services** *(documented — project homepage)*. A single Knox instance sits at 
the
+network edge in front of a cluster, terminates client TLS, authenticates the
+caller through a configurable **provider chain** (LDAP/AD via Shiro, Kerberos
+via HadoopAuth, SAML/OIDC/CAS via pac4j, header pre-auth, SSO cookie, JWT),
+authorizes the request against service-level ACLs, rewrites URLs to hide
+internal topology, and **dispatches** the request to the appropriate backend
+service while asserting the caller's identity to that backend *(documented —
+User's Guide)*. It also issues SSO tokens (**KnoxSSO**) and bearer tokens
+(**KnoxToken**) and manages secrets in a master-secret-protected credential
+store / alias service *(documented — User's Guide)*. Knox's whole purpose is to
+**be a trust boundary**: untrusted HTTP clients on one side, trusted cluster
+services on the other.
+
+---
+
+## §2 Scope and intended use
+
+**Primary intended use** *(documented — homepage / User's Guide)*:
+
+- Centralized **perimeter authentication + authorization** for Hadoop REST APIs
+  and UIs (WebHDFS, YARN, HBase, Hive, Livy, Spark, NiFi, Ambari, Zeppelin,
+  NameNode UI, etc.).
+- **Topology concealment** — clients see one Knox endpoint; internal host/port
+  layout is hidden behind rewrite rules.
+- **SSO** for web UIs (KnoxSSO) and **token issuance** for programmatic clients
+  (KnoxToken).
+
+**Deployment context** *(maintainer, 2026-07-09 — L. McCay confirmed Q1)*: a
+long-running network daemon (Jetty-based server), deployed at the cluster edge,
+operated by a cluster administrator. It is **not** an in-process library and
+**not** a CLI-first tool (though a Knox CLI exists for admin/keystore
+operations).
+
+**Caller roles.** A gateway has no single "caller"; the role splits three ways:
+
+- **Client** — an untrusted HTTP/WebSocket peer at the perimeter. *The primary
+  adversary (§7).*
+- **Operator / administrator** — trusted for the instance; authors topology
+  descriptors, provider configs, and manages the master secret and keystores.
+  **Out of scope as an adversary** (§3).
+- **Backend service** — the Hadoop service Knox fronts; trusted, on the far 
side
+  of the boundary. Also the **federated IdP** (LDAP/AD, SAML/OIDC provider) 
that
+  Knox delegates authentication to — trusted infrastructure, out of scope as an
+  adversary (§3), but its trust assumptions are load-bearing (§5, §14).
+
+**Component-family table** *(maintainer, 2026-07-09 — L. McCay confirmed Q2)*:
+
+| Family | Representative entry point | Touches outside process? | In model? |
+| --- | --- | --- | --- |
+| Request pipeline (routing, filter chain) | inbound HTTP/WS on the gateway 
port | network | **in** |
+| Authentication provider chain | Shiro/LDAP, HadoopAuth/Kerberos, pac4j 
SAML/OIDC, HeaderPreAuth, SSOCookie, JWT filters | network (to IdP), filesystem 
| **in** |
+| Authorization (AclsAuthz) | topology ACL evaluation | — | **in** |
+| Rewrite / URL translation | per-service rewrite rules | — | **in** |
+| Dispatch / proxy | backend HTTP(S) client, identity assertion | network (to 
backend) | **in** |
+| KnoxSSO / KnoxToken services | `/knoxsso`, `/knoxtoken` endpoints | 
filesystem (keys), network | **in** |
+| Credential / alias / keystore service | master secret, 
`__gateway-credentials.jceks`, per-topology stores | filesystem | **in 
(operator boundary — see §3)** |
+| Admin API + Knox CLI | `/admin`, `bin/knoxcli.sh` | filesystem | **in 
(operator-authenticated)** |
+| Topology / provider descriptors | XML in `conf/topologies/` | filesystem | 
**operator input, trusted — §3/§6** |
+| Sample topologies, demo LDAP, examples | `sandbox.xml`, demo `ApacheDS`, 
gateway samples | filesystem, network | **OUT — §3** |
+
+---
+
+## §3 Out of scope (explicit non-goals)
+
+- **The operator/administrator as an adversary.** Anyone who can write topology
+  descriptors, provider configs, the master secret, or the keystore files
+  already controls the gateway's trust decisions. A "vulnerability" that 
requires
+  malicious operator config is not in the model *(maintainer, 2026-07-09 —
+  L. McCay confirmed Q3: malicious operator config is never a Knox vuln)*.
+- **The backend services Knox fronts, and the federated IdP.** Knox trusts
+  authentication assertions from the configured IdP and trusts the backend to
+  enforce its own authorization once Knox asserts identity. Compromise or
+  misbehavior of those systems is out of layer *(maintainer, 2026-07-09 —
+  L. McCay confirmed Q4)*.
+- **The demo/sample surface.** The bundled **demo LDAP (ApacheDS)**, sample
+  `sandbox` topology, gateway sample apps, and self-signed test certificate are
+  explicitly for evaluation, not production. Findings that only manifest with 
the
+  demo LDAP running, the sample topology deployed, or the self-signed cert in 
use
+  are `OUT-OF-MODEL: unsupported-component` *(maintainer, 2026-07-09 — L. McCay
+  confirmed Q5; the User's Guide markets these as getting-started aids,
+  documented)*.
+- **Securing an already-insecure cluster.** Knox is a **perimeter** control. It
+  does not defend a backend that is directly network-reachable around the
+  gateway; bypassing Knox by reaching the backend host directly is an operator
+  network-segmentation responsibility, not a Knox flaw *(maintainer, 
2026-07-09 —
+  L. McCay confirmed Q6; note that clients able to authenticate directly to the
+  backend — e.g. via Kerberos — are a legitimate deployment choice, and without
+  explicit proxy-user config making them trusted proxies they cannot assert
+  another user's identity via `doAs`)*.
+- **Availability of the backend cluster.** Knox does not guarantee the 
liveness,
+  correctness, or capacity of the services it proxies.
+- **Not a WAF / not a general-purpose API security product.** Knox enforces
+  authn/authz and hides topology; it is not claimed to be a payload-inspecting
+  web application firewall for the backend's application-layer vulnerabilities
+  *(inferred → Q7)*.
+
+---
+
+## §4 Trust boundaries and data flow
+
+**The trust boundary is the gateway itself.** North of Knox: untrusted HTTP/WS
+clients. South of Knox: trusted backend services. Knox's job is to be the gate
+where an untrusted request is authenticated, authorized, and — only then —
+re-emitted as a trusted request *(documented — homepage: "perimeter security";
+User's Guide)*.
+
+Request data flow (per request) *(inferred → Q8)*:
+
+1. **TLS termination** at the gateway (Jetty). Client identity, if any, is a 
TLS
+   client cert (HeaderPreAuth/pki) or is established later in the chain.
+2. **Provider chain** runs in topology-defined order: authentication →
+   identity-assertion → authorization → (rewrite) → dispatch. A request that
+   fails authn/authz never reaches dispatch.
+3. **Identity assertion** maps the authenticated principal (and groups) into 
the
+   form the backend expects (e.g. `doAs`/proxy-user header, SPNEGO). **This is 
a
+   trust-elevation point**: after this step the request carries Knox-minted
+   identity that the backend trusts.
+4. **Rewrite** translates external URLs/bodies to internal ones and back.
+5. **Dispatch** opens a (possibly new-TLS) connection to the backend and 
proxies
+   the request/response, streaming bodies.
+
+**Reachability preconditions (the triager's first test)** *(inferred → Q8)*:
+
+- A finding in the **request pipeline / rewrite / dispatch** is in-model only 
if
+  reachable from **untrusted client bytes** (URL, headers, body, WS frames)
+  *before* the authn provider has rejected the request, **or** from an
+  authenticated-but-unauthorized-elsewhere client.
+- A finding in the **auth provider chain** is in-model only if it lets an
+  untrusted client **obtain, forge, or bypass** an identity assertion the
+  backend will then trust (authentication bypass, assertion forgery, token
+  forgery), or escalate authorization.
+- A finding in **KnoxToken/KnoxSSO** is in-model only if a client can **mint,
+  forge, replay, or fail-to-revoke** a token/cookie without the corresponding
+  credential.
+- A finding in the **credential/keystore/alias** family is in-model only if
+  reachable **without** operator filesystem access (e.g. a network path that
+  discloses a secret); anything requiring local FS access is the operator
+  boundary (§3).
+- A finding reachable only via **topology descriptor contents** is
+  `OUT-OF-MODEL: trusted-input` (§6).
+
+---
+
+## §5 Assumptions about the environment
+
+- **Host / runtime** *(inferred → Q9)*: a JVM on a server OS; embedded Jetty as
+  the HTTP/WS container. Knox trusts the JVM's TLS stack and the OS filesystem
+  permissions protecting `data/security/` and `conf/`.
+- **Filesystem is the operator trust anchor** *(documented — User's Guide: 
master
+  secret persisted to disk, credential stores under
+  `data/security/keystores/`)*. Knox assumes only the operator (and the Knox
+  process user) can read the master secret file, the credential stores, and the
+  identity keystore. `-persist-master` explicitly trades a prompt for on-disk
+  storage and "requires careful file permission management" *(documented)*.
+- **The federated IdP is authoritative and honest** *(maintainer, 2026-07-09 —
+  L. McCay confirmed Q4)*. When a SAML/OIDC/LDAP provider asserts "this is user
+  X", Knox believes it. Knox assumes the IdP's assertions are 
integrity-protected
+  in transit (signed SAML, validated OIDC ID-token, LDAPS) — the strength of 
that
+  check is provider-config dependent (§5a). **TLS to the backend is assumed
+  required** to protect the SPNEGO tokens Knox forwards on the dispatch hop
+  *(maintainer, 2026-07-09 — L. McCay)*.
+- **The backend trusts Knox's asserted identity** *(inferred → Q10)*. The whole
+  proxy-user / identity-assertion mechanism assumes the backend will accept a
+  Knox-asserted principal. This means **anything that lets a client control the
+  asserted identity is an authentication bypass against every backend.**
+- **Network segmentation** *(maintainer, 2026-07-09 — L. McCay confirmed Q6)*:
+  Knox assumes clients cannot reach backends except through it. Knox does not
+  enforce this; the operator's network does.
+- **Concurrency** *(inferred → Q11)*: a Knox instance serves many concurrent
+  clients; provider filters and the alias/keystore service are assumed
+  thread-safe. Clustered Knox instances share the same gateway master secret
+  *(documented — "the same across all gateway instances")*.
+- **Side effects Knox has on its host** *(inferred → Q12)*: opens the gateway
+  listen socket(s); opens outbound connections to backends and IdPs; 
reads/writes
+  `conf/` and `data/security/`; writes audit + service logs; may spawn nothing
+  beyond the JVM. This "no-surprise" inventory is almost entirely inferred and 
is
+  a high-priority confirmation target. **Specific open item flagged by the PMC
+  (2026-07-09 — L. McCay): verify whether the webshell terminal service spawns
+  any process** — if it does, the "spawns nothing beyond the JVM" assumption
+  needs qualification and the webshell surface warrants its own trust-boundary
+  note.
+
+---
+
+## §5a Build-time and configuration variants (the security envelope is 
config-driven)
+
+Unlike a library with compile flags, **Knox's security envelope is set almost
+entirely by operator topology/gateway configuration**, not build flags. The
+model describes a *correctly configured production* gateway; several knobs, at
+their sample/default values, void §8 properties. For each, the PMC must rule
+whether the less-secure value is a **supported posture** (report ⇒ `VALID`) or 
a
+**dev-convenience the operator must flip** (report ⇒ `OUT-OF-MODEL:
+non-default-build`). All rulings below are proposed, pending §14.
+
+| Knob / mode | Less-secure setting | Proposed maintainer stance |
+| --- | --- | --- |
+| Demo LDAP + `sandbox` topology | shipped, trivially bypassable creds | 
dev-only; production must replace *(maintainer — confirmed Q5)* |
+| Self-signed identity certificate | default if operator provides none | 
dev-only; production installs a CA cert *(→ Q13)* |
+| `HeaderPreAuth` without an IP/mTLS trust check | trusts `SM_USER`/custom 
identity header from any client | **OUT-OF-MODEL — operator responsibility** 
*(maintainer, 2026-07-09 — L. McCay, Q14)*: the operator must avoid this or 
implicitly accepts the risk. Report ⇒ `OUT-OF-MODEL: non-default-build`. 
**Hardening (VALID-HARDENING):** Knox should default the trust gate so 
operators must *explicitly* accept the ungated risk. |
+| Anonymous / `Anonymous` auth provider or no authz provider in a topology | 
request passes unauthenticated/unauthorized | operator-chosen posture for 
public / self-authenticating services; report ⇒ OUT-OF-MODEL unless a 
*different* topology's protection leaks *(maintainer, 2026-07-09 — L. McCay 
confirmed Q15: this is used for public/self-authenticating services and is 
OUT-OF-MODEL)* |
+| TLS protocol/cipher and hostname-verification settings on the **backend 
dispatch hop** | plaintext or unverified backend connection | 
operator-configured; a plaintext/unverified default hop is a §11 misuse, not a 
Knox guarantee *(maintainer, 2026-07-09 — L. McCay confirmed Q16; TLS to 
backend is required to protect SPNEGO tokens)* |
+| `-persist-master` | master secret stored on disk | supported with correct 
file perms *(documented)* *(→ Q17)* |
+| Token TTL / renewal / server-managed token state | long-lived or 
non-revocable KnoxTokens | supported range TBD *(→ Q18)* |
+
+---
+
+## §6 Assumptions about inputs
+
+Knox's inputs split cleanly into **untrusted network input** (the client) and
+**trusted operator input** (the descriptors and secrets).
+
+Per-surface trust table *(maintainer, 2026-07-09 — L. McCay confirmed Q19: the
+table stands, unless noted)*:
+
+| Surface | Parameter | Attacker-controllable? | Operator/Knox must enforce |
+| --- | --- | --- | --- |
+| Any gateway route | request line / path | **yes** | rewrite must not allow 
path-traversal into other topologies/services |
+| Any gateway route | request headers | **yes** | identity headers (`SM_USER`, 
`X-Forwarded-*`, forwarded-identity) must NOT be trusted unless a preauth trust 
gate is configured |
+| Any gateway route | request body / WS frames | **yes** | streamed to 
backend; size/timeout limits are operator/Jetty config |
+| Auth providers | credentials (LDAP bind, SPNEGO, OIDC code, JWT) | **yes** | 
validate signature/binding against the trusted IdP; no bypass |
+| `/knoxtoken`, `/knoxsso` | token/cookie presented by client | **yes** | 
verify signature + expiry + (if applicable) server-side revocation |
+| Dispatch | backend hostname/port | **no — from topology** | rewrite/service 
defs come from trusted operator config |
+| Topology descriptors (`conf/topologies/*.xml`) | provider chain, ACLs, 
service URLs | **no — trusted operator** | authored by admin; not attacker 
input |
+| Provider config / descriptors (`__gateway.xml`, shared provider configs) | 
all fields | **no — trusted operator** | — |
+| Master secret / credential store / keystore | secrets, aliases | **no — 
operator, FS-protected** | OS file permissions |
+| Admin API / Knox CLI | topology CRUD, alias ops | **operator-authenticated** 
| admin authz; not an anonymous surface |
+
+Key line: **client-supplied identity headers and tokens are the crown-jewel
+untrusted inputs.** The single most consequential Knox failure class is a 
client
+getting Knox to assert an identity (or authorization) it did not legitimately
+earn.
+
+Size/shape/rate: Knox streams request/response bodies and WebSocket frames; 
body
+size, connection, and timeout limits are Jetty/topology configuration rather 
than
+a Knox-guaranteed bound *(maintainer, 2026-07-09 — L. McCay confirmed Q20)*.
+
+---
+
+## §7 Adversary model
+
+**Primary adversary — the untrusted perimeter client** *(inferred → Q21)*. An
+anonymous or partially-authenticated HTTP/WebSocket peer that can reach the
+gateway listen port. Capabilities:
+
+- Send arbitrary request lines, headers (including spoofed identity/forwarded
+  headers), bodies, and WS frames.
+- Present forged or replayed credentials, cookies, SAML responses, OIDC tokens,
+  and KnoxTokens/KnoxSSO cookies.
+- Attempt to make Knox open a connection to an attacker-chosen or
+  internal-only destination (SSRF-shaped), *to the extent rewrite/dispatch turn
+  client input into a backend target*.
+- Open many/slow connections (resource pressure).
+
+**Secondary adversary — an authenticated-but-limited client** *(inferred →
+Q22)*: a client with valid credentials for *some* topology/service who tries to
+reach a service/topology they are not authorized for (authorization bypass,
+cross-topology confusion, rewrite escape).
+
+**Attacker goals in scope:** authentication bypass; identity/assertion forgery
+(impersonate another user to the backend); authorization bypass; token forgery/
+replay; disclosure of a secret from the credential store over the network;
+topology/internal-address disclosure defeating the concealment goal; SSRF via 
the
+proxy; crashing/hanging the gateway from unauthenticated input.
+
+**Explicitly out of the adversary model** *(maintainer, 2026-07-09 — L. McCay 
confirmed Q3/Q4)*:
+
+- The **operator** (writes topology/secrets — already fully trusted).
+- The **backend service** and the **federated IdP** (trusted infrastructure).
+- A **local process / co-tenant** on the Knox host with filesystem access to
+  `data/security/` (that's the operator boundary).
+- An attacker who has **already bypassed the gateway** at the network layer.
+
+*(No Byzantine-participant / consensus actor applies — Knox is a proxy, not a
+replicated consensus system. Clustered Knox instances share config and secret
+and are mutually trusting, not adversarial to each other → Q11.)*
+
+---
+
+## §8 Security properties Knox provides
+
+Each: property (+conditions) · violation symptom · severity · provenance.
+
+1. **Perimeter authentication enforcement.** Given a correctly configured
+   topology with an authentication provider, a request that does not satisfy 
that
+   provider does not reach dispatch. · *Violation:* unauthenticated client
+   reaches a protected backend / gets a response it should not. · *Security-
+   critical (auth bypass).* · *(documented — perimeter-security purpose; 
enforcement invariant maintainer, 2026-07-09 — L. McCay confirmed Q23: a 
request failing authn/authz never reaches dispatch, no exceptions)*
+2. **Authorization enforcement (AclsAuthz).** Given an authorization provider,
+   only principals/groups/IPs permitted by the topology ACL reach the service.
+   · *Violation:* authorized-for-A client reaches B. · *Security-critical.* ·
+   *(documented — AclsAuthz; invariant maintainer, 2026-07-09 — L. McCay 
confirmed Q23, no exceptions)*
+3. **Faithful identity assertion.** The identity asserted to the backend is the
+   one Knox authenticated — a client cannot substitute another principal. ·
+   *Violation:* client impersonates another user to the backend. ·
+   *Security-critical (this is the keystone property).* · *(maintainer,
+   2026-07-09 — L. McCay confirmed Q24: this is the keystone; any break is
+   security-critical)*
+4. **Token/SSO integrity.** KnoxToken/KnoxSSO tokens are integrity-protected
+   (signed) and validated (signature + expiry) before acceptance; a client 
cannot
+   forge or tamper one. · *Violation:* accepted forged/tampered/expired token. 
·
+   *Security-critical.* · *(documented — tokens issued/normalized; crypto
+   invariant maintainer, 2026-07-09 — L. McCay confirmed Q18/Q25: signed,
+   short-TTL, revocation-optional bearer tokens; replay within TTL is 
BY-DESIGN)*
+5. **Secret confidentiality at rest.** Master-secret-encrypted credential 
stores
+   protect provider/gateway secrets; secrets are not exposed over the network
+   surface. · *Violation:* a network request discloses an alias/secret or the
+   master secret. · *Security-critical.* · *(documented — master secret +
+   credential store)*
+6. **Topology/internal-address concealment.** Rewrite hides backend host/port
+   from clients. · *Violation:* client obtains internal addresses or reaches an
+   un-fronted internal endpoint via rewrite escape. · *Security-relevant 
(defeats
+   a stated purpose; often medium).* · *(documented — "conceals cluster
+   topology")*
+7. **Transport confidentiality (client hop).** TLS terminates client traffic
+   with the configured identity keystore. · *Violation:* downgrade/plaintext
+   acceptance where TLS is configured. · *Security-critical.* · *(documented —
+   identity keystore / TLS)*
+
+**Resource properties:** Knox makes **no strong quantitative resource 
guarantee**
+against unauthenticated load beyond what Jetty/topology limits provide; 
slow-loris
+/ large-body / many-connection pressure is bounded by operator config, not a 
Knox
+invariant *(maintainer, 2026-07-09 — L. McCay confirmed Q19/Q20)*. Confirmed
+resource line: *"an unauthenticated request that hangs or crashes the gateway
+process is a bug; merely consuming proportionate resources under load is not."*
+*(maintainer, 2026-07-09 — L. McCay)*
+
+---
+
+## §9 Security properties Knox does NOT provide
+
+- **No protection against the operator.** Malicious or mistaken 
topology/provider
+  config, secrets, or keystore contents are not defended against *(maintainer,
+  2026-07-09 — L. McCay confirmed Q3)*.
+- **No backend authorization.** Once Knox asserts identity, the backend decides
+  what that identity may do. Knox authz is coarse perimeter ACLs, not a
+  replacement for backend/Ranger fine-grained authz *(maintainer, 2026-07-09 —
+  L. McCay confirmed Q26)*.
+- **No defense of an around-the-gateway path.** If a client can reach the 
backend
+  without traversing Knox, Knox provides nothing *(maintainer, 2026-07-09 —
+  L. McCay confirmed Q6)*.
+- **No application-layer inspection of backend payloads** (not a WAF) 
*(inferred
+  → Q7)*.
+- **No guarantee for the demo/sample surface** (§3).
+
+**False friends — call these out explicitly:**
+
+- **A forwarded/preauth identity header is not authentication.** 
`HeaderPreAuth`
+  (`SM_USER` etc.) *looks* like it authenticates the user, but it only trusts a
+  header — it is secure **only** when paired with an mTLS/IP trust gate that
+  proves the header came from a trusted SSO front-end. Without that gate any
+  client sets the header and impersonates anyone. This is the most dangerous 
Knox
+  false friend. **Disposition (maintainer, 2026-07-09 — L. McCay, Q14): an
+  ungated `HeaderPreAuth` is `OUT-OF-MODEL: non-default-build`** — the operator
+  must avoid it or implicitly accepts the risk; it is *not* reported as a Knox
+  `VALID` bug. The paired hardening ask is that Knox default the gate so the
+  operator has to explicitly accept the ungated posture (VALID-HARDENING).
+- **KnoxSSO cookie / KnoxToken are bearer credentials, not proof of 
possession.**
+  Anyone who captures one can replay it until expiry; TLS + short TTL + (where
+  available) revocation are load-bearing, not decorative *(maintainer,
+  2026-07-09 — L. McCay confirmed Q18/Q25)*.
+- **"Topology concealment" is obscurity, not an access control.** Hiding 
backend
+  addresses reduces attack surface but is not itself an authentication/authz
+  boundary *(inferred)*.
+- **TLS termination at Knox does not encrypt the backend hop.** Client→Knox TLS
+  says nothing about Knox→backend; that hop's encryption/verification is 
separate
+  config *(maintainer, 2026-07-09 — L. McCay confirmed Q16)*.
+
+**Well-known attack classes Knox as a reverse proxy is exposed to and the
+operator must weigh** *(maintainer, 2026-07-09 — L. McCay answered Q27)*: HTTP
+request smuggling / desync between Knox and backend; SSRF via rewrite/dispatch 
if
+client input reaches the backend target; open-redirect via the SSO
+`originalUrl`/return-URL parameter; XXE if any provider parses 
attacker-supplied
+XML (e.g. SAML responses); host-header / X-Forwarded-* trust confusion; 
WebSocket
+origin/authorization gaps; cookie scope/`Secure`/`HttpOnly` handling for 
KnoxSSO.
+
+**Responsibility split (maintainer, 2026-07-09 — L. McCay):** all of these
+protections are ultimately the **operator's responsibility**, but Knox provides
+the mechanisms to configure them:
+
+- The **`WebAppSecProvider`** can be configured for **XSRF, CORS, CSP, and
+  related** cross-site protections.
+- **Regexp-based whitelists** protect against **SSRF and open-redirect** (host 
/
+  port / domain allow-lists).
+
+These mechanisms **must be tuned to the deployment's specific expectations**
+(allowed hosts, ports, domains). A report that a protection is *available but
+unconfigured* is therefore `OUT-OF-MODEL` (operator responsibility); a report
+that a configured `WebAppSecProvider` / whitelist can be *bypassed* is `VALID`.
+
+---
+
+## §10 Downstream responsibilities (the operator's contract)
+
+For a gateway, "downstream user" = **the cluster operator/deployer.** To keep
+§5–§8 valid, the operator must:
+
+1. **Protect the master secret and keystores** with OS file permissions; treat
+   `-persist-master` as security-sensitive *(documented)*.
+2. **Replace all demo/sample material** before production: remove demo LDAP,
+   sample `sandbox` topology, and the self-signed cert; install a real IdP and 
a
+   CA-issued identity keystore *(documented as getting-started aids → Q5/Q13)*.
+3. **Never deploy `HeaderPreAuth` without a trust gate** (mTLS/IP allow-list
+   proving the header source) — an ungated deployment is the operator's risk to
+   accept, not a Knox bug *(maintainer, 2026-07-09 — L. McCay, Q14)*.
+4. **Enforce network segmentation** so backends are unreachable except through
+   Knox *(maintainer, 2026-07-09 — L. McCay confirmed Q6)*.
+5. **Configure the backend dispatch hop's TLS** (protocol, ciphers, hostname
+   verification) to match the threat environment. **TLS is required together 
with
+   Kerberos for proxy-user-based trusted proxies** (it protects the forwarded
+   SPNEGO tokens) — the PMC asks that this be explicitly documented 
*(maintainer,
+   2026-07-09 — L. McCay confirmed Q16)*.
+6. **Set token TTLs / enable revocation** appropriate to data sensitivity
+   *(maintainer, 2026-07-09 — L. McCay confirmed Q18)*.
+7. **Scope authorization ACLs per service/topology**; do not rely on backend
+   authz alone if perimeter authz is intended *(maintainer, 2026-07-09 —
+   L. McCay confirmed Q26)*.
+8. **Keep provider configs pointed at integrity-checked IdP channels** (signed
+   SAML, validated OIDC, LDAPS) *(maintainer, 2026-07-09 — L. McCay confirmed
+   Q4)*.
+9. **Configure and tune `WebAppSecProvider` and the SSRF/open-redirect regexp
+   whitelists** (XSRF/CORS/CSP; allowed hosts/ports/domains) for the deployment
+   — Knox provides these mechanisms but the operator must turn them on and tune
+   them *(maintainer, 2026-07-09 — L. McCay, Q27)*.
+
+---
+
+## §11 Known misuse patterns
+
+- **Preauth header trusted without a gate** — deploying `HeaderPreAuth` and
+  trusting `SM_USER`/custom identity headers directly from clients. *Looks* 
like
+  SSO integration; is actually anonymous impersonation. Fix: require mTLS/IP 
trust
+  gate. Per Q14 this is the operator's risk to accept (`OUT-OF-MODEL`), with a
+  standing hardening ask that Knox default the gate to force explicit 
acceptance
+  *(maintainer, 2026-07-09 — L. McCay)*.
+- **Leaving demo LDAP / sample topology in production** — the sample creds are
+  public. Fix: replace before exposure *(→ Q5)*.
+- **Treating Knox authz as the only authz** — assuming perimeter ACLs remove 
the
+  need for backend authorization, then exposing services with weak backend 
checks
+  *(→ Q26)*.
+- **Exposing the backend around Knox** — Knox on the edge but backends also
+  directly reachable, so clients skip the gateway *(→ Q6)*.
+- **Long-lived / non-revocable tokens** — issuing KnoxTokens with large TTLs 
and
+  no revocation, so a captured token is a durable credential *(→ Q18)*.
+- **Plaintext / unverified backend hop** — assuming client-side TLS covers the
+  whole path *(→ Q16)*.
+
+## §11a Known non-findings (recurring false positives)
+
+Populated with the shapes a scanner/AI is likely to raise against Knox; each is
+safe **given the model** and the PMC should confirm/extend *(all inferred →
+Q28)*:
+
+- **"Knox trusts the `SM_USER` header" flagged as auth bypass** — *not a 
finding*
+  when the topology pairs `HeaderPreAuth` with an mTLS/IP trust gate (§6 header
+  row, §9 false friend). An **ungated** `HeaderPreAuth` is `OUT-OF-MODEL:
+  non-default-build` (operator responsibility per Q14), **not** a Knox `VALID`
+  bug — though a proposal to harden the default gate is welcome
+  *(maintainer, 2026-07-09 — L. McCay, Q14)*.
+- **"Backend URL is taken from configuration" flagged as SSRF** — the dispatch
+  target comes from the **trusted topology descriptor**, not client input (§6) 
⇒
+  `OUT-OF-MODEL: trusted-input`. `VALID` only if *client* bytes reach the
+  destination selection.
+- **"Self-signed certificate accepted"** — the bundled self-signed identity 
cert
+  is a getting-started default (§3/§5a) ⇒ `OUT-OF-MODEL: unsupported-component 
/
+  non-default-build`.
+- **"Secret stored on disk (`-persist-master`, `.jceks`)"** — by design under 
the
+  operator FS-trust boundary (§5) ⇒ `BY-DESIGN` / operator responsibility, not 
a
+  network-reachable disclosure.
+- **"Demo LDAP allows weak/anonymous bind"** — demo component, out of scope
+  (§3) ⇒ `OUT-OF-MODEL: unsupported-component`.
+- **"Verbose error / topology info in a response"** — only `VALID` if it 
defeats
+  the §8(6) concealment property with real internal addresses; generic stack
+  traces are `VALID-HARDENING` at most.
+
+---
+
+## §12 Conditions that would change this model
+
+- A new authentication/authorization provider, or a change to how identity is
+  asserted to backends.
+- A new client-facing protocol surface (new WebSocket features, gRPC, HTTP/2/3
+  specifics) or a new dispatch mechanism.
+- Making a previously demo/sample component production-supported (or 
vice-versa).
+- A change of default for any §5a knob (e.g. shipping a non-self-signed 
default,
+  or gating `HeaderPreAuth` by default).
+- Introducing multi-tenant isolation guarantees between topologies (currently
+  treated as operator-partitioned, not a Knox-enforced boundary → Q29).
+- **A report that cannot be routed to one §13 disposition** ⇒ the model has a 
gap;
+  revise §8/§9 rather than making an ad-hoc call.
+
+## §13 Triage dispositions
+
+| Disposition | Meaning | Licensed by |
+| --- | --- | --- |
+| `VALID` | Untrusted client bypasses authn/authz, forges an identity 
assertion or token, discloses a secret over the network, or crashes/hangs the 
gateway from unauthenticated input. | §8, §6, §7 |
+| `VALID-HARDENING` | No §8 property broken, but Knox elects to make a §11 
misuse harder (e.g. safer default, extra warning, tighter header handling). 
Usually no CVE. | §11 |
+| `OUT-OF-MODEL: trusted-input` | Requires attacker control of 
topology/provider config, a dispatch target from config, or another §6-trusted 
parameter. | §6 |
+| `OUT-OF-MODEL: adversary-not-in-scope` | Requires operator, backend, IdP, 
local-FS, or around-the-gateway capability. | §7 |
+| `OUT-OF-MODEL: unsupported-component` | Lands in demo LDAP, sample 
topologies, gateway samples, or self-signed test cert. | §3 |
+| `OUT-OF-MODEL: non-default-build` | Only manifests under a discouraged §5a 
configuration the operator is documented to change. | §5a |
+| `BY-DESIGN: property-disclaimed` | Concerns a §9 disclaimed property 
(backend authz, WAF inspection, bearer-token replay within TTL, operator 
secret-at-rest). | §9 |
+| `KNOWN-NON-FINDING` | Matches a §11a recurring false positive. | §11a |
+| `MODEL-GAP` | Routes to none of the above. | triggers §12 |
+
+## §14 Open questions for the maintainers
+
+Each states a **proposed answer** to confirm/correct, and the section it lands
+in. Grouped in waves. **Larry McCay (PMC chair) answered Wave 1–3 core + meta 
on
+2026-07-09; those answers are recorded here and folded into the sections 
above.**
+
+**Wave 1 — scope, deployment, adversary (unblocks everything) — ANSWERED
+2026-07-09:**
+
+- **Q1 (§2): ✅ Confirmed.** Deployment shape is "a long-running Jetty-based 
edge
+  daemon, administrator-operated; not an in-process library."
+- **Q2 (§2): ✅ Confirmed.** The component-family split is right and the
+  demo/sample surface is the only out-of-model code.
+- **Q3 (§3/§7): ✅ Confirmed.** The operator is entirely out of the adversary
+  model — malicious operator config is never a Knox vuln.
+- **Q4 (§3/§5): ✅ Confirmed**, with the addition that **TLS to the backend is
+  assumed required to protect SPNEGO tokens.**
+- **Q5 (§3/§5a): ✅ Confirmed.** Demo LDAP, `sandbox`/sample topologies, and
+  gateway samples are dev/eval only; findings requiring them are out of model.
+- **Q6 (§3/§9): ✅ Confirmed.** Around-the-gateway backend reachability is an
+  operator network responsibility. Note: clients that authenticate directly to
+  the backend (e.g. Kerberos) are a legitimate deployment choice; without
+  explicit proxy-user config making them trusted proxies they cannot assert
+  another user's identity via `doAs`.
+
+**Wave 2 — the keystone properties & false friends — ANSWERED 2026-07-09:**
+
+- **Q14 (§5a/§9/§11): ✅ Answered — OUT-OF-MODEL.** An ungated `HeaderPreAuth` 
is
+  a misconfiguration the operator must avoid or implicitly accepts; a report is
+  `OUT-OF-MODEL: non-default-build`, **not** a Knox `VALID` bug. Paired 
hardening
+  ask: Knox should default the trust gate so operators must explicitly accept 
the
+  ungated risk (VALID-HARDENING). *(This corrects the v0 proposal of "VALID
+  whenever ungated".)*
+- **Q24 (§8): ✅ Confirmed.** Faithful identity assertion is the keystone
+  property; any break is security-critical.
+- **Q23 (§8): ✅ Confirmed — no exceptions.** A request failing authn/authz 
never
+  reaches dispatch.
+- **Q16 (§5a/§9): ✅ Confirmed.** Backend-hop TLS is operator-configured; a
+  plaintext/unverified default hop is a §11 misuse, not a Knox guarantee. **TLS
+  is required together with Kerberos for proxy-user-based trusted proxies, and
+  this should be documented.**
+- **Q18/Q25 (§5a/§8): ✅ Confirmed.** KnoxToken/KnoxSSO are signed, short-TTL,
+  revocation-optional bearer tokens; replay within TTL is BY-DESIGN.
+
+**Wave 3 — inputs, resources, isolation, false-positive suppression:**
+
+- **Q19/Q20 (§6/§8): ✅ Confirmed 2026-07-09.** Per-surface trust table stands;
+  resource line = "unauthenticated hang/crash = bug; proportionate load = not."
+- **Q26 (§9): ✅ Confirmed 2026-07-09.** Knox perimeter authz does not replace
+  backend/Ranger authz.
+- **Q27 (§9): ✅ Answered 2026-07-09.** All these protections are the operator's
+  responsibility, but Knox provides the mechanisms: `WebAppSecProvider`
+  (configurable for XSRF/CORS/CSP) and regexp-based whitelists (SSRF /
+  open-redirect). They must be tuned to the deployment's hosts/ports/domains.
+- **Q29 (§12): ⬜ Open.** Is isolation **between topologies** a Knox-enforced
+  boundary or merely operator partitioning? Proposed: operator partitioning, 
not
+  a guaranteed isolation boundary — a cross-topology leak would be `VALID` only
+  if it breaks §8(1/2).
+- **Q28 (§11a): ⬜ Open.** Confirm/extend the known-non-findings list so it can
+  seed a scanner suppression set.
+- **Q7 (§3), Q8 (§4), Q9–Q13, Q17, Q21–Q22 (§5/§7/§5a): ⬜ Open.** Confirm the
+  remaining data-flow/reachability preconditions, environment, host side-effect
+  inventory (**including whether the webshell terminal spawns a process — 
Q12**),
+  self-signed/`-persist-master` stances, and secondary adversary-capability
+  details as stated inline.
+
+**Wave 4 — meta / ownership — ANSWERED 2026-07-09:**
+
+- **Q-meta-A: ✅ Yes.** This model should become the canonical Knox security
+  document, linked from a new `SECURITY.md` and the project site.
+- **Q-meta-B: ✅ Yes.** The ratified model lives in `docs/` in-repo, versioned
+  with releases; a §12 change class triggers a revision.
+
+## §15 Optional: machine-readable companion
+
+Not produced in v0. Once §14 wave 1–2 answers land, emit a `threat-model.yaml`
+sidecar (entry surfaces → trust level from §6; component families in/out from
+§2/§3; §5a config knobs; §8 properties with severity+symptom; §9 disclaimed +
+false friends; §11a non-findings; §13 dispositions) for automated/Glasswing
+triage.
+
+---
+
+### Appendix — SECURITY.md / website back-map
+
+**Not applicable.** Knox publishes no project-specific `SECURITY.md` (repo 404)
+and no dedicated security page; `security.apache.org/projects/` lists Knox only
+with the generic Apache Security Team contact. There is therefore no prior
+maintainer-authored security-policy artifact to back-map or superset. If the 
PMC
+adopts this model (Q-meta-A), this section becomes the seed for a new
+`SECURITY.md`.


Reply via email to