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):
T0831Manipulation of Control,T0835Manipulate I/O Image,T0836Modify Parameter. - Denies the operator’s commands (DENIAL + PHYSICAL when the setpoint moves during the attack):
T0803Block Command Message,T0821Modify Controller Tasking,T0814Denial of Service. - Falsifies or withholds the operator’s view (OBSERVATION / DENIAL):
T0832Manipulation of View,T0856Spoof Reporting Message,T0804Block Reporting Message,T0815Denial of View. - Suppresses alarms (SUPPRESSION):
T0872Indicator Removal on Host,T0838Modify Alarm Settings,T0878Alarm 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; reconnaissanceT0840,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,
},
)