- Add validated mitre_attack frontmatter to all 754 skills (286 distinct
techniques), verified against MITRE ATT&CK v19.1 via the official
mitreattack-python library: 0 revoked, deprecated, or invalid IDs
- Curate precise per-skill technique IDs for forensics, malware-analysis,
threat-intel, and red-team skills (e.g. DCSync -> T1003.006,
Kerberoasting -> T1558.003, Pass-the-Ticket -> T1550.003)
- Reconcile v19.1 tactic restructuring: Defense Evasion split into
Stealth (TA0005) and Defense Impairment (TA0112); revoked T1562.*
family and T1070.001/.002 remapped to active equivalents (T1685.*)
- Normalize word-split tags across 35 skills (remove filename-derived
stopword tags, add semantic cybersecurity tags)
- Add api-reference.md for 3 skills that were missing it
- Update README ATT&CK section with accurate v19.1 tactic distribution
This skill covers performing vulnerability assessments in OT environments using the Claroty xDome platform for comprehensive asset discovery, risk scoring, vulnerability correlation, and remediation prioritization. It addresses passive vulnerability identification through traffic analysis, active safe querying of OT devices, integration with CVE databases and ICS-CERT advisories, and risk-based prioritization that accounts for operational impact and compensating controls.
cybersecurity
ot-ics-security
ot-security
ics
scada
industrial-control
iec62443
vulnerability-assessment
claroty
1.0.0
mahipal
Apache-2.0
PR.IR-01
DE.CM-01
ID.AM-05
GV.OC-02
T1078
T1190
T1059
T0816
T0836
Performing OT Vulnerability Assessment with Claroty
When to Use
When conducting scheduled OT vulnerability assessments per IEC 62443 or NERC CIP requirements
When deploying Claroty xDome for the first time and performing initial asset discovery and risk assessment
When correlating newly published ICS-CERT advisories against your OT asset inventory
When prioritizing OT vulnerability remediation with limited maintenance windows
When generating compliance evidence for CIP-010-4 vulnerability assessment requirements
Do not use for active vulnerability scanning of PLCs and safety systems (see performing-ot-network-security-assessment for passive approaches), for IT-only vulnerability management (see standard vulnerability scanners), or for penetration testing (see performing-ics-penetration-testing).
Prerequisites
Claroty xDome or CTD (Continuous Threat Detection) deployed with sensors on OT network
Network SPAN/TAP access for passive asset discovery
CISA ICS-CERT advisory subscription for vulnerability tracking
Asset inventory with firmware versions for all OT devices
Change management process for patch deployment during maintenance windows
Workflow
Step 1: Configure Asset Discovery and Vulnerability Correlation
Configure Claroty to perform passive and active-safe discovery to build complete asset inventory with firmware versions for vulnerability correlation.
#!/usr/bin/env python3"""OT Vulnerability Assessment Manager.
Correlates OT asset inventory with ICS-CERT advisories and CVE data
to identify, prioritize, and track OT vulnerabilities. Designed to
integrate with Claroty xDome API or standalone operation.
"""importjsonimportsysfromcollectionsimportdefaultdictfromdataclassesimportdataclass,field,asdictfromdatetimeimportdatetimeimportrequests@dataclassclassOTAsset:asset_id:strname:strvendor:strmodel:strfirmware_version:strasset_type:str# PLC, HMI, RTU, historian, switch, etc.purdue_level:strip_address:strprotocol:strcriticality:str# critical, high, medium, lowzone:str@dataclassclassOTVulnerability:vuln_id:strcve_id:strtitle:strseverity:str# critical, high, medium, lowcvss_score:floataffected_vendor:straffected_product:straffected_versions:strdescription:strics_cert_advisory:str=""remediation:str=""patch_available:bool=Falsecompensating_controls:str=""@dataclassclassRiskAssessment:asset:OTAssetvulnerability:OTVulnerabilityrisk_score:float=0.0risk_rating:str=""exploitability:str=""operational_impact:str=""compensating_controls:list=field(default_factory=list)remediation_priority:int=0classOTVulnerabilityAssessment:"""OT vulnerability assessment and prioritization engine."""def__init__(self):self.assets=[]self.vulnerabilities=[]self.risk_assessments=[]defload_assets(self,assets_data):"""Load asset inventory from Claroty export or manual inventory."""forainassets_data:self.assets.append(OTAsset(**a))print(f"[*] Loaded {len(self.assets)} OT assets")deffetch_ics_advisories(self):"""Fetch latest ICS-CERT advisories from CISA."""print("[*] Fetching ICS-CERT advisories from CISA...")try:# CISA Known Exploited Vulnerabilities catalogurl="https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"resp=requests.get(url,timeout=30)resp.raise_for_status()data=resp.json()ics_vulns=[]forvulnindata.get("vulnerabilities",[]):# Filter for ICS-relevant vendorsics_vendors=["siemens","schneider","rockwell","honeywell","abb","ge","emerson","yokogawa","omron","mitsubishi","phoenix","moxa","advantech",]vendor=vuln.get("vendorProject","").lower()ifany(vinvendorforvinics_vendors):ics_vulns.append(vuln)print(f" Found {len(ics_vulns)} ICS-relevant known exploited vulnerabilities")returnics_vulnsexceptExceptionase:print(f"[WARN] Could not fetch advisories: {e}")return[]defcorrelate_vulnerabilities(self):"""Match vulnerabilities to assets based on vendor/model/firmware."""print("[*] Correlating vulnerabilities to assets...")forassetinself.assets:forvulninself.vulnerabilities:if(vuln.affected_vendor.lower()inasset.vendor.lower()andvuln.affected_product.lower()inasset.model.lower()):# Check firmware version if specifiedra=RiskAssessment(asset=asset,vulnerability=vuln)self._calculate_risk_score(ra)self.risk_assessments.append(ra)print(f" Correlated {len(self.risk_assessments)} asset-vulnerability pairs")def_calculate_risk_score(self,ra):"""Calculate OT-specific risk score considering operational impact."""# Base score from CVSSbase=ra.vulnerability.cvss_score# Criticality multiplier based on asset functioncriticality_weights={"critical":1.5,# SIS, safety systems"high":1.3,# PLCs, primary control"medium":1.0,# HMIs, historians"low":0.7,# non-critical support systems}criticality=criticality_weights.get(ra.asset.criticality,1.0)# Purdue level proximity factor (lower levels = higher risk)level_weights={"Level 0-1":1.5,"Level 2":1.3,"Level 3":1.0,"Level 3.5":0.8,"Level 4":0.6,}level_factor=level_weights.get(ra.asset.purdue_level,1.0)# Network exposure reduction if compensating controls existcomp_reduction=0.8ifra.compensating_controlselse1.0ra.risk_score=round(base*criticality*level_factor*comp_reduction,1)ra.risk_score=min(ra.risk_score,10.0)ifra.risk_score>=9.0:ra.risk_rating="critical"ra.remediation_priority=1elifra.risk_score>=7.0:ra.risk_rating="high"ra.remediation_priority=2elifra.risk_score>=4.0:ra.risk_rating="medium"ra.remediation_priority=3else:ra.risk_rating="low"ra.remediation_priority=4defgenerate_report(self):"""Generate vulnerability assessment report."""# Sort by risk score descendingsorted_ra=sorted(self.risk_assessments,key=lambdax:-x.risk_score)report=[]report.append("="*70)report.append("OT VULNERABILITY ASSESSMENT REPORT")report.append(f"Date: {datetime.now().isoformat()}")report.append(f"Assets: {len(self.assets)} | Vulnerabilities: {len(self.vulnerabilities)}")report.append(f"Risk Assessments: {len(self.risk_assessments)}")report.append("="*70)forsevin["critical","high","medium","low"]:findings=[raforrainsorted_raifra.risk_rating==sev]iffindings:report.append(f"\n--- {sev.upper()} RISK ({len(findings)}) ---")forrainfindings[:10]:report.append(f"\n Risk Score: {ra.risk_score}/10.0")report.append(f" Asset: {ra.asset.name} ({ra.asset.vendor}{ra.asset.model})")report.append(f" Zone: {ra.asset.zone} ({ra.asset.purdue_level})")report.append(f" CVE: {ra.vulnerability.cve_id} (CVSS: {ra.vulnerability.cvss_score})")report.append(f" Title: {ra.vulnerability.title}")ifra.vulnerability.patch_available:report.append(f" Patch: Available - schedule for next maintenance window")else:report.append(f" Patch: Not available - apply compensating controls")return"\n".join(report)defexport_json(self,output_file):"""Export assessment to JSON."""data={"assessment_date":datetime.now().isoformat(),"asset_count":len(self.assets),"vulnerability_count":len(self.vulnerabilities),"risk_assessments":[{"asset_name":ra.asset.name,"asset_ip":ra.asset.ip_address,"cve":ra.vulnerability.cve_id,"risk_score":ra.risk_score,"risk_rating":ra.risk_rating,"priority":ra.remediation_priority,}forrainsorted(self.risk_assessments,key=lambdax:-x.risk_score)],}withopen(output_file,"w")asf:json.dump(data,f,indent=2)if__name__=="__main__":assessment=OTVulnerabilityAssessment()advisories=assessment.fetch_ics_advisories()print(f"Fetched {len(advisories)} ICS advisories from CISA KEV catalog")
Key Concepts
Term
Definition
Claroty xDome
Cyber-physical systems protection platform providing asset discovery, vulnerability management, and threat detection for OT/IoT environments
Passive Discovery
Identifying OT assets by analyzing network traffic without sending any packets, safe for production environments
Safe Active Query
Querying OT devices using native industrial protocols at safe rates to collect detailed asset information without disrupting operations
OT Risk Score
Risk rating that factors CVSS base score, asset criticality, Purdue level, and compensating controls for OT-appropriate prioritization
ICS-CERT Advisory
CISA-published security advisories for industrial control system vulnerabilities with vendor-specific remediation guidance
Virtual Patching
Deploying IPS/firewall rules to block exploitation of known vulnerabilities when firmware patches cannot be immediately applied