a73x

Enrollment rate-limit bucket scope unresolved: per-source or plane-wide?

open   by a73x

Labels: backlog

From the pre-launch security audit (finding API-7). Ranked #1 of the OUTSTANDING set —
not because it is confirmed High, but because it is the cheapest unresolved uncertainty.

**The uncertainty.** The enrollment limiter demonstrably works (5x403 -> 429 observed
black-box). But from a single source address I could not tell whether I emptied *my*
bucket or *the plane's*. If the bucket is plane-wide, ~6 requests from anywhere pause
fleet enrollment for everyone — an unauthenticated, fleet-wide DoS. If it is per-source,
this is Low and closes.

**Part A (10 minutes).** Resolve the bucket scope — read the limiter/proxy config, or
probe from two source addresses. This either drops the finding or escalates it to the
top of the whole list.

**Part B (if needed).** A Traefik `rateLimit` middleware on the console/API IngressRoutes
with an explicit `sourceCriterion` makes the scope per-source by construction, and needs
no Cloudflare account or DNS change (the plane already fronts HTTP with Traefik). Draft
was scoped but not built.