Skip to content

v2026.08

Latest

Choose a tag to compare

@andy-cshub andy-cshub released this 19 Aug 14:15
· 6 commits to master since this release
daaa68b

🚀 What's Changed

Frontend

Click to expand changelog

Across the platform

  • Removed Adaptive training mode; removed the "linear" terminology as the only mode is now linear
  • Added a clear button to all relevant inputs, with unified behaviour throughout
  • Capped titles and names at 256 characters, and token prefixes at 32
  • Long text truncated in tables and cards reveals itself on hover, and only when actually clipped
  • Multi-line fields grow to fit their content instead of being dragged to resize
  • Unsaved changes state now persists on save failures
  • Removed all D3-based visualizations and replaced them with ECharts visualizations

New charts

  • All charts poll live data and offer CSV export
  • Progress - per-trainee progress across levels over time
    • Added a duration mode aligning every run to zero and showing elapsed time only
    • Added an event type filter
  • Status tiles - run state, time remaining, hints used and score
  • Feedback overview - one trainee's identity and how their run concluded
  • Live event feed - aggregated feed of most recent events
  • Scoreboard - trainees ranked by score and duration
  • Players per level - number of active runs at each level
  • Score attainment - distribution of trainees across score bands
  • Level difficulty - per-level difficulty from wrong answers, hints, solutions and time
  • Top wrong answers - most frequent incorrect answers per level
  • Trainee wrong answers - one trainee's incorrect answers
  • Time vs expected - time spent per level against the authored estimate
  • Time vs score - time spent against points scored per level
  • Cumulative score - score accumulating level by level
  • Overall speed vs score - every run's total time against its score
  • Level percentiles - a run's score and time ranked against others, per level
  • Assists coverage - which hints and solutions a run opened
  • Event timeline - chronological run events with commands plotted beneath
  • Commands - console commands aggregated per level, searchable, with argument folding
  • Command log - one run's commands in order, with host, source IP and working directory

Training analysis dashboard

  • Replaced all instance organiser visualizations with a dedicated analysis dashboard
    • Aggregated view
      • Presents the instance as a whole, covering current trainee standing and providing basis for improving the training definition
      • Contains status tiles, progress, live event feed, scoreboard, players per level, score attainment, level difficulty, top wrong answers, time vs expected and commands
    • Trainee view
      • Presents a single selected run end to end, for monitoring or debriefing an individual trainee
      • Contains cumulative score, time vs score, trainee wrong answers, event timeline and command log
      • Runs are picked from a list carrying score, time, current level, hints, solutions and wrong answers
    • Assessment view
      • Presents the distribution of answers per question, allowing for question quality and difficulty analysis
      • Selecting an answer highlights every trainee who chose it
      • CSV export of the shown assessment, one row per trainee and question
  • Selected view and trainee are held in the URL fragment, for sharing and bookmarking
  • Removed now deprecated views: dashboard, quiz results, walkthrough, command timeline and command analysis

Trainee run summary

  • Replaced the previous trainee run visualization with a new summary dashboard
    • Presents a completed run back to the trainee, covering how it concluded and how it stands against other runs on the instance
    • Contains feedback overview, overall speed vs score, level percentiles, scoreboard, assists coverage, cumulative score, time vs score and event timeline

Score export

  • Reworked training instance score export, now broken down per level and splitting the assessment score from the training score
  • Exports as CSV, replacing the previous plain text download
  • Exports rank, login, name, mail, state, start and end time, duration, one column per scored level, training score, assessment score, total, hints taken, wrong answers and solutions displayed
  • Levels a trainee never attempted export as a dash rather than a zero

Training definition editor

  • Improved EMI question edit visuals
  • Leaving Test mode restores each question's original required setting, instead of leaving every question forced to required

Topology

  • Fixed crashes on multihomed VM nodes, which were emitted once per attached network and collided on duplicate identifiers
  • Nodes whose operating system is not recognised no longer show a mismatched OS icon
  • Internet node graphic is generated asynchronously, and failures are handled rather than breaking the graph

Sandbox

  • Pool comments apply immediately and roll back if saving fails
  • Pool comment length is capped
  • Prompts before leaving pool edit with unsaved changes
  • Creating a sandbox definition shows a loading state, and repeated Enter presses can no longer submit it twice

User and group

  • Reworked microservice roles around a fixed default role, which every user of that microservice receives, cannot be deleted, and is always present so a microservice can never be left without one
  • Adding a role moves focus straight into it
  • Groups with no members or no roles say so, rather than showing an empty table
  • Minor visual and behavioural improvements across user, group and microservice management, covering unsaved changes prompts and support for users without an email address

Navigation and home

  • Home page hides agenda sections the user holds no role for, and shows a message if no agendas are accessible
  • Users with access to a single agenda are taken directly to it instead of through the home page
  • Fixed Design navigation offering Pool and Sandbox Images based on the wrong roles
  • Navigating to an entity that does not exist redirects instead of failing

Internal

  • New event query engine backing every chart, with events syncing into a local SQLite database in a web worker so charts query it instead of the network
  • Sync tracks a watermark per instance and event type, so only new events are fetched
  • Entity references on event rows resolve to full entities through a dedicated resolver
  • Only one browser tab may own the local cache; other tabs are shown a blocked page and resume once it is freed
  • Cached instances are evicted by age and total size on startup
  • Cached batch fetch of entities by identifier resolves each id from a local cache and requests only the ones missing
  • Cache lifetimes and maximum size are configurable, and polling periods are configured as duration strings
  • Charts stop polling while the browser tab is hidden, and resume when it returns
  • Route resolvers rewritten to fetch an entity once per navigation and share it across title and breadcrumb
  • Unsaved changes tracking and its route guard extracted for reuse across agendas
  • Pagination types moved from the Sentinel package into the shared utils library
  • Replaced moment with date-fns for all duration handling
  • Shared Vitest configuration adopted across every module, with a new test utilities library
  • Theme gains spacing, font size and font weight token scales, and a card header style

Java backend

Click to expand changelog

Visualization and analytics

  • New events endpoint serving raw training and console command events, replacing the old server-rendered visualizations
    • GET /training-instances/{instanceId}/events, filtered by event type and a since timestamp, suitable for polling
    • Accessible to administrators, organizers of the instance and its participants
    • Participants see only their own answer events and commands
  • Removed all server-rendered visualizations in favour of the events endpoint, decoupling frontend charts from backend analysis
    • /visualizations/** - 22 endpoints
    • /clusters/** - 6 endpoints
    • Command graphs - 11 endpoints

Score export

  • Score export now returns a rich JSON report instead of a CSV file
  • GET /exports/training-instances/{instanceId}/scores
  • Carries rank, training and assessment score, total, per-level scores, hints taken, wrong answers, solutions displayed, start and end time, and duration; the old CSV carried only instance id, login and total training score
  • Lists the levels it scores, in definition order
  • Wrong answers on access levels are excluded from the total
  • Ranked by score, ties broken by shorter time, then by run id

Bulk lookup

  • New by-ids endpoints fetching many records in one request, each returning a lightweight projection
    • Definitions, levels, hints, instances, runs and users
    • *BasicDTO projections carry descriptive non-sensitive data only

Cleanup of removed service integrations

  • Removed the training-feedback-service integration as a result of the microservice's removal
    • Reference, trainee and summary graphs are no longer created alongside the training definition
    • The feedback service client and its configuration are removed
  • Removed the elasticsearch-service integration as a result of the microservice's removal
    • Training events and console commands are queried directly from OpenSearch
    • The elasticsearch-service client and its web client configuration are removed
    • The crczp-elasticsearch-documents dependency is dropped

Deployment and configuration

  • Event storage migrated from Elasticsearch to OpenSearch, to which the training-service now connects directly
  • Properties added
    • opensearch.protocol
    • opensearch.host
    • opensearch.port
    • sandbox-service.uri
  • Properties removed
    • openstack-server.uri - superseded by sandbox-service.uri
    • elasticsearch-service.uri
    • training-feedback-service.uri
  • Audit logger renamed to cz.cyberrange.platform.training.opensearch.events.training.logging.AuditService

Internal

  • Added multiple bulk query operations to improve request performance
    • Optimized listing training definitions, score export and the MITRE technique report
  • Consolidated the API model into a single DTO hierarchy
    • Shared level, definition, instance and run fields lifted into abstract base types
    • Made explicit which training definition DTOs contain levels via a dedicated type instead of a nullable levels field
    • Accessors, equality and string forms generated uniformly with Lombok across all DTOs
  • Whole repository reformatted to Google Java Format
  • Service tests reorganized into a unit package, with new tests for mappers, facades, core services, scoring and event serialization

Python backend

Click to expand changelog
  • Added NetBird VPN support for sandbox networks
    • New endpoint for fetching NetBird VPN connection details
    • Fixed an issue where an allocation request could wait indefinitely on stages
    • Fixed an orphaned NetBird access group left behind when a sandbox is deleted mid-provision
  • Added caching options for the GitHub sandbox-definition provider
    • FRESH_IMPORT cache mode is now validated and restricted to the GitHub provider
    • Docker/topology lookups now reflect the configured cache mode
  • Separated TCP, ICMP, and HTTP monitoring into distinct types
  • Windows sandbox hosts now default to ansible_shell_type=powershell for SSH communication
  • Fixed duplicate target names in Ansible inventory generation
  • Added pool ID and sandbox ID to generated ssh-keys.zip filenames
  • Fixed UTF-8 encoding and urlsafe base64 handling in JWT payload parsing
  • Fixed SMTP connections not being closed when STARTTLS/login fails in EmailManager
  • Migrated fully to Python 3.12+, dropping support for older Python versions
  • Replaced git-url-parse with the standard library urllib.parse (resolves CVE-2023-32758)
  • Resolved outstanding pylint, bandit, and mypy findings; raised the pylint score to 9.85/10
  • Locked the Redis client version to avoid a compatibility regression
  • Bumped and locked package dependencies

Infra

Click to expand changelog
  • Added configurable per-protocol Guacamole connection parameter overrides
  • Resolved multiple dependency CVEs in the Guacamole service (httpcore5, log4j2, logback, Netty/reactor-netty, swagger-ui/DOMPurify) and fixed tunnel handshake/exception-handling bugs
  • Mitre-technique service: dropped the separate linear/adaptive training endpoints in favor of a single unified training-techniques endpoint, as part of the platform-wide Adaptive Training retirement (breaking config change — endpoint key renamed in config.yml)
  • Added NetBird VPN support to the sandbox deployment
  • Added configuration for GitHub sandbox-definition topology caching
  • Added support for enabling network traffic forwarding (port mirroring) on sandbox definitions, for OpenStack (Neutron TaaS + OVN) or AWS (VPC Traffic Mirroring on Nitro instances) deployments
  • Removed the Adaptive Training, Adaptive Smart Assistant, and Elasticsearch Helm subcharts; added an OpenSearch values file to match the Training service's new integration
  • Added a manual workflow_dispatch trigger to the Helm package-and-upload CI workflow

🙌 Thanks to all contributors in this release:

Full Changelog: v1.1.0...v1.2.0