Back to Intelligence

CVE-2026-12663: Rockwell Automation ControlFLASH Missing Authentication Vulnerability — Detection and Remediation Guide for ICS Defenders

SA
Security Arsenal Team
September 4, 2026
9 min read

CISA has published ICS Advisory ICSA-26-246-03 disclosing CVE-2026-12663, a missing-authentication-for-critical-function vulnerability in Rockwell Automation ControlFLASH version V15.07 and earlier. ControlFLASH is the firmware-flashing utility used to update the firmware on Rockwell/Allen-Bradley programmable logic controllers and industrial control system (ICS) devices — a tool that sits at the heart of OT maintenance workflows across Critical Manufacturing, Energy, and Water/Wastewater operations worldwide.

The advisory language is blunt: successful exploitation gives an attacker the ability to run arbitrary commands or code on the target machine at the logged-in user's permission level. The root cause is a classic but dangerous installation defect — the ControlFLASH installer grants overly permissive write permissions to directories and resources it creates, which an attacker with local access can abuse to hijack the tool's execution flow (a missing-authentication-for-critical-function condition, CWE-306 class). With a CVSS v3 score of 7.3 (High), this is not a vulnerability to queue for the next maintenance window without compensating controls.

If your engineering workstations run ControlFLASH, treat this as an actionable OT defense item this week.

Technical Analysis

Affected Products

VendorProductAffected Versions
Rockwell AutomationControlFLASHV15.07 and earlier

Vulnerability Details

  • CVE: CVE-2026-12663
  • CVSS v3.1 Base Score: 7.3 (High)
  • Vulnerability Class: Missing Authentication for Critical Function
  • Root Cause (per CISA ICSA-26-246-03): The ControlFLASH installer grants write permissions (to the broader "Everyone"/Users-equivalent group, consistent with the advisory's truncated description "the installer grants write permissions to the 'E...'") on installed directories or files used by the application.

How the Attack Works — Defender's View

This class of flaw follows a well-understood local privilege abuse pattern on Windows engineering workstations:

  1. Install-time weakness: ControlFLASH installs binaries, support libraries, or update payload directories with world-writable or authenticated-users-writable ACLs.
  2. Planting the payload: An attacker with any local foothold on the workstation (a phished maintenance engineer account, a compromised IT-to-OT jump host, a contractor laptop) writes a malicious executable or DLL into the writable ControlFLASH path.
  3. Hijacked execution: When ControlFLASH next runs — often launched by a privileged engineer or via a maintenance script — it loads or executes the attacker's payload. Because the "critical function" (validation/loading of the executed component) lacks authentication or integrity checks, the malicious content is trusted implicitly.
  4. Code execution at user context: The attacker's commands run at the permission level of the user who launched ControlFLASH — on OT workstations this is frequently a local administrator or domain-level engineering account, making effective impact far higher than the base score suggests.

Why This Matters in OT

  • ControlFLASH machines are typically engineering workstations (EWS) with direct connectivity to PLCs — a compromised EWS is a pivot point straight into the control layer.
  • Firmware flashing is a trusted operation. Malicious code executing during or alongside a flash operation can intercept, alter, or disrupt firmware delivery to Allen-Bradley controllers — availability and integrity risk to the process itself.
  • These workstations are frequently excluded from aggressive EDR policies due to legacy application compatibility concerns, making them soft targets.

Exploitation Status

As of this writing, CISA has not added CVE-2026-12663 to the Known Exploited Vulnerabilities (KEV) catalog, and no public proof-of-concept has been confirmed. Exploitation requires local access to the host, which raises the bar — but local access to OT engineering workstations is precisely what initial-access brokers and ransomware affiliates sell. Do not interpret "requires local access" as "low urgency."

Detection & Response

The highest-fidelity detections for this flaw target the abuse pattern: unauthorized writes into the ControlFLASH installation path and unexpected child processes spawned by the ControlFLASH binary. Validate these in your environment before production deployment — legitimate firmware updates will produce ControlFLASH execution, so focus on the parent/child anomalies.

YAML
---
title: Suspicious Child Process Spawned by ControlFLASH
id: 3f8c2a71-9b4e-4d5a-a1c6-7e2f8b9d0c31
status: experimental
description: Detects ControlFLASH.exe spawning command interpreters, scripting engines, or other LOLBins, consistent with DLL/executable hijacking via the world-writable installation path described in CVE-2026-12663 (ICSA-26-246-03).
references:
  - https://www.cisa.gov/news-events/ics-advisories/icsa-26-246-03
  - https://attack.mitre.org/techniques/T1574/
author: Security Arsenal
date: 2026/03/15
tags:
  - attack.persistence
  - attack.privilege_escalation
  - attack.t1574.001
  - attack.t1574.002
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|endswith: '\ControlFLASH.exe'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\mshta.exe'
      - '\rundll32.exe'
      - '\regsvr32.exe'
      - '\wmic.exe'
      - '\schtasks.exe'
  condition: selection_parent and selection_child
falsepositives:
  - Vendor update wrappers legitimately invoking command shells during firmware operations (verify against Rockwell release notes before tuning out)
level: high
---
title: Executable or Script Written to ControlFLASH Installation Directory
id: 8d4e1b62-2c7f-4a38-b5d9-6f1a3c8e7b42
status: experimental
description: Detects creation of executables, DLLs, or scripts inside the ControlFLASH installation path by a process other than the Rockwell installer, indicating attempt to plant a hijack payload abusing permissive ACLs from CVE-2026-12663.
references:
  - https://www.cisa.gov/news-events/ics-advisories/icsa-26-246-03
  - https://attack.mitre.org/techniques/T1574/
author: Security Arsenal
date: 2026/03/15
tags:
  - attack.persistence
  - attack.t1574.001
logsource:
  category: file_event
  product: windows
detection:
  selection_path:
    TargetFilename|contains:
      - '\Rockwell Automation\ControlFLASH\'
      - '\ControlFLASH\bin\'
  selection_ext:
    TargetFilename|endswith:
      - '.exe'
      - '.dll'
      - '.bat'
      - '.ps1'
      - '.vbs'
  filter_installer:
    Image|contains:
      - '\msiexec.exe'
      - '\InstallShield\'
      - 'Rockwell'
  condition: selection_path and selection_ext and not filter_installer
falsepositives:
  - Legitimate ControlFLASH version upgrades or Rockwell patch installers (tune filter_installer to your deployment tooling, e.g., SCCM/Intune service accounts)
level: high
KQL — Microsoft Sentinel / Defender
// Hunt: Writes of executables/scripts into ControlFLASH paths + suspicious child processes
// Tables: DeviceFileEvents / DeviceProcessEvents (Defender for Endpoint)
let cfPath = dynamic([@"\Rockwell Automation\ControlFLASH\", @"\ControlFLASH\"]);
let suspiciousWrites = DeviceFileEvents
| where TimeGenerated > ago(7d)
| where FolderPath has_any (cfPath)
| where FileName has_any (".exe", ".dll", ".bat", ".ps1", ".vbs")
| where InitiatingProcessFileName !in~ ("msiexec.exe", "setup.exe")
| project WriteTime=TimeGenerated, DeviceName, FileName, FolderPath,
          InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessAccountName;
let suspiciousChildren = DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName =~ "ControlFLASH.exe"
| where FileName in~ ("cmd.exe","powershell.exe","pwsh.exe","wscript.exe",
                      "cscript.exe","mshta.exe","rundll32.exe","regsvr32.exe",
                      "wmic.exe","schtasks.exe")
| project ProcTime=TimeGenerated, DeviceName, FileName, ProcessCommandLine,
          AccountName, InitiatingProcessCommandLine;
suspiciousWrites
| union suspiciousChildren
| order by TimeGenerated desc
VQL — Velociraptor
-- CVE-2026-12663 hunt: audit ControlFLASH install path ACLs and look for
-- recently planted executables/DLLs in the writable directory
LET cf_paths = SELECT FullPath, Mtime, Btime, Size
FROM glob(globs=[
  'C:/Program Files (x86)/Rockwell Automation/ControlFLASH/**/*',
  'C:/Program Files/Rockwell Automation/ControlFLASH/**/*'
])
WHERE FullPath =~ '\.(exe|dll|bat|ps1|vbs)$'

SELECT FullPath, Mtime AS Modified, Btime AS Created, Size,
       -- Flag files written after the ControlFLASH install date as suspicious
       Btime > (SELECT min(Btime) AS InstallTime FROM cf_paths) + 86400 AS PlantedAfterInstall
FROM cf_paths
ORDER BY Btime DESC
PowerShell
# CVE-2026-12663 — Verify ControlFLASH version and audit installation-path ACLs
# Run on engineering workstations (requires local admin for ACL reads)

# 1) Detect installed ControlFLASH version
$cf = Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*",
      "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue |
      Where-Object { $_.DisplayName -like "*ControlFLASH*" } |
      Select-Object DisplayName, DisplayVersion, InstallLocation

if ($cf) {
    Write-Host "[+] Found: $($cf.DisplayName) v$($cf.DisplayVersion)" -ForegroundColor Cyan
    if ([version]$cf.DisplayVersion -le [version]"15.07") {
        Write-Host "[!] VULNERABLE to CVE-2026-12663 — upgrade required per ICSA-26-246-03" -ForegroundColor Red
    }
} else {
    Write-Host "[-] ControlFLASH not detected on this host." -ForegroundColor Green
}

# 2) Audit ACLs on the install path for Everyone/Users write access (the root cause)
$paths = @("C:\Program Files (x86)\Rockwell Automation\ControlFLASH",
           "C:\Program Files\Rockwell Automation\ControlFLASH") |
         Where-Object { Test-Path $_ }

foreach ($p in $paths) {
    $acl = Get-Acl $p
    $risky = $acl.Access | Where-Object {
        ($_.IdentityReference -match "Everyone|BUILTIN\\Users") -and
        ($_.FileSystemRights -match "Write|Modify|FullControl")
    }
    if ($risky) {
        Write-Host "[!] Overly permissive ACL on $p :" -ForegroundColor Red
        $risky | Format-Table IdentityReference, FileSystemRights, AccessControlType
        # Harden: remove write access for Everyone/Users (test before enforcing in production OT)
        # $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone","Write","Deny")
        # $acl.AddAccessRule($rule); Set-Acl $p $acl
    } else {
        Write-Host "[+] ACLs on $p appear restrictive." -ForegroundColor Green
    }
}

# 3) Inventory recent executable writes in the install path (potential planted payloads)
foreach ($p in $paths) {
    Get-ChildItem $p -Recurse -Include *.exe,*.dll,*.bat,*.ps1,*.vbs -ErrorAction SilentlyContinue |
        Where-Object { $_.CreationTime -gt (Get-Date).AddDays(-30) } |
        Select-Object FullName, CreationTime, @{n="Signer";e={(Get-AuthenticodeSignature $_.FullName).SignerCertificate.Subject}} |
        Format-Table -AutoSize
}

Remediation

  1. Upgrade ControlFLASH. Apply the fixed release from Rockwell Automation as directed in the vendor's product security advisory referenced by CISA ICSA-26-246-03 (https://www.cisa.gov/news-events/ics-advisories/icsa-26-246-03). Confirm post-upgrade that the installed version is greater than V15.07 and re-run the ACL audit above — verify the new installer no longer leaves world-writable directories.

  2. Correct ACLs immediately if patching is deferred. Remove Write/Modify/FullControl for Everyone and BUILTIN\Users from the ControlFLASH installation directory and its subdirectories. This directly closes the exploitation primitive without application downtime.

  3. Apply the principle of least privilege on engineering workstations. ControlFLASH should not be run under accounts with local admin rights for routine use, and engineering accounts should not hold broad domain privileges. Exploitation executes at the logged-in user's permission level — reducing that level reduces impact to near zero.

  4. Segment and gate access. EWS hosts running ControlFLASH should sit behind your OT DMZ, reachable only via managed jump hosts with MFA and session recording. Local access is the precondition for this CVE; choke off the paths that deliver it.

  5. Deploy application control. WDAC or AppLocker rules limiting execution to Rockwell-signed binaries in the ControlFLASH path neutralize planted-payload execution even if the ACL fix is missed.

  6. Enable file-system auditing on the ControlFLASH directory (Object Access / Audit File System with SACLs for write events by non-installer accounts) to feed the detections above.

  7. Monitor for KEV addition. Track CVE-2026-12663 against the CISA KEV catalog; if added, federal civilian agencies face BOD 22-01 remediation deadlines and private operators should treat it as emergency-change priority.

Rockwell Automation follows coordinated disclosure practices and CISA recommends the standard ICS mitigations: minimize network exposure of control systems, isolate them from the business network, and use secure remote access (updated VPNs with MFA) where remote connectivity is unavoidable.

Related Resources

Security Arsenal Alert Triage Automation AlertMonitor Platform Book a SOC Assessment platform Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.