Skip to content

Threat Hunt Plan: Rockwell Automation RSLinx Classic EtherNet/IP Denial-of-Service — Malformed CIP Crash Hunt

Date: 2026-07-21 | Revision 1.0

Hunt Objective and Scope

This hunt seeks evidence that an adversary has probed, targeted, or triggered the EtherNet/IP server denial-of-service condition in Rockwell Automation RSLinx Classic (CVE-2020-13573) within the monitored environment. The vulnerability is an out-of-bounds read in the Common Industrial Protocol (CIP) handling of the EtherNet/IP server: an unauthenticated, network-adjacent attacker sends a Register Session request (ENIP encapsulation command 0x65) followed by a Send Unit Data message (0x70) in which the declared Address Item Length is smaller than the data that follows, driving RSLinx Classic into an unresponsive state that requires manual restart. Affected versions are 4.50.00 and earlier; the fix is 4.60.00 (patch BF31213 for interim relief).

In scope: all Windows hosts running RSLinx Classic (communication servers, engineering workstations, SCADA/HMI gateways) at Purdue Levels 2–3.5; the EtherNet/IP service on TCP 44818 (explicit messaging), UDP 2222 (implicit I/O), and UDP 44818 (ListIdentity discovery); network paths from the enterprise/IT boundary into OT zones; and the OT monitoring, endpoint, and network-telemetry platforms deployed in the environment. Out of scope: exploitation of the deeper Rockwell control stack (Logix controllers) except where RSLinx acts as the pivot.

Recommended time window: 90 days of retrospective review for endpoint and network telemetry, extended to the full retention window for any host that shows a confirmed RSLinx crash or repeated restart. RSLinx is frequently a long-lived process; use the longest available window for process-start attribution.

Hypotheses and Hunt Procedures

Hypothesis 1: An external or non-baseline internal host has sent EtherNet/IP traffic to an RSLinx Classic server on TCP 44818, observable as inbound connections to the RSLinx host on port 44818 from sources outside the normal HMI/SCADA/EWS baseline in network and endpoint telemetry.

MITRE ATT&CK: Initial Access / Execution | T0866 Exploitation of Remote Services | Sending crafted CIP requests to the exposed EtherNet/IP service is the delivery vector for the out-of-bounds-read DoS.

Also relevant: T0814 Denial of Service (ICS) — the intended impact; T0855 Unauthorized Command Message — the malformed CIP sequence on the wire.

Collection Queries:

CrowdStrike Falcon LogScale (CQL) — inbound connections to the RSLinx EtherNet/IP service:

#event_simpleName=NetworkConnectIP4 event_platform=Win
| LocalPort = 44818
| ConnectionDirection = 1
| table([@timestamp, aid, ComputerName, LocalAddressIP4, RemoteAddressIP4, RemotePort], limit=20000)

BPF / tcpdump — rolling capture of all EtherNet/IP traffic to/from the RSLinx host (run on a SPAN/TAP-fed sensor or the host itself):

tcpdump -i any -n -s 0 -G 3600 -C 100 -w '/pcap/enip_rslinx_%Y%m%d_%H%M%S.pcap' 'tcp port 44818 or udp port 2222 or udp port 44818'

Datadog Log Search (endpoint/network log-based visibility for the same connections):

source:windows @network.destination.port:44818
// time range: last 90 days; requires Windows network/firewall logs forwarded to Datadog

Datadog Live Process Monitoring (Infrastructure > Processes — confirm RSLinx is present on the host, not a log source):

command:RSLinx
// Fallback log search where Live Process Monitoring is not enabled: source:windows "RSLinx"

Windows Event IDs to collect (on the RSLinx host):

- Windows Filtering Platform 5156 (Filtering Platform Connection — allowed inbound) / 5157 (blocked) for destination port 44818
- Security 5031 (Windows Firewall blocked an application from accepting inbound connections) where applicable
PowerShell collection:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=5156} -MaxEvents 5000 | Where-Object { $_.Message -match '44818' } | Export-Csv -NoTypeInformation -Path C:\hunt\wfp_44818.csv

OT/ICS data collection:

OT Data Collection: Claroty xDome — Network > Communication > Communication Analysis; Side B attribute Manufacturer = "Rockwell Automation" (or Side B Port = 44818), Communication bucket Port = 44818, Time Frame = Past Quarter; export the flow set.
OT Data Collection: Dragos Platform — Communications Hub, filter flow attribute port = 44818 (and 2222) with destination endpoint zone = the RSLinx/OT zone; pivot each source to its asset record; export per-window PCAP from the Communications detail.
OT Data Collection: Nozomi Guardian/Vantage — run the N2QL link query below in Query, or via GET /api/open/query/do.
links | where protocol == "ethernetip" and port == 44818 | sort record_created_at asc
OT Data Collection: Tenable OT Security — Inventory > All Assets filter Vendor = Rockwell Automation, Device Type family = communication/EWS; Events page filter on EtherNet/IP/CIP protocol; export via the GraphQL /graphql endpoint (pyTenable) for scripted pulls.
OT Data Collection: Forescout eyeInspect — Command Center asset view filtered to CIP Identity = Rockwell; Alerts filtered to the EtherNet/IP protocol; export the matching flow/alert set.

Analysis Queries:

CrowdStrike Falcon LogScale (CQL) — external / non-RFC1918 sources reaching the RSLinx service (highest priority):

#event_simpleName=NetworkConnectIP4 event_platform=Win
| LocalPort = 44818
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8"])
| groupBy([ComputerName, RemoteAddressIP4], function=count(as=hits), limit=max)
| sort(hits, order=desc, limit=max)

CrowdStrike Falcon LogScale (CQL) — rarest source IPs to the service (surfaces new/first-seen talkers by ascending frequency):

#event_simpleName=NetworkConnectIP4 event_platform=Win
| LocalPort = 44818
| groupBy([RemoteAddressIP4, ComputerName], function=count(as=hits), limit=max)
| sort(hits, order=asc, limit=max)

Wireshark / tshark — isolate the malformed CIP sequence (RegisterSession followed by SendUnitData):

Wireshark display filter: enip.command == 0x0070 || enip.command == 0x0065
tshark -r enip_rslinx.pcap -Y "enip.command == 0x0070" -T fields -e frame.time -e ip.src -e ip.dst -e enip.command -e cip.service

Datadog Log Analytics — connection sources to the RSLinx service:

source:windows @network.destination.port:44818
// Use Table view; group by @network.client.ip; time range: last 90 days
// Equivalent to the CQL groupBy([RemoteAddressIP4]) analysis above

Datadog Monitor (one per hypothesis):

Type: Log Alert
Query: source:windows @network.destination.port:44818 -@network.client.ip:10.* -@network.client.ip:172.16.* -@network.client.ip:192.168.*
Evaluation window: last 10 minutes
Alert condition: count > 0
Message: "ALERT: External source reached RSLinx EtherNet/IP service (TCP 44818) — possible CVE-2020-13573 targeting @soc-ot-channel"
Prerequisites: Windows WFP/firewall connection logs forwarded to Datadog with network.destination.port + network.client.ip parsed

OT network / protocol analysis:

Nozomi N2QL — CIP command distribution to spot SendUnitData spikes from unexpected sources:
links | where protocol == "ethernetip" and port == 44818 | select from_ip to_ip bytes_count record_created_at | sort bytes_count desc
SNMP counter correlation on the switch port facing the RSLinx host (traffic burst around the suspected event):
snmpget -v2c -c <community> <switch_ip> IF-MIB::ifHCInOctets.<ifIndex> IF-MIB::ifInErrors.<ifIndex>

Hypothesis 2: An RSLinx Classic service has crashed or entered a crash-restart loop consistent with successful triggering of the out-of-bounds-read DoS, observable as RSLinx application-error events, Service Control Manager termination events, and repeated RSLINX.exe process starts in endpoint telemetry.

MITRE ATT&CK: Impair Process Control / Inhibit Response Function | T0814 Denial of Service | Loss of the RSLinx communication path severs HMI/SCADA visibility and control of downstream controllers.

Also relevant: T0816 Device Restart/Shutdown — the manual restart required to recover the service.

Collection Queries:

CrowdStrike Falcon LogScale (CQL) — RSLinx Classic process starts (each start after an unexpected stop indicates a recovery/restart):

#event_simpleName=ProcessRollup2 event_platform=Win
| ImageFileName=/\\RSLINX\.exe$/i
| table([@timestamp, aid, ComputerName, ImageFileName, CommandLine, ParentBaseFileName], limit=20000)

Windows Event IDs to collect (on the RSLinx host):

- Application Error 1000 (source "Application Error") where the faulting application is RSLINX.exe — direct crash evidence
- Windows Error Reporting 1001 — the WER record for the same fault
- Service Control Manager 7031 / 7034 — the RSLinx service terminated unexpectedly
- Service Control Manager 7036 — service entered the Stopped / Running state (restart tracking)
PowerShell collection:
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='Application Error'; Id=1000} -MaxEvents 5000 | Where-Object { $_.Message -match 'RSLINX' } | Export-Csv -NoTypeInformation -Path C:\hunt\rslinx_crash_1000.csv
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'; Id=7031,7034} -MaxEvents 5000 | Where-Object { $_.Message -match 'RSLinx' } | Export-Csv -NoTypeInformation -Path C:\hunt\rslinx_scm.csv

Datadog Log Search (Windows event logs for the crash/restart):

source:windows (@evt.id:1000 OR @evt.id:7031 OR @evt.id:7034) "RSLinx"
// time range: last 90 days; requires Windows Application + System event channels forwarded to Datadog

OT/ICS data collection:

OT Data Collection: Tenable OT Security — Events page filter on the RSLinx-host asset for connectivity-loss / dormant-asset events; correlate a State Query result showing loss of the RSLinx-served path.
OT Data Collection: Nozomi Guardian — alerts for node going offline / link drop on the RSLinx host around the suspected time.
nodes | where last_activity_time > days_ago(1) and type == "OT Server"

Analysis Queries:

CrowdStrike Falcon LogScale (CQL) — restart frequency per host (a high start count over the window is a crash-loop signal):

#event_simpleName=ProcessRollup2 event_platform=Win
| ImageFileName=/\\RSLINX\.exe$/i
| groupBy([ComputerName], function=count(as=starts), limit=max)
| sort(starts, order=desc, limit=max)

Windows Event Log analysis (PowerShell) — build a crash-and-restart timeline on a suspect host:

Get-WinEvent -FilterHashtable @{LogName='Application'; Id=1000} | Where-Object { $_.Message -match 'RSLINX' } | Select-Object TimeCreated, Id, @{n='Msg';e={$_.Message.Substring(0,120)}} | Sort-Object TimeCreated | Format-Table -AutoSize

Datadog Log Analytics — crash events over time, grouped by host:

source:windows (@evt.id:1000 OR @evt.id:7031 OR @evt.id:7034) "RSLinx"
// Use Timeseries view; group by host; time range: last 90 days — clustering of events on one host = crash-loop

Datadog Monitor:

Type: Log Alert
Query: source:windows (@evt.id:1000 OR @evt.id:7031 OR @evt.id:7034) "RSLinx"
Evaluation window: last 15 minutes
Alert condition: count > 2
Message: "ALERT: Repeated RSLinx Classic crash/restart events on a host — possible CVE-2020-13573 exploitation @soc-ot-channel"
Prerequisites: Windows Application + System event channels forwarded to Datadog with @evt.id parsed

OT network / protocol analysis:

Correlate each crash timestamp with Hypothesis-1 connection data: a crash within seconds of an inbound 44818 session from a non-baseline source is the confirmation pattern. Pull the matching PCAP window (Dragos/Claroty/Nozomi PCAP export) and decode the CIP sequence in Wireshark (enip.command == 0x0070) to confirm the undersized Address Item Length.

Hypothesis 3: An adversary has performed EtherNet/IP reconnaissance (ListIdentity sweeps / port scanning of 44818) to enumerate Rockwell/RSLinx hosts prior to exploitation, observable as one source touching many OT hosts on the EtherNet/IP ports.

MITRE ATT&CK: Discovery | T0846 Remote System Discovery | ListIdentity (ENIP 0x63) and 44818 sweeps enumerate reachable EtherNet/IP endpoints and their identity/firmware.

Also relevant: T0888 Remote System Information Discovery — the Identity object data returned by ListIdentity.

Collection Queries:

CrowdStrike Falcon LogScale (CQL) — fan-out detection: one remote source reaching many hosts on the EtherNet/IP ports:

#event_simpleName=NetworkConnectIP4 event_platform=Win
| in(LocalPort, values=[44818, 2222])
| groupBy([RemoteAddressIP4], function=count(ComputerName, distinct=true, as=distinctHosts), limit=max)
| sort(distinctHosts, order=desc, limit=max)

BPF / tcpdump — capture ListIdentity discovery (UDP 44818 broadcast + TCP session opens):

tcpdump -i any -n -s 0 -G 3600 -C 50 -w '/pcap/enip_recon_%Y%m%d_%H%M%S.pcap' 'udp port 44818 or (tcp port 44818 and tcp[tcpflags] & tcp-syn != 0)'

Datadog Log Search:

source:windows @network.destination.port:(44818 OR 2222)
// Use Table view; group by @network.client.ip; time range: last 90 days — a single client.ip touching many destination hosts = scan

OT/ICS data collection:

OT Data Collection: Armis Centrix — the ASQ port-scan and connection queries in the Analysis section below.
OT Data Collection: Dragos Platform — Communications Hub, source endpoint = single host, destination port = 44818, count distinct destination assets; a broad fan-out is a scan.

Analysis Queries:

Armis Centrix (ASQ) — connections into the OT zone on the EtherNet/IP service (set the time window in the UI picker; substitute the real boundary literal for <ot_boundary>):

in:ipConnections serverPort:44818 endpointB:(device:(boundary:"<ot_boundary>"))
in:ipConnections serverPort:44818,2222 endpointA:(networkLocation:"External") endpointB:(device:(boundary:"<ot_boundary>"))
in:activity type:"Port Scan Detected" device:(boundary:"<ot_boundary>")

Wireshark / tshark — count ListIdentity requests per source (recon volume):

tshark -r enip_recon.pcap -Y "enip.command == 0x0063" -T fields -e ip.src | sort | uniq -c | sort -rn

Nozomi N2QL — nodes issuing EtherNet/IP to many peers:

links | where protocol == "ethernetip" and port == 44818 | select from_ip to_ip | sort from_ip asc

Datadog Monitor:

Type: Log Alert
Query: source:windows @network.destination.port:44818
Evaluation window: last 5 minutes
Alert condition: count > 25
Message: "ALERT: Possible EtherNet/IP scan — high volume of TCP 44818 connections from a single source @soc-ot-channel"
Prerequisites: Windows/firewall connection logs forwarded to Datadog with network.client.ip + network.destination.port

Threat Actor Profile

Opportunistic / internet-scanning actors: RSLinx Classic instances are discoverable through internet scanning on TCP 44818, and researchers have found many thousands of exposed instances. A low-sophistication actor needs only a reachable service and a short crafted-packet script to trigger the crash; no authentication and no user interaction are required. Motivation is typically disruption or coercion rather than data theft.

ICS-focused threat groups: Rockwell EtherNet/IP is a documented target of OT-capable adversaries. Groups tracked for CIP/EtherNet/IP tradecraft (e.g., the actor cluster behind the 2026 BAUXITE Rockwell Logix campaign, and the PIPEDREAM/CODESYS toolset's CIP reconnaissance and command capabilities) demonstrate the sophistication to combine enumeration (ListIdentity), targeting, and protocol abuse. Such actors would use the DoS as a supporting effect — masking a change, forcing an operator to a fallback state, or degrading visibility during a larger operation.

Insider / third-party: an engineer, contractor, or vendor with legitimate OT network access could trigger the condition accidentally (malformed tooling, misconfigured scanner) or deliberately. Legitimate OT scanning (Tenable, Qualys, Nessus) with scope leaking into OT subnets can produce EtherNet/IP traffic that resembles reconnaissance — treat as a false-positive class to rule out, not to ignore.

Data Sources Required

Network: SPAN/TAP-fed PCAP at the IT/OT boundary and within OT zones; NetFlow; enterprise and OT firewall logs for TCP 44818 / UDP 2222 / UDP 44818.

Endpoint: CrowdStrike Falcon (NetworkConnectIP4, ProcessRollup2) on any Windows host running RSLinx; Windows Event Logs (Application, System, Security/WFP) via forwarder or Sysmon.

OT/ICS monitoring: Claroty xDome/CTD, Dragos Platform, Nozomi Guardian/Vantage, Tenable OT Security, Forescout eyeInspect, Armis Centrix — asset inventory (identify Rockwell/RSLinx hosts and firmware), Communication/flow analysis, and alerting on EtherNet/IP protocol.

Vendor/device: RSLinx Classic host inventory and installed version; switch SNMP interface counters for the RSLinx-facing port; SNMP trap receiver for coldStart/warmStart and linkDown/linkUp on OT network gear.

Detection Signatures

SIGMA rules span three logsource categories (Windows application log, Windows system log, and network_connection).

The first SIGMA rule targets the direct crash artifact — a Windows Application Error naming RSLINX.exe as the faulting application — because a successful out-of-bounds-read DoS terminates the process and generates Event ID 1000. It is scoped tightly to the RSLinx image name to avoid firing on unrelated application faults.

title: RSLinx Classic Application Crash (Possible CVE-2020-13573 DoS)
id: 6f6a1c2e-8b1d-4a2f-9d3c-1a2b3c4d5e6f
status: experimental
description: Detects a Windows Application Error where RSLINX.exe is the faulting application, consistent with the EtherNet/IP out-of-bounds-read denial of service.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-13573
author: 1898 & Co.
date: 2026-07-21
logsource:
product: windows
service: application
detection:
selection:
EventID: 1000
Data|contains: 'RSLINX.exe'
condition: selection
falsepositives:
- Non-malicious RSLinx crashes from unrelated software faults
level: high

The second SIGMA rule watches the Service Control Manager for unexpected termination of the RSLinx service (7031/7034). The out-of-bounds read leaves the service unresponsive; on hosts where RSLinx runs as a service, the SCM records the unexpected stop before any manual recovery.

title: RSLinx Classic Service Terminated Unexpectedly
id: 7a1b2c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d
status: experimental
description: Detects Service Control Manager events indicating the RSLinx service terminated unexpectedly, a recovery signal for the CVE-2020-13573 DoS.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-13573
author: 1898 & Co.
date: 2026-07-21
logsource:
product: windows
service: system
detection:
selection:
Provider_Name: 'Service Control Manager'
EventID:
- 7031
- 7034
keywords:
- 'RSLinx'
condition: selection and keywords
falsepositives:
- Planned service restarts during maintenance windows
level: medium

The third SIGMA rule targets the delivery vector at the network layer — an inbound connection to TCP 44818 from a source outside the RFC1918 ranges — using a network_connection logsource so it applies to Sysmon EID 3 or equivalent connection telemetry. It pairs with Hypothesis 1 and is deliberately broad on destination but narrow on external source to keep volume manageable.

title: External Inbound EtherNet/IP Connection to RSLinx Service
id: 8b2c3d4e-5f6a-4b7c-9d8e-0f1a2b3c4d5e
status: experimental
description: Detects inbound connections to TCP 44818 (EtherNet/IP explicit messaging) from a non-RFC1918 source, consistent with external targeting of an RSLinx host.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2020-13573
author: 1898 & Co.
date: 2026-07-21
logsource:
category: network_connection
product: windows
detection:
selection:
DestinationPort: 44818
Initiated: 'true'
filter_internal:
SourceIp|cidr:
- '10.0.0.0/8'
- '172.16.0.0/12'
- '192.168.0.0/16'
condition: selection and not filter_internal
falsepositives:
- Authorized external engineering access via a jump host or VPN egress IP
level: medium

Snort/Suricata rules (local SID range 1,000,000+):

alert tcp any any -> $OT_ASSETS 44818 (msg:"OT RSLinx Classic EtherNet/IP SendUnitData flood - possible CVE-2020-13573 DoS"; flow:to_server,established; content:"|70 00|"; offset:0; depth:2; detection_filter:track by_src, count 20, seconds 10; classtype:attempted-dos; reference:cve,2020-13573; sid:1000001; rev:1;)
alert udp any any -> $OT_ASSETS 44818 (msg:"OT EtherNet/IP ListIdentity scan - reconnaissance of Rockwell/RSLinx hosts"; content:"|63 00|"; offset:0; depth:2; threshold:type both, track by_src, count 5, seconds 60; classtype:attempted-recon; reference:cve,2020-13573; sid:1000002; rev:1;)

YARA rules (one file/disk, one process memory):

The first YARA rule targets exploit tooling dropped on disk — a proof-of-concept script or packet-builder that crafts the malformed CIP sequence. The condition requires the EtherNet/IP target port together with either RegisterSession/SendUnitData references or the "Address Item" field name that the exploit must undersize, so it fires on purpose-built RSLinx DoS tooling rather than on any file that merely mentions EtherNet/IP. The 2-of-branch threshold reduces false positives on benign automation scripts.

rule RSLinx_ENIP_DoS_Exploit_Tooling
{
meta:
description = "Detects on-disk EtherNet/IP CIP DoS proof-of-concept / packet-builder tooling targeting RSLinx Classic (CVE-2020-13573)"
author = "1898 & Co."
date = "2026-07-21"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2020-13573"
strings:
$port = "44818" ascii wide
$s1 = "RegisterSession" ascii wide nocase
$s2 = "SendUnitData" ascii wide nocase
$s3 = "Address Item" ascii wide nocase
$s4 = "cip" ascii wide nocase
$s5 = "enip" ascii wide nocase
$h1 = { 65 00 04 00 }
$h2 = { 70 00 }
condition:
$port and (2 of ($s1,$s2,$s3) or ($h1 and $h2) or ($s4 and $s5 and $h2))
}

The second YARA rule scans the memory of a live interpreter or tool process (for example python.exe running a PoC, scanned by PID) for the assembled ENIP encapsulation header bytes and the CIP/EtherNet/IP string constants that a running exploit holds in memory while building or replaying the malformed packet. It is intended for CrowdStrike RTR or Falcon Real Time Response execution against a suspect EWS/jump host, or bulk process scanning on that host; the condition combines the SendUnitData opcode bytes with at least one protocol string to avoid matching unrelated buffers.

rule RSLinx_ENIP_DoS_Process_Memory
{
meta:
description = "Detects in-memory EtherNet/IP CIP DoS packet-construction artifacts in a running exploit/interpreter process (CVE-2020-13573)"
author = "1898 & Co."
date = "2026-07-21"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2020-13573"
strings:
$h_reg = { 65 00 04 00 }
$h_sud = { 70 00 }
$s1 = "SendUnitData" ascii wide nocase
$s2 = "RegisterSession" ascii wide nocase
$s3 = "44818" ascii wide
$s4 = "EtherNet/IP" ascii wide nocase
condition:
($h_sud and $h_reg) and (1 of ($s1,$s2,$s3,$s4))
}

Classic YARA 4.5 process-memory scan (pass the PID as the positional target — there is no -p flag for the target):

yara RSLinx_ENIP_DoS_Process_Memory.yar <pid> >> C:\hunt\yara_mem_hits.txt

File-system scan:

yara -r RSLinx_ENIP_DoS_Exploit_Tooling.yar C:\ >> C:\hunt\yara_file_hits.txt

Indicators of Compromise

Network IOCs (behavioral, scoped to this hunt):

- Inbound TCP 44818 sessions to an RSLinx host from a source outside the sanctioned HMI/SCADA/EWS baseline, especially any non-RFC1918 source.
- EtherNet/IP ListIdentity requests (ENIP command 0x63) on UDP 44818, particularly broadcast sweeps or fan-out to many OT hosts from one source.
- A Send Unit Data message (ENIP command 0x70) whose CIP Address Item Length field is smaller than the trailing data.
- One source IP opening 44818 to many distinct OT hosts within a short window (scan fan-out).

Host IOCs:

- Windows Application Error (Event ID 1000) naming RSLINX.exe as the faulting application.
- Service Control Manager 7031/7034 for the RSLinx service; clustered 7036 stop/start pairs on one host.
- Multiple RSLINX.exe process starts on a single host over a short window (crash-restart loop).

OT/operational IOCs:

- Sudden loss of HMI/SCADA tag updates or controller connectivity coinciding with an RSLinx host event.
- Operator reports of RSLinx becoming unresponsive and requiring a manual service restart or host reboot.
- Switch coldStart/warmStart SNMP traps or linkDown/linkUp flaps on the RSLinx-facing port around the event.

False Positive Baseline

1. Sanctioned HMI/SCADA and engineering-workstation polling of RSLinx on TCP 44818 at a steady cadence — the normal traffic baseline; suppress known talker pairs.

2. Authorized OT vulnerability scanning (Tenable OT active query, Nessus against IT-side assets, Qualys) that touches EtherNet/IP ports — verify against the scan schedule and scanner source IPs before escalating.

3. Planned RSLinx service restarts during maintenance windows — correlate SCM 7036 stop/start and process starts against the change calendar.

4. RSLinx crashes from unrelated software faults, driver issues, or resource exhaustion — an Application Error 1000 without any preceding inbound 44818 session from a non-baseline source is likely non-malicious.

5. Backup, asset-management, or monitoring agents (e.g., Rockwell AssetCentre) that enumerate Rockwell devices over EtherNet/IP on a schedule — a known, recurring source pattern rather than an ad-hoc scan.

Escalation Criteria

1. An inbound TCP 44818 session to an RSLinx host from a non-RFC1918 or otherwise non-baseline source immediately followed (within seconds) by an RSLINX.exe crash (Event ID 1000) or SCM 7031/7034 — treat as confirmed exploitation and engage IR.

2. A confirmed malformed CIP sequence in captured traffic (RegisterSession then SendUnitData with an undersized Address Item Length) directed at an RSLinx host.

3. A crash-restart loop: three or more RSLINX.exe process starts and/or Application Error 1000 events on a single host within a short window.

4. A single source touching many OT hosts on 44818/2222 (scan fan-out) combined with any subsequent RSLinx crash.

5. Any YARA hit from RSLinx_ENIP_DoS_Exploit_Tooling against files on an EWS, jump host, or RSLinx server.

6. Any YARA hit from RSLinx_ENIP_DoS_Process_Memory against a running process on an OT-adjacent host.

7. Loss of controller visibility or an operator-confirmed process disruption coinciding with any of the above.

Hunt Completion Criteria and Reporting

The hunt is complete when: all Windows hosts running RSLinx Classic have been inventoried with their installed version (identifying every host at or below 4.50.00); network and endpoint telemetry for inbound 44818 traffic and RSLINX.exe crash/restart events has been reviewed across the 90-day window; the OT monitoring platforms in the environment have been queried for EtherNet/IP flows and RSLinx-host alerts; and every escalation-criterion match has been either dispositioned as a false positive or handed to incident response.

The report must contain: the RSLinx Classic host inventory with versions and patch status (4.60.00 / BF31213); a list of hosts exposed to non-baseline or external sources on 44818; any confirmed crashes or crash-loops with their correlated network sessions; disposition of each finding against the false-positive baseline; the exposure/segmentation gaps identified (any RSLinx service reachable from the enterprise or internet); and prioritized remediation recommendations (upgrade to 4.60.00, apply BF31213 where upgrade is deferred, restrict 44818 to sanctioned sources, and add the detection content from Section 5 as standing detections). Note any monitoring blind spots (zones without sensor coverage, encrypted paths, hosts without endpoint telemetry) as caveats on any negative finding.

Advisory IoC Reference

IOC Type IOC
CVE CVE-2020-13573 | CVSS v3.1 7.5 | RSLinx Classic <= 4.50.00 | Out-of-bounds read in EtherNet/IP CIP handling; malformed Register Session + Send Unit Data crashes RSLinx (DoS); fixed in 4.60.00 / patch BF31213
Threat Actor None specifically attributed to this CVE — opportunistic internet scanners and CIP-capable OT actors (e.g., BAUXITE Rockwell campaign, PIPEDREAM CIP tooling) are the plausible operators
Malware None associated with this vulnerability
Network IOC Inbound TCP 44818 to an RSLinx host from a non-baseline / non-RFC1918 source
Network IOC EtherNet/IP ListIdentity (ENIP command 0x63) sweep on UDP 44818
Network IOC ENIP Send Unit Data (command 0x70) with CIP Address Item Length smaller than trailing data
Network IOC One source opening TCP 44818 to many distinct OT hosts in a short window (scan fan-out)
File IOC None published in source material — hunt with the YARA rules in Section 5 (RSLinx_ENIP_DoS_Exploit_Tooling / RSLinx_ENIP_DoS_Process_Memory)
Behavioral Windows Application Error Event ID 1000 with faulting application RSLINX.exe
Behavioral Service Control Manager 7031/7034 for the RSLinx service; clustered 7036 stop/start pairs
Behavioral Multiple RSLINX.exe process starts on one host within a short window (crash-restart loop)
Behavioral RSLinx crash within seconds of an inbound 44818 session from a non-baseline source
Behavioral Loss of HMI/SCADA tag updates or controller connectivity coinciding with an RSLinx host event