Security fixes are provided for the latest released minor version. Before the first stable release, fixes may require upgrading to the newest 0.x release.
These crates are middleware, not a service. Some controls can only be applied by the application that embeds them.
EdgeConfig::with_auth_failure_limit bounds sustained
credential guessing across the edge. It is disabled by default, because the
useful ceiling depends on how many clients you serve. Only failures consume the
budget, so enabling it cannot lock out callers holding valid keys. It is not
per-client limiting: the edge has no client identity it can trust, since a
source address belongs to the transport and forwarding headers are attacker
controlled, so per-address limits belong in the proxy in front of it. Alert on
mcp_usage_throttled_total and mcp_usage_unauthenticated_total, both counted
separately from malformed-header rejections. The builder returns
InvalidAuthFailureWindow for a zero-duration window.InMemoryTenantStore::insert refuses obviously weak keys;
insert_unchecked bypasses that for fixtures and for keys validated at the
boundary where they are issued. The check is a guardrail against mistakes, not
a strength certificate: it cannot see structure, so a long repeating pattern
drawn from a wide alphabet passes. Generate keys from a CSPRNG, for example
openssl rand -base64 32.PostgreSQL task store, terminal
accounting that cannot finish synchronously is parked on
EdgeConfig::deferred. Authenticated requests drain it automatically;
malformed and unauthenticated traffic cannot trigger backend work. A
cancelled drain requeues its in-flight completion. Drain explicitly after the
server has completed graceful shutdown so a departing process does not take
durable-task charges with it. Alert on DeferredCompletions::dropped, which
is nonzero only when usage was discarded because the queue was full.BillingPipeline::flush
restore the exact aggregate quantities, timestamps, and identifiers for retry.
The buffer remains process-local and does not survive process loss. Strong
crash durability requires an application-owned durable recorder or outbox.MeterEventExporter retains synchronous
permanent rejections and verified asynchronous rejections in a bounded,
identifier-deduplicated dead letter queue. Applications must authenticate and
verify asynchronous provider notifications, correlate them with source usage,
and pass only the original aggregate to quarantine_async_rejection. Alert on
dropped_dead_letters because a nonzero value means reconciliation data was
discarded.EdgeConfig::with_public_cache_sharing is off
by default. Turning it on trusts every origin behind the layer to use
cacheScope: "public" only for results that genuinely do not depend on the
caller.scripts/configure-github-controls.sh: updates to main require a
code-owner-approved pull request, resolution of review threads, and every CI
job from the GitHub Actions app. Version tags are immutable, and the release
environment requires review and accepts only v* tags. Independently of
repository settings, publishing refuses a tagged commit that is not
reachable from the current origin/main.Please do not open a public issue for a suspected vulnerability. Use the repository’s private security advisory form and include reproduction steps, affected versions, and the expected impact.
Reports are handled privately. We will coordinate disclosure and credit with the reporter after a fix is available.