New to Claude Skills? Learn how to install them →

Imukul975 on GitHub

Implementing Patch Management for OT Systems

Free

Streamline patch management for industrial control systems.

Get this skill

Free · Opens the source repo

What Implementing Patch Management for OT Systems does

Implementing Patch Management for OT Systems provides a structured approach to managing patches in Operational Technology (OT) environments, where traditional IT patching methods may lead to process disruptions or safety hazards. This skill is tailored for those overseeing industrial control systems (ICS), such as SCADA and PLCs, ensuring that patch management aligns with the unique requirements of these environments. The skill emphasizes risk-based prioritization, vendor compatibility testing, and the coordination of maintenance windows to minimize operational impact.

The workflow begins with establishing a formal patch management program that considers the distinct lifecycle of OT systems. Users can track patches, evaluate their impact, and document compensating controls for systems that cannot be patched. The skill also includes features for prioritizing patches based on risk assessments, which take into account factors like network exposure and the criticality of vulnerabilities. This ensures that the most pressing security issues are addressed promptly while maintaining operational integrity.

This skill is particularly beneficial for organizations that are either initiating a patch management strategy for OT systems or responding to critical advisories from ICS-CERT. It also supports compliance efforts for standards like NERC CIP-007-6 and IEC 62443, making it a valuable tool for those in regulated industries. By providing a comprehensive framework for patch management, users can enhance their cybersecurity posture while ensuring the safety and availability of their operational systems.

When to use it

Use this skill when establishing a patch management program for OT systems, responding to critical advisories, or preparing for compliance audits.

When not to use it

This skill is not suitable for IT-only patch management, emergency patching during active incidents, or firmware upgrades that alter PLC functionality.

What you can build with it

Establishing a New Patch Management Program

Use this skill to set up a formal patch management program for OT systems, ensuring safety and compliance from the start.

Responding to Critical Vulnerabilities

Quickly assess and prioritize patches in response to critical advisories from ICS-CERT to protect your OT environment.

Preparing for Compliance Audits

Leverage this skill to ensure your patch management practices meet the requirements of NERC CIP-007-6 or IEC 62443 during audits.

How to install Implementing Patch Management for OT Systems

View source

1. Install with the skills CLI

npx skills add mukul975/anthropic-cybersecurity-skills/implementing-patch-management-for-ot-systems --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by mukul975

Implementing Patch Management for OT Systems

When to Use

  • When establishing a formal OT patch management program for the first time
  • When responding to critical ICS-CERT advisories affecting deployed OT systems
  • When preparing for NERC CIP-007-6 or IEC 62443 patch management compliance audits
  • When planning patch deployment during limited maintenance windows in continuous operations
  • When evaluating compensating controls for systems that cannot be patched

Do not use for IT-only patch management without OT considerations, for emergency patching during active cyber incidents (see performing-ot-incident-response), or for firmware upgrades that change PLC functionality (requires separate change management).

Prerequisites

  • OT asset inventory with firmware/OS versions for all patchable systems
  • Vendor patch notification subscriptions (Siemens ProductCERT, Rockwell, Schneider, etc.)
  • Test/staging environment mirroring production OT systems for patch validation
  • Maintenance window schedule aligned with process shutdowns and turnarounds
  • Change management board approval process including operations and safety representatives

Workflow

Step 1: Establish OT Patch Management Program

Define the patch management lifecycle adapted for OT environments where availability and safety take priority over immediate vulnerability remediation.

#!/usr/bin/env python3
"""OT Patch Management Program Manager.

Tracks patches for OT systems, manages risk-based prioritization,
coordinates testing and deployment, and documents compensating
controls for unpatchable systems.
"""

import json
import sys
from collections import defaultdict
from dataclasses import dataclass, field, asdict
from datetime import datetime, timedelta
from enum import Enum


class PatchStatus(str, Enum):
    IDENTIFIED = "identified"
    EVALUATING = "evaluating"
    TESTING = "testing"
    APPROVED = "approved"
    SCHEDULED = "scheduled"
    DEPLOYED = "deployed"
    DEFERRED = "deferred"
    NOT_APPLICABLE = "not_applicable"


@dataclass
class OTPatch:
    patch_id: str
    vendor: str
    product: str
    affected_versions: str
    cve_ids: list
    cvss_score: float
    ics_cert_advisory: str
    description: str
    status: str = PatchStatus.IDENTIFIED
    identified_date: str = ""
    evaluation_deadline: str = ""  # 35 days per CIP-007
    test_date: str = ""
    deployment_date: str = ""
    affected_assets: list = field(default_factory=list)
    test_results: str = ""
    compensating_controls: str = ""
    risk_rating: str = ""
    maintenance_window: str = ""
    rollback_procedure: str = ""


class OTPatchManager:
    """Manages the OT patch lifecycle."""

    def __init__(self):
        self.patches = []
        self.assets = {}
        self.vendor_feeds = {}

    def add_patch(self, patch: OTPatch):
        """Register a new patch for tracking."""
        # Set evaluation deadline (35 calendar days per NERC CIP-007)
        if not patch.evaluation_deadline:
            identified = datetime.fromisoformat(patch.identified_date)
            patch.evaluation_deadline = (identified + timedelta(days=35)).isoformat()

        self.patches.append(patch)

    def prioritize_patches(self):
        """Risk-based prioritization for OT patches."""
        for patch in self.patches:
            if patch.status in (PatchStatus.DEPLOYED, PatchStatus.NOT_APPLICABLE):
                continue

            # OT-specific risk scoring
            score = patch.cvss_score

            # Increase priority for actively exploited vulnerabilities
            if "CISA KEV" in patch.ics_cert_advisory:
                score += 2.0

            # Increase priority for network-exposed OT systems
            for asset_id in patch.affected_assets:
                asset = self.assets.get(asset_id, {})
                if asset.get("network_exposed"):
                    score += 1.0
                if asset.get("purdue_level") in ("Level 0-1", "Level 2"):
                    score += 1.5

            score = min(score, 10.0)

            if score >= 9.0:
                patch.risk_rating = "critical"
            elif score >= 7.0:
                patch.risk_rating = "high"
            elif score >= 4.0:
                patch.risk_rating = "medium"
            else:
                patch.risk_rating = "low"

    def get_patches_needing_evaluation(self):
        """Get patches approaching evaluation deadline."""
        now = datetime.now()
        approaching = []
        for patch in self.patches:
            if patch.status == PatchStatus.IDENTIFIED:
                deadline = datetime.fromisoformat(patch.evaluation_deadline)
                days_remaining = (deadline - now).days
                if days_remaining <= 7:
                    approaching.append((patch, days_remaining))
        return sorted(approaching, key=lambda x: x[1])

    def defer_patch(self, patch_id, reason, compensating_controls):
        """Defer a patch with documented compensating controls."""
        for patch in self.patches:
            if patch.patch_id == patch_id:
                patch.status = PatchStatus.DEFERRED
                patch.compensating_controls = compensating_controls
                patch.test_results = f"Deferred: {reason}"
                break

    def generate_report(self):
        """Generate patch management status report."""
        self.prioritize_patches()

        report = []
        report.append("=" * 70)
        report.append("OT PATCH MANAGEMENT STATUS REPORT")
        report.append(f"Date: {datetime.now().isoformat()}")
        report.append("=" * 70)

        # Status summary
        status_counts = defaultdict(int)
        for p in self.patches:
            status_counts[p.status] += 1

        report.append("\nPATCH STATUS SUMMARY:")
        for status, count in status_counts.items():
            report.append(f"  {status}: {count}")

        # Approaching deadlines
        approaching = self.get_patches_needing_evaluation()
        if approaching:
            report.append("\nAPPROACHING EVALUATION DEADLINES:")
            for patch, days in approaching:
                report.append(f"  [{patch.patch_id}] {patch.description} - {days} days remaining")

        # Critical/High priority patches
        urgent = [p for p in self.patches
                  if p.risk_rating in ("critical", "high")
                  and p.status not in (PatchStatus.DEPLOYED, PatchStatus.NOT_APPLICABLE)]
        if urgent:
            report.append(f"\nURGENT PATCHES ({len(urgent)}):")
            for p in urgent:
                report.append(f"  [{p.patch_id}] [{p.risk_rating.upper()}] {p.description}")
                report.append(f"    CVEs: {', '.join(p.cve_ids)}")
                report.append(f"    Status: {p.status}")
                report.append(f"    Affected Assets: {len(p.affected_assets)}")

        # Deferred patches with compensating controls
        deferred = [p for p in self.patches if p.status == PatchStatus.DEFERRED]
        if deferred:
            report.append(f"\nDEFERRED PATCHES ({len(deferred)}):")
            for p in deferred:
                report.append(f"  [{p.patch_id}] {p.description}")
                report.append(f"    Reason: {p.test_results}")
                report.append(f"    Compensating Controls: {p.compensating_controls}")

        return "\n".join(report)


if __name__ == "__main__":
    manager = OTPatchManager()

    # Example patches
    manager.add_patch(OTPatch(
        patch_id="OT-PATCH-001",
        vendor="Siemens",
        product="SIMATIC S7-1500",
        affected_versions="< V3.0.1",
        cve_ids=["CVE-2023-44374"],
        cvss_score=8.8,
        ics_cert_advisory="ICSA-23-348-01",
        description="S7-1500 memory corruption via crafted packets",
        identified_date="2026-01-15",
        affected_assets=["PLC-01", "PLC-02", "PLC-03"],
    ))

    manager.add_patch(OTPatch(
        patch_id="OT-PATCH-002",
        vendor="Rockwell Automation",
        product="FactoryTalk View SE",
        affected_versions="< V13.0",
        cve_ids=["CVE-2024-21914"],
        cvss_score=7.5,
        ics_cert_advisory="ICSA-24-046-02",
        description="FactoryTalk View remote code execution",
        identified_date="2026-02-01",
        affected_assets=["HMI-01", "HMI-02"],
    ))

    print(manager.generate_report())

Step 2: Test Patches in Staging Environment

Never deploy patches directly to production OT systems. Use a test environment that mirrors production to validate patch compatibility.

# OT Patch Testing Procedure
patch_testing:
  environment:
    description: "Staging lab mirroring production OT architecture"
    components:
      - "Virtual PLC simulators matching production firmware"
      - "Test HMI stations with identical software versions"
      - "Test historian with representative data"
      - "Network configuration matching production VLANs/firewalls"

  test_cases:
    functional:
      - "PLC programs execute correctly after OS patch"
      - "HMI displays update with correct process values"
      - "Historian data collection continues uninterrupted"
      - "Alarm and event handling functions properly"
      - "Communication between PLCs maintains cycle time"
      - "Safety system trip tests pass (if SIS affected)"

    performance:
      - "PLC scan time remains within acceptable limits (<50ms increase)"
      - "HMI screen refresh rate unchanged"
      - "Historian collection interval maintained"
      - "Network latency between zones unchanged"

    compatibility:
      - "Third-party applications function correctly"
      - "OPC UA/DA connections establish successfully"
      - "Custom scripts and batch processes execute"
      - "Backup and restore procedures work"

    rollback:
      - "System can be reverted to pre-patch state"
      - "Rollback procedure documented and tested"
      - "Estimated rollback time: [N] minutes"

  documentation:
    required:
      - "Test plan with pass/fail criteria"
      - "Test execution results with screenshots"
      - "Performance measurements before and after"
      - "Sign-off by operations, engineering, and security"

Key Concepts

TermDefinition
Compensating ControlAlternative security measure applied when a patch cannot be deployed, such as firewall rules, IPS signatures, or network isolation
Vendor CompatibilityConfirmation from the OT vendor that a patch (especially OS patches) is compatible with their control system software
Maintenance WindowScheduled period for system modifications, aligned with process shutdowns or reduced-risk operational periods
Virtual PatchingDeploying IDS/IPS rules to detect and block exploitation attempts for known vulnerabilities without modifying the target system
Evaluation DeadlineNERC CIP-007-6 requires patch evaluation within 35 calendar days of availability
TurnaroundMajor scheduled shutdown of a process unit for maintenance, providing opportunity for extensive OT patching

Tools & Systems

  • WSUS/SCCM: Microsoft patch management for Windows-based OT systems (HMIs, historians, engineering workstations)
  • Siemens ProductCERT: Siemens security advisory service for industrial products
  • Claroty xDome: OT vulnerability management with patch availability tracking and risk scoring
  • Tripwire Enterprise: Configuration monitoring detecting unauthorized changes and tracking patch status

Output Format

OT Patch Management Report
============================
Reporting Period: YYYY-MM to YYYY-MM

PATCH STATUS:
  Identified: [N]
  Evaluating: [N]
  Testing: [N]
  Deployed: [N]
  Deferred: [N]

COMPLIANCE:
  Evaluated within 35 days: [N]/[N] (CIP-007-6 R2)
  Deployed or mitigated: [N]/[N]
  Deferred with compensating controls: [N]

Frequently asked questions about Implementing Patch Management for OT Systems

Similar skills