mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-10 16:04:04 +00:00
39 lines
5.2 KiB
Markdown
39 lines
5.2 KiB
Markdown
# Cosmic Clash multiplayer threat model
|
|
|
|
This is the launch threat model for the control plane, dedicated servers and
|
|
clients. It records the security boundary and the verification owner for each
|
|
class of failure; it does not treat a trusted workload class as a trusted
|
|
individual pod.
|
|
|
|
| Threat | Prevention | Detection / response | Owner | Residual risk |
|
|
|---|---|---|---|---|
|
|
| Forged Steam identity or ticket | Backend calls Steam validation for the expected App ID; player ID comes from the verified SteamID mapping, never request JSON | Ticket rejection metrics, replay alerts, ban/revoke identity | Identity/API | Valve/Steam outage pauses new authenticated sessions |
|
|
| Ticket/session replay | Single-use ticket nonce; opaque short-lived session token; store token digest and revocation in PostgreSQL | Duplicate-ticket and revoked-session counters; incident revoke all sessions for identity | Identity/API | Stolen live session remains usable until expiry/revocation propagation |
|
|
| Queue/proposal flooding or duplicate claims | Body/rate limits, one active ticket partial unique index, idempotency keys, serializable participant fence | Per-identity/IP rate alerts, queue-depth and conflict dashboards, overload shedding | API/matcher | Distributed abusive identities can consume bounded capacity until automated bans act |
|
|
| Latency-evidence forgery | Opaque location, nonce/freshness checks, server-computed RTT, discrepancy quarantine; evidence affects placement only | Three-bad/five-clean counters and regional RTT SLO alerts | Matcher/networking | Colluding endpoints can bias placement within the accepted evidence window |
|
|
| Join-authorisation theft or slot hijack | Signed match-scoped authorisation binds verified SteamID/match/server/team/slot/protocol/expiry; server-owned generation fences old peers | Rejected-binding/generation metrics and audit events; revoke assignment | Allocator/game-server | A stolen valid authorisation remains usable until expiry unless the server revokes it |
|
|
| Forged or replayed match result | Bounded-lifetime (two-hour default) HMAC workload token delivered through the allocated GameServer annotation; backend resolves its allocation ID to the durable match/server binding; canonical digest | Receipt conflict is inert and pages; duplicate is idempotent; result lag alerts at 5/30 minutes | Result/maintenance | A compromised authoritative pod, or a principal able to read its allocated GameServer metadata before expiry, can submit for that allocation |
|
|
| Workload/insider compromise | Per-workload service accounts, least RBAC, private stores, default-deny network, no publisher/root key in game pods; restrict GameServer metadata read access to the allocator and cluster operators | Credential-use audit, anomalous allocation/result pairing alerts, immediate workload drain/revoke | Platform/security | Cluster-admin/KMS compromise, or an authorized metadata reader acting before token expiry, is outside application controls |
|
|
| Gameplay/API DDoS and flood | Connection/body/WebSocket limits, token buckets, overload shedding, edge WAF/DDoS service, live-result priority | Saturation, 5xx, tick-backlog and dropped-work dashboards; shed new queue/allocation work first | SRE/platform | Volumetric attack may require provider mitigation capacity |
|
|
| SDR signing-key theft | Offline CA separated from online signer; non-exportable KMS/HSM key; signer allowlist and short-lived tickets | Signer audit and anomaly alerts; rotate/revoke certificates and tickets | Security/networking | Provider/Valve trust or HSM compromise requires external response |
|
|
| Dependency/image supply chain | Pin image/dependency digests, SBOM, vulnerability scan, artifact signature and admission verification | CI/admission failures and provenance inventory; critical-fix SLA | Release/security | Unknown zero-days remain possible until detection or patch |
|
|
| Denial of wallet / autoscaling abuse | Allocation quotas, budgets, warm-capacity limits, per-identity/IP controls and scale ceilings | Cost-per-match, allocation-rate and quota alerts; disable region/playlist safely | SRE/finance | Legitimate launch spikes can trigger conservative limits |
|
|
| Data loss or cache inconsistency | PostgreSQL backups/RPO <=5m, serializable transactions, transactional outbox; Redis is rebuildable only | Restore/failover rehearsal, cache-repair metrics, result reconciliation | Data/SRE | Recovery can pause new work; valid live matches must continue |
|
|
|
|
## Trust boundaries
|
|
|
|
- Clients are untrusted and cannot submit ratings, outcomes, penalties,
|
|
allocation state or exemptions.
|
|
- Game servers are authoritative for simulation but are not trusted for
|
|
identity, allocation ownership, or unrestricted result submission.
|
|
- PostgreSQL is the durable authority. Redis and Agones annotations are
|
|
recoverable transport/cache state.
|
|
- The offline SDR CA and online leaf signer are separate; API, matcher,
|
|
allocator and game-server workloads cannot read signer keys.
|
|
|
|
Every accepted residual risk above has an owner and a planned detection path.
|
|
Security incidents fail closed for identity/result ownership. An allocated
|
|
server remains in its results state and retries its idempotent result request
|
|
until the control plane durably acknowledges it; it does not exit first and
|
|
silently lose the authoritative outcome.
|