You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: add trust consequences and disposition rules to THREAT_MODEL.md
The threat model defines trust boundaries but not the dispositions
that follow from them. As a result, automated scanners and security
researchers repeatedly report findings that maintainers must rebut by
hand-deriving the same conclusions: malformed-input crashes behind
authenticated peer/client transport are robustness defects, grpc-proxy
and contrib are best-effort components, CI and release scripts are not
product attack surface, diagnostic endpoints are non-default operator
opt-ins, and watch permission revocation is eventually consistent by
design.
Make these dispositions explicit so reports can be evaluated against
the document directly:
* State that traffic which has passed client or peer mTLS is trusted
input, and what a report against those boundaries must demonstrate.
* Add boundaries for authentication/authorization semantics and for
build, release, and CI tooling.
* Add sections scoping best-effort components and non-default or
test-only configuration.
* Add a reporting section clarifying that robustness and hardening
findings remain welcome as normal issues and pull requests.
AI assisted: drafting the document restructure, commit message, and PR description
Signed-off-by: "Pushkar Joglekar 3390906+PushkarJ@users.noreply.github.com"
Signed-off-by: Pushkar Joglekar <pushkar.joglekar@broadcom.com>
Copy file name to clipboardExpand all lines: THREAT_MODEL.md
+72Lines changed: 72 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,3 +1,4 @@
1
+
1
2
# etcd Threat Model
2
3
3
4
This document defines the security assumptions and trust boundaries of the etcd project.
@@ -17,17 +18,37 @@ etcd Server assumes it is deployed within a strictly isolated, private network s
17
18
It **must not** be exposed to untrusted networks or the public internet.
18
19
Both the **etcd Client** and the **etcd Server** reside inside this protected perimeter.
19
20
21
+
Client and peer private keys and certificates are assumed to be properly protected.
22
+
Attack scenarios that presume a stolen valid certificate, or attacker-controlled infrastructure inside the perimeter (such as reverse DNS), are outside this threat model.
23
+
20
24
### The Client-to-Server Boundary
21
25
22
26
etcd clients communicate with etcd Servers over Port 2379.
23
27
This boundary requires **mTLS encryption**.
24
28
Any client request must prove its identity at the transport layer using client certificates.
25
29
30
+
Traffic that has passed client mTLS authentication is **trusted input**.
31
+
Crashes, memory exhaustion, or resource leaks triggered by malformed or high-volume requests from an authenticated client are robustness defects, not vulnerabilities.
32
+
A vulnerability report against this boundary must demonstrate reachability by an unauthenticated actor, or in effect exceeding the sender's existing privileges.
33
+
26
34
### The Peer-to-Peer Boundary
27
35
28
36
etcd Server members communicate with other cluster members over Port 2380 to run Raft consensus.
29
37
This boundary must be strictly limited to authorized cluster members using dedicated, private peer certificates (mTLS).
30
38
39
+
Data arriving over the authenticated peer transport — Raft payloads, snapshot streams, lease-forwarding bodies, and peer HTTP headers — is **trusted input**.
40
+
Peer HTTP handlers rely on transport-level authentication rather than per-request authentication by design.
41
+
Panics or unbounded allocations reachable only from an authenticated peer are robustness defects.
42
+
A vulnerability report against this boundary must demonstrate exploitability by a node that is not an authorized cluster member.
43
+
44
+
### The Authentication & Authorization Boundary
45
+
46
+
etcd's built-in role-based access control is an **optional, secondary** control layered behind mTLS.
47
+
It is disabled by default, and major consumers (such as the Kubernetes API server) rely on transport security and network isolation instead.
48
+
Timing side channels and name-enumeration leaks behind the transport boundary are hardening concerns, not vulnerabilities.
49
+
Watch-stream permission revocation is **eventually consistent by design**; established streams may deliver events for a bounded period after revocation.
50
+
A report is actionable only if revocation never takes effect, or if a new stream can be opened after revocation.
51
+
31
52
### The Host Execution Boundary
32
53
33
54
etcd Server is compiled as a pure, statically linked Go binary (`CGO_ENABLED=0`).
@@ -37,3 +58,54 @@ It does not dynamically load or link to dynamic system libraries (such as host C
37
58
38
59
etcd Server writes data to the local storage subsystem exactly as received from the client.
39
60
Data protection at rest is a client-side responsibility (e.g., client envelope encryption) or must be managed via disk filesystem encryption.
61
+
62
+
### The Build & Release Boundary
63
+
64
+
Scripts and tooling under `scripts/`, `tools/`, `hack/`, and `.github/` execute only in trusted, access-controlled build, test, and release environments.
65
+
They are not part of the shipped product's attack surface.
66
+
Unpinned tool downloads, missing checksums, predictable temporary paths, and workflow-input interpolation are supply-chain hardening items.
67
+
Fixes are welcome as normal contributions, not security reports.
68
+
69
+
---
70
+
71
+
## Component Scope
72
+
73
+
The boundaries above apply to the **etcd server binary**, the official client library, and the production command-line tools (`etcdctl`, `etcdutl`).
74
+
75
+
The following components are best-effort and are not covered by the security-response process:
76
+
77
+
-`grpc-proxy` and the embedded gRPC gateway
78
+
- the `cache` package
79
+
- everything under `contrib/`
80
+
81
+
Defects in these components are handled as normal issues and pull requests, without advisories or CVE assignment.
82
+
83
+
---
84
+
85
+
## Non-Default & Test-Only Configuration
86
+
87
+
Diagnostic facilities are **disabled by default** and intended for trusted debugging contexts only:
88
+
89
+
- pprof endpoints (`--enable-pprof`)
90
+
- the expvar endpoint (`/debug/vars`)
91
+
- verbose logging (`--log-level=debug`), which also exposes gRPC tracing
Enabling them is an explicit operator decision that knowingly expands the attack surface.
95
+
Reports predicated on a non-default flag, or on a documented operator-overridable default, are configuration hardening.
96
+
Listener schemes that exist to support etcd's test suites (`unix://`, `unixs://`) are not production configurations and are out of scope.
97
+
98
+
---
99
+
100
+
## Reporting
101
+
102
+
A finding is a security vulnerability only if it crosses one of the boundaries above:
103
+
104
+
- reachable by an unauthenticated actor, or
105
+
- exceeding an authenticated actor's existing privileges, and
106
+
- in a production-scoped component, under production-relevant configuration.
107
+
108
+
Everything else — robustness defects behind trusted boundaries, hardening of best-effort components, build tooling, and non-default features — is welcome through normal issues and pull requests.
109
+
The project routinely accepts and backports such fixes; "not a vulnerability" never means "do not report".
110
+
111
+
Authentication bypass, privilege escalation, data corruption triggerable by an unprivileged actor, and remote code execution always warrant a report through the [security-disclosure process](security/README.md).
0 commit comments