Skip to content

Threat Model ​

A lightweight, STRIDE-style model of the platform. It names the trust boundaries, the assets worth protecting, who the threat actors are, and the main threats with the control that addresses each. It is a reasoning tool for the panel and maintainers, not a penetration-test report.

Trust boundaries ​

BoundaryBetweenCrossing is controlled by
B0Operator and hostOCI security list: SSH 22 from the operator /32 only
B1Internet and edgeCloudflare Tunnel; no inbound ports open on the host
B2Edge and applicationnginx routes / to the portal, /auth/ to Keycloak, /api/ssh-websocket to the bridge
B3Browser and dataPortal BFF requires a session and injects the token server-side; API re-validates by introspection and authorizes per route
B4Host and lab zoneLXD control plane (lxc exec) only; the host has no IP route into lab networks
B5Lab zone and monitoringLab networks are peered only to the monitoring network so agents can reach the manager. Each lab network carries an egress ACL (default reject) that allows only the lab's own subnet and the manager on TCP 1514/1515 (pull request 308); the Wazuh API is bound to loopback inside its container by harden_wazuh_api.sh (pull request 303)

Assets ​

AssetWhy it mattersWhere it lives
Student, instructor and admin identitiesAccount takeover would expose grades and admin actionsKeycloak
Access tokensBearer tokens authorize every API callBrowser session (memory), server-side, and the terminal WebSocket URL
Scores, reviews, telemetryAcademic integrity of the capstoneSQLite pod_mgmt.db
The hostOne VM runs everything; host compromise is totalOCI Ampere instance
Lab isolationA break from one lab into another or the host would undermine the whole designOVN networks, unprivileged containers
Platform secretsClient secrets, the flag secret, Wazuh and admin credentials, the Wazuh internal CA private keyenv files (mode 600), secrets file, ~/cyberrange-data/wazuh-ca/ (keys mode 600)
SIEM integrityScenario 3 scoring and instructor alert views depend on the shared manager's agent list and alertswazuh-manager container

Threat actors ​

  • A curious or malicious student. Authenticated, has root inside their own lab by design, and controls a machine on a lab network. The primary actor the isolation is built against.
  • An unauthenticated internet user. Can reach only the login page and the public /health, /capacity and browser-score endpoints through the tunnel.
  • A compromised lab target. The vulnerable machines are meant to be exploited; treat them as attacker-controlled.
  • An insider with instructor or admin rights. Trusted, but their powerful actions should be audited.

STRIDE-style threats ​

ThreatCategoryVectorControlResidual risk
Impersonate another userSpoofingSteal a password, guess one, or steal or forge a tokenRequired TOTP MFA; password policy with blocklist; temporary lockout after 10 failures; PKCE + state; introspection every request; short cache; owner checks return 404Access token is exposed to the browser and travels in the terminal WebSocket URL (see Findings)
Tamper with another student's scoreTamperingCall the API for another studentIdentity is taken from the token, never a parameter; owner checks; parameterized SQLLow
Deny a scoring conflict happenedRepudiationAdmin destroys a lab or grades unfairlyAppend-only audit_log; force-destroy and user-management writes record the actorLogs are in /tmp (lost on reboot); no off-host shipping
Read another student's dataInformation disclosureGuess IDs, browse the APIrequire_owner returns 404; instructor and admin routes gated; DVWA proxy path allowlist/capacity is public; admin token can open any lab terminal
Exhaust the hostDenial of serviceProvision many labs, fill disk, spam scoringMAX_PODS, RAM and storage gates, one lab per student, per-scenario time limit (30 to 60 min) checked every 60 sSQLite grows from per-check rows
Pollute the shared SIEMTamperingRegister fake agents or flood events from a labLab egress ACL allows only TCP 1514/1515 to the manager; the API (55000) is not reachable from a lab; a lab is not marked ACTIVE while a stale agent with the student's name is still registeredEnrollment is still passwordless, so the enrollment port accepts any agent from a lab (F6)
Escape a labElevation of privilegeRoot in a container, attack the host or another lab, or use the lab as a jump box to the internetUnprivileged containers with caps; no lab-to-lab peering; host has no route into labs; per-lab egress ACL rejects internet, uplink DNS and the lab's own gateway address, re-applied by the reaperHost operator SSH key is installed in every lab's root account; the egress ACL is new and needs a live test from a disposable lab
Exploit the internet-facing portalElevation of privilege / Information disclosureA known framework vulnerabilityImage Optimization API disabled; framing, nosniff and referrer headers; portal binds a private address behind nginx and the tunnelno HSTS or full CSP (F14)
Break out of the gatewayElevation of privilegeReach the Keycloak admin API through nginxAdmin console intended to be SSH-tunnel onlyRepo nginx config exposes admin/master-realm routes through the origin (D3)

Design assumptions to validate on the live host ​

These come straight from the Open Questions and matter to the model: whether the new egress ACL really blocks internet and DNS from a live lab, whether harden_wazuh_api.sh and issue_wazuh_internal_ca.py --install have been run on each host (their evidence records are still Pending), whether the Keycloak admin routes are exposed, whether Keycloak runs its dev H2 database in production, whether gateway access logs (which capture the token in the WebSocket URL) are enabled, and whether backups exist.

Sources

manual/appendix-network-map.md, manual/02-gateway-and-wazuh.md, manual/06-scoring.md, cyberrange/src/provisioning/auth.py, pods_router.py, pod_net.py, provision.py, wazuh_client.py, bridge-src/bridge.py, cyberrange/deploy/guacamole/nginx-ampere.conf, cyberrange/deploy/host/harden_wazuh_api.sh, issue_wazuh_internal_ca.py, cyberrange/portal/next.config.mjs. Severity judgments are the reviewer's, from a read of the code at commit daeb43f, re-checked at 220e6d3 and 6971373.

Cyber Range capstone documentation (Capstone 2 · Group 2 · A4102). Documents main at commit 6971373.