diff --git a/docs/architecture/ARCHITECTURE.md b/docs/architecture/ARCHITECTURE.md index f5bd909d..1e3bd74e 100644 --- a/docs/architecture/ARCHITECTURE.md +++ b/docs/architecture/ARCHITECTURE.md @@ -144,6 +144,19 @@ flags, and raw configuration never enter the runtime edge, finding, or browser response. Missing, stale, duplicate, malformed, or collided facts produce no finding. +`docker.daemon_state_bind_mount_publishes_port` emits a warning only when the +same uniquely identified Docker container has an exact pair of fresh version-1 +Docker observations from the same collection: the path-free daemon-state risk +fact and a validated nonzero host-to-container port publication. Its canonical +evidence order is daemon-state first, then port publication. This is a static +review prompt for the co-occurrence of those facts, not an Internet-reachability, +traffic, exploitability, compromise, breach, impact, or causal conclusion. +Private container listeners, zero or malformed bindings, stale or mismatched +observation timestamps or provider revisions, duplicate or collided facts, and +non-Docker input produce no finding. The projection is derived from the cached +runtime map: it adds no collector, host scan, or write capability, and mock +mode publishes neither evidence nor evidence-derived findings. + `docker.compose_declared_target_not_active` emits an advisory only when one fresh, uniquely identified `depends_on` relationship is a Docker-recorded Compose declaration from a running Docker container to a uniquely identified diff --git a/docs/security/THREAT_MODEL.md b/docs/security/THREAT_MODEL.md index c84b5fbc..abba73f5 100644 --- a/docs/security/THREAT_MODEL.md +++ b/docs/security/THREAT_MODEL.md @@ -56,6 +56,13 @@ changes them: - Docker daemon-state bind-mount evidence is a single closed, path-free fact. It never exposes a mount path, mount ID, mount options, or raw Docker configuration. npm dependency evidence is likewise a bounded declaration with a curated summary, never raw `package.json` content. +- The daemon-state-and-host-port warning is a cached, static review derivation, not a collector. + It accepts only one fresh version-1 Docker daemon-state fact and one fresh Docker port-publication + fact for the same unique container, recorded at the same observation time and provider revision; + the port fact must already prove a validated nonzero host-to-container binding. It is suppressed + for mock, stale, malformed, duplicate, collided, mismatched, private-only, zero, or non-Docker + input. It does not disclose the mount or port value and does not assert Internet reachability, + traffic, exploitability, compromise, breach, impact, or causality. - The Compose target-state advisory is a cached read-only derivation, not a collector. It accepts only one fresh version-1 Docker `docker_compose_depends_on` observed-declaration reference for a unique running Docker-container source and unique stopped/failed Docker-container target. @@ -172,6 +179,10 @@ Automated tests currently cover: runtime evidence or evidence-derived findings; private container ports have no host-publication evidence; daemon-state facts remain path-free; and Systemd/npm declarations retain only their closed slot revision, timestamp, and freshness vocabulary. +- Finding boundary tests include the daemon-state-and-host-port warning: only the ordered fresh + Docker pair for one unique subject with matching collection timestamp and provider revision is + accepted. Tests suppress private-only, zero, malformed, stale, duplicate, crossed, collided, + non-Docker, and mock inputs; the presentation remains static and does not expose evidence values. - GUI smoke coverage against daemon fallback mode. - Route and middleware completeness: every Express layer must be wrapped in `trackedMiddleware()` and every route registered through `registerRoute()` with diff --git a/docs/testing/TESTING_PLAN.md b/docs/testing/TESTING_PLAN.md index 8e6b268a..db985f97 100644 --- a/docs/testing/TESTING_PLAN.md +++ b/docs/testing/TESTING_PLAN.md @@ -24,6 +24,13 @@ containers, or services. collided, ambiguous, non-Docker, and non-matching-status inputs. These are projection tests: they add no collection and never assert requiredness, readiness, health, traffic, start-order, root-cause, or drift conclusions. +- The daemon-state-and-host-port warning accepts only an ordered pair of fresh version-1 Docker + observations for one unique container: a path-free daemon-state risk fact followed by a port + publication with a validated nonzero host binding. Tests require matching observation timestamp + and provider revision, and suppress private-only, zero, malformed, stale, duplicate, crossed, + collided, non-Docker, and mock inputs. They verify static review wording only; no test treats the + pair as proof of Internet reachability, traffic, exploitability, compromise, breach, impact, or + causality, and the projection adds no collection or write behavior. - Rust-owned JSON Schema and generated TypeScript declarations, Node-owned envelope/request/SSE schemas, and readable contract fixtures. The contract check fails on stale generated output, invalid fixtures, incomplete