From the admin security audit (2026-08). Not a code bug — a deployment-posture gap.
cloudflareAccessGate() is wired in front of /v1/admin/* (workers/api/src/index.ts:99) but is inert until both CF_ACCESS_TEAM_DOMAIN and CF_ACCESS_AUD are set (lib/cf-access.ts — if (!cloudflareAccessConfigured(c.env)) return next();). Prod currently runs with these unset, so today the entire operator portal (every cross-tenant read: all users, all instance configs, all coding-session timelines, all errors, all spend) is protected by requireAdmin alone — a single HS256 bearer token.
The gate itself is sound: it requires both env vars, pins alg:RS256, verifies against fetched JWKS, and fails closed (JWKS fetch failure / malformed / expired / aud-mismatch → 403). It just isn't engaged.
Action
Severity: MED. Do before the paid launch — a leaked/forged admin session or a mistaken ADMIN_ALLOWLIST entry is currently full game-over with no second factor.
Files: workers/api/src/index.ts, workers/api/src/lib/cf-access.ts.
From the admin security audit (2026-08). Not a code bug — a deployment-posture gap.
cloudflareAccessGate()is wired in front of/v1/admin/*(workers/api/src/index.ts:99) but is inert until bothCF_ACCESS_TEAM_DOMAINandCF_ACCESS_AUDare set (lib/cf-access.ts—if (!cloudflareAccessConfigured(c.env)) return next();). Prod currently runs with these unset, so today the entire operator portal (every cross-tenant read: all users, all instance configs, all coding-session timelines, all errors, all spend) is protected byrequireAdminalone — a single HS256 bearer token.The gate itself is sound: it requires both env vars, pins
alg:RS256, verifies against fetched JWKS, and fails closed (JWKS fetch failure / malformed / expired / aud-mismatch → 403). It just isn't engaged.Action
admin.proagentstore.online(self-hosted, policy = the operator email(s)).CF_ACCESS_TEAM_DOMAIN+CF_ACCESS_AUDas API Worker secrets (Dopplerpags/prd→wrangler secret put).Severity: MED. Do before the paid launch — a leaked/forged admin session or a mistaken
ADMIN_ALLOWLISTentry is currently full game-over with no second factor.Files:
workers/api/src/index.ts,workers/api/src/lib/cf-access.ts.