Sign In

ICS Security Simulator

Ground-truth labelled ICS attack datasets mapped to MITRE ATT&CK for ICS. Build training data for IDS, SIEM, SOC, and red/blue-team exercises without touching a real plant.

How it works

ICS Security runs as an overlay on a Virtual-SCADA simulation. You describe the plant in natural language and flag the attack campaign you want injected. The engine produces the clean-and-attack telemetry side-by-side with ground-truth labels mapped to MITRE ATT&CK for ICS technique ids — the exact data shape IDS / SIEM training pipelines need.

MITRE ATT&CK for ICS coverage

Every injected event carries a first-class technique ID, the tactic chain leading to it, and cross-references to CWE and CAPEC identifiers. Attack graphs are STIX-2.1 shaped. The engine implements a closed set of 32 techniques plus three reconnaissance techniques on the scan chain; a request for any other id is refused (HTTP 400 UNSUPPORTED_MITRE_TECHNIQUE) rather than faked as a label. Grouped by what each does to the simulated plant:

  • Moves the plant (CONTROL + PHYSICAL): T0831 Manipulation of Control, T0835 Manipulate I/O Image, T0836 Modify Parameter.
  • Denies the operator’s commands (DENIAL + PHYSICAL when the setpoint moves during the attack): T0803 Block Command Message, T0821 Modify Controller Tasking, T0814 Denial of Service.
  • Falsifies or withholds the operator’s view (OBSERVATION / DENIAL): T0832 Manipulation of View, T0856 Spoof Reporting Message, T0804 Block Reporting Message, T0815 Denial of View.
  • Suppresses alarms (SUPPRESSION): T0872 Indicator Removal on Host, T0838 Modify Alarm Settings, T0878 Alarm Suppression.
  • Event-only (INERT on the plant; real in the security-event, host-event and PLC register-image artefacts): T0802, T0807, T0809, T0816, T0819, T0830, T0846, T0853, T0855, T0857, T0858, T0859, T0866, T0867, T0869, T0873, T0877, T0882, T0889; reconnaissance T0840, T0842, T0888.

Stage-2 bundle additions

Alongside the classic seven artefacts, Stage-2 / Stage-2.1 runs ship several additional sealed deliverables:

  • privacy_evidence.json — source_provenance, ε/δ budget ledger, DP mechanism, per-site receipts (federated runs only).
  • baseline_detector_receipt.json — hash-pinned IsolationForest fit (training rows SHA, estimator params, feature names, tree thresholds SHA). Consumers re-fit deterministically from the receipt alone.
  • federation_receipts.json (federated only) — per-site DPHE receipts + aggregated summary + aggregation backend (mpc_additive_v1, tee_sgx_v1, trusted_v1).
  • unknown_physics_composition.json — composer output when the plant doesn't match a Tier-1/Tier-2 archetype. Includes the species graph, mass-balance invariants, and any DimensionChecker violations surfaced during composition.

Live attack streaming

Attack events stream over the same SSE endpoint as benign telemetry: GET /v1/client/runs/{run_id}/stream. Attack-window slices are also written to a traffic.pcapng segment index in the sealed bundle. Every injected event is Merkle-chained into a hash-chained operator journal — re-ordering, insertion, or deletion breaks the chain.

Deep-dive references

  • MITRE ATT&CK ICS techniques — every technique the platform supports, with the effect each has on the simulated plant (write side, read side, alarm side, event-only).
  • Bundle contents — the labelled artifacts (scada_telemetry, commands, alarms, ics_security, traffic_pcapng) the customer receives.
  • Validation Gate — the four-dimensional gate specifically penalises attack runs that produce zero anomaly labels.

Quickstart

from radmah_sdk import RadMah

sdk = RadMah(api_key="...", base_url="https://api.radmah.ai")

job = sdk.jobs.create(
    kind="simulate",
    engine="virtual_scada",
    seed=42,
    options={
        "description": (
            "Hospital HVAC plant with one chiller, two AHUs, three zone "
            "valves. Spoof a zone-temperature sensor (T0856)."
        ),
        "total_seconds": 120,
        "protocols": ["bacnet", "modbus"],
        "ics_security_enabled": True,
    },
)