docs release evidence p08 t08 security - AlexandreZanata/Abastevo GitHub Wiki
P08-T08 security and dependency release review (local evidence)
Date: 2026-09-30. Scope: launch-blocking auth/privacy/storage review on
head 8ff3797 (phase codex/phase-08-hardening). Method follows
SECURITY_PRIVACY STRIDE plus
the pinned scans in scripts/check-security.sh (static review,
govulncheck, focused adversarial suites) proven by
scripts/tests/test-security.sh. No product behavior changed; this is
a review gate with evidence, not a feature.
Verdict
No unresolved critical/high findings on the reviewed tree. Release still needs P09 staging acceptance (30-minute matrix, live R2/edge, restore on provisioned infra) before any pilot claim.
What was reviewed
- Spoofing/tampering: P-256/RFC 9421 vectors (P03-T01), single-use nonce with concurrent-replay refusal, covered-component/body-digest rejection, append-only facts, checksummed official revisions, server-verified frozen evidence (different final key, orphan sweep).
- Disclosure: private bucket by construction (no ACL grants in
evidence/adapters/storage), 60 s case-bound evidence URLs never logged, redacted config/telemetry logs, owner-scoped reads sharing one 404 shape, edge stripsCookie/Authorizationon the shared set (P08-T06 invariance tests), metrics loopback-only. - DoS: 1 MiB API body cap, 30 MiB ANP fetch cap, 3 MiB JPEG cap with 12 MP/8192 px pre-decode bounds, quotas (10/day uploads, registration/write limits with 429/Retry-After), lease/fencing queues with dead-letter replay, bounded alerts.
- Elevation: no public admin routes; moderation/privacy operator work
via restricted
cmd/opswith mandatory actor+reason audit; migrator-only DDL; staging/prod DB has no published ports; Caddyadmin off,trusted_proxies private_ranges, TLS 1.2/1.3 only. - SSRF: ANP fetcher allowlist + redirect-target recheck + public-IP dial policy with explicit denied prefixes, TLS 1.2 minimum, size/timeout/conditional-fetch bounds, temp-file cleanup.
Dependency and image inventory (reviewed pins)
Go go1.27 / toolchain go1.27.1. Direct: chi v5.3.2,
pgx v5.11.0, kin-openapi v0.149.0 (all MIT, permissive transitives
only; no replace directives; go.sum present). Tool pins:
sqlc v1.31.1, staticcheck v0.8.1, govulncheck v1.8.0,
vacuum v0.30.6 (see backend/README.md).
Images: golang:1.27.1-bookworm@sha256:69a7b978ā¦f99195 (builder),
gcr.io/distroless/static-debian12:nonroot@sha256:afa5c872ā¦57f7ab
(runtime, USER 65532:65532 all roles),
postgis/postgis:18-3.6@sha256:60f6ad1dā¦80b8677,
caddy:2.10.2-alpine@sha256:4c6e91c6ā¦e530d; roles ship immutable
ANPFUEL_RELEASE tags, never latest. Full module list:
cd backend && go list -m all.
Commands and outcomes (tested tree)
bash scripts/check-security.shā full gate green: static review ok,govulncheck ./...reports no vulnerabilities, 18 focused adversarial packages green (config,telemetry,httpserver,identity/profile+domain+adapters/auth+application,official/adapters/source,evidence/storage+media+domain,community/adapters/http,moderation/domain+application,privacy/domain+application).bash scripts/tests/test-security.shā 10/10: reviewed static tree accepted; 7 mutants refused (public DB port, floating image, opentrusted_proxies, dev secret, unpinned builder, root runtime,go.modreplace); livegovulncheckclean; adversarial selection executes. RED per fault class proven by the refusals, GREEN on the reviewed tree.bash scripts/scan-secrets.shā green via the gate (tracked files plus secret-shaped patterns in compose/Caddy/Dockerfile/examples).
Limits (explicit non-claims)
- Emulator plus isolated R2 staging pending (no registry access for the minio image, no staging credentials here); the storage adapter targets real SigV4 so both run when available (P05-T02).
- Live edge TLS/proxy-authority and the 30-minute acceptance load (100k stations, 1M rows, signed-write admission, shared cache) run on provisioned staging in P09, not here.
- Dependency scan is
govulncheckon Go modules plus digest/secret static review; OS-layer/image CVE scanning runs at build/deploy time on provisioned infra. - A failed candidate blocks release: fix on this phase branch, rerun the affected gate on the new head, never weaken thresholds or hide test absence.