Flow-Through
OT / ICS SecurityEtherNet/IP

Attacking and Defending an EtherNet/IP Water-Treatment Controller

Three classes of attack on one industrial protocol. Each one runs against a realistic controller, and each one traces to the same unauthenticated trust model, with a control that closes it.

One protocol, a family of exposures. EtherNet/IP with CIP inherits a whole family of attacks the moment it runs on a flat, unauthenticated network.

One root cause. The protocol trusts anyone who can reach it. Every core attack here works by speaking the protocol exactly as designed. That openness is the whole exposure.

Real evidence. The live demonstration is a genuine packet capture against a running controller. Every value on screen is a real reading.

Fictional and contained. A fictional plant and a fictional vendor, on a loopback lab that stays sealed off from the real world.

ClassWhat the attacker achievesReal-world anchorHeadline remediation
Deceive, false data injectionPoisons the process and hides it from the operatorOldsmar, FL (2021)Independent instrumentation plus display-versus-truth monitoring
Seize, ransomware lockoutCorrupts every setpoint, then locks operators out of the fixLogicLocker (2017), EKANS (2020)Write allow-listing plus connection-count alerting
Destroy, denial of serviceTakes the controller offline with one unauthenticated commandEtherNet/IP DoS advisory classRestrict the reset service, patch the controller firmware
See it live. Attack 1 is a fully captured, playable demonstration. Open the water SCADA console and press Simulate attack.

The environment under test

The plant is a small conventional water-treatment works, from intake through coagulation and filtration to chlorination and distribution. It runs on one CompactLogix-class programmable logic controller. CompactLogix is Allen-Bradley and Rockwell Automation's controller line, a familiar sight in water and wastewater plants, so the target stays representative rather than exotic. It scans remote I/O racks in each treatment area.

The protocol is EtherNet/IP carrying CIP, the native protocol of the Rockwell ecosystem. Explicit request-and-response messaging runs on port 44818, and cyclic I/O runs on UDP 2222. The controller exposes its data as numbered byte blocks called assemblies. Assembly 100 carries the true sensor readings and assembly 150 the writable setpoints and actuator commands. Assembly 154 is the HMI data table the operator's screen reads.

The root cause, stated once. CIP was designed for an isolated, trusted network, so it grants full read and write access to any host that can reach it. Anyone who can route to port 44818 can read every value and write every setpoint. In OT security this is called living off the land: the exposure is the protocol's trust model sitting on a flat network, open to whoever arrives.

Methodology, and why the evidence holds up

The demonstration runs on a real controller. A real EtherNet/IP controller serves the protocol on loopback. A physics simulation models the plant, so a real write to a setpoint moves a real physical variable such as chlorine residual or distribution pressure, with realistic time lags. A driver performs the attack over the actual protocol, every packet is captured, and a converter turns the capture into the replay. A ship gate publishes only a genuine capture.

Every number in the live demo is a reading logged from that running lab under a real captured session. During development, the first capture recorded a run where the controller turned the writes away. That recording was set aside, because the demo carries only attacks that land.

Attack 1, deceive by false data injection

Status: fully captured and live in the demonstration.

Three unauthenticated CIP SetAttributeSingle writes, in sequence. The first drives the chlorine dose setpoint (assembly 150) to roughly 15 mg/L, and the dosing pump obeys, so the true residual climbs toward a toxic level. The second is the load-bearing move: the residual analyzer reading (assembly 154) is forced to a safe-looking value and held there, so the operator's screen keeps showing a calm number while reality diverges. In the captured run the truth reached 11.14 mg/L while the screen read 1.02. The third stops the high-lift pump, and distribution pressure collapses from 380 to 54 kPa, which fires a global alarm.

The lesson for a defender lands in one line. The alarms that fire are the ones the attacker left alone, and the reading he froze is the very one that certifies the water safe to drink.

Real-world anchor. This reproduces the mechanism of the Oldsmar, Florida incident of February 2021, with the differences stated up front. Oldsmar's real chemical was sodium hydroxide rather than chlorine. Its attribution was later disputed and may trace to operator error. And this study adds one move Oldsmar lacked, freezing the sensor, which is the Stuxnet false-data pattern.

MITRE ATT&CK for ICS: Remote System Discovery (T0846), Unauthorized Command Message (T0855), Modify Parameter (T0836), Spoof Reporting Message (T0856), Manipulation of View (T0832).

Remediation. Give the plant an independent residual analyzer, or a comparator that watches the displayed value against an independent truth source. That turns a hidden false-data injection into an alarm. Add write allow-listing at the controller and the boundary, plus process detections that fire when a setpoint leaves its safe band or when a displayed value stays flat while the truth moves.

Attack 2, seize by ransomware lockout

Status: mechanism verified against the controller. Documented profile.

A ransomware operator goes past breaking the process. It holds the process hostage and strips the owner's ability to recover. Against this controller that is two moves. The first is mass process corruption: a burst of writes drives every setpoint to an unsafe value at once, chlorine maxed and pumps stopped, then freezes the HMI so the operator screen still reads normal. The second is operator lockout by connection exhaustion: the controller accepts a fixed number of explicit CIP connections, verified in its configuration as six. The attacker opens and holds every slot, so when the operator's HMI or an engineer's laptop reaches for the controller to reverse the damage, the controller has no slot left to give it.

The plant sits in an unsafe state its own operators can no longer reach, sometimes with a ransom note written into a spare data-table region. The finite connection pool is the key fact. A resource an operator rarely considers becomes the lockout mechanism.

Real-world anchor. LogicLocker (Georgia Tech, 2017) was a proof-of-concept ransomware for PLCs that locked the controller and held its I/O hostage. EKANS and Snake (2020) was real-world ransomware with ICS-process awareness. This is the same idea expressed in CIP: seize the process, then hold recovery out of reach.

MITRE ATT&CK for ICS: Unauthorized Command Message (T0855), Denial of Control (T0813), Loss of Control (T0827), Loss of Availability (T0826).

Remediation. Allow-list and rate-limit who may open CIP connections at the conduit, and alarm when the connection pool saturates, especially from a new source. Adopt CIP Security so a rogue host is turned away before it opens a session. Keep tested offline backups plus an out-of-band recovery runbook, so a hostage plant comes back even when the network path is gone.

Attack 3, destroy by denial of service

Status: one vulnerability path verified against the controller, plus a class-level risk on the same surface. Documented profile.

Path A, unauthenticated device reset. The CIP Identity object implements a Reset service, with reset types for a power-cycle and a factory reset. On this controller the service answers any host that can register a session, and session registration is open. That host can command the device to reset. On production hardware the reset reboots or factory-defaults the controller, dropping the entire plant's control and I/O from a single unauthenticated packet.

Path B, memory safety in the stack itself. The same unauthenticated surface that carries the reset service is parsed by native code, and a parser defect there is a remotely triggerable denial of service with nothing in the way. Stacks of this class are a standing target of the practice's fuzzing, and any result goes to the maintainer first. The takeaway is that the surface carries memory-safety risk as well as the reset.

MITRE ATT&CK for ICS: Device Restart/Shutdown (T0816), Denial of Service (T0814), Loss of Availability (T0826), Loss of Protection (T0837).

Remediation. Restrict the reset service and keep it inside the engineering zone. Segment so explicit messaging answers only the engineering zone. Patch to the fixed firmware version, and treat unauthenticated-DoS advisories for the controller family as high priority. Adopt CIP Security to close the unauthenticated surface both paths rely on.

The common root cause, and the remediation roadmap

All three attacks share one enabler, and a small set of controls closes all three.

1. Control who can reach the controller. Segment the network on the Purdue model into IEC 62443 zones and conduits. The control zone that holds the PLC answers only a defined engineering zone, over a single defined conduit, and stays closed to everything else. Most of these attacks stall at the first step once the rogue host has no route to port 44818.

2. Authenticate the protocol. CIP Security adds authentication and integrity to CIP. It is the direct fix for a protocol that trusts anyone who can reach it, and it closes all three attack paths at the source.

3. Trust more than one channel for a safety number. Independent instrumentation and a display-versus-truth comparator make a false-data injection visible.

4. Monitor both the wire and the physics. Network detections flag unauthorized writes, unexpected sessions, connection-pool saturation, and reset commands. Process detections flag values that leave their safe band or that contradict an independent truth. Together they buy the minutes a human needs to reverse an attack, which is exactly what happened at Oldsmar.

5. Plan to recover. Tested offline backups and out-of-band controller access, backed by a written runbook, turn a hostage or bricked controller into a routine recovery.

These map cleanly onto IEC 62443, its zones and conduits, its seven foundational requirements and a target security level.

Scope and limits

The plant and the vendor are fictional, and the whole thing runs on loopback. The protocol behaviour and the physics response are real. The hardware is an open-source stand-in for a commercial PLC.Attack 1 is a fully captured, live demonstration. Attacks 2 and 3 are documented profiles, grounded in facts verified from the controller's own configuration and source. Their live weaponization stays off this page.The Oldsmar attribution is contested. This study demonstrates a mechanism, and stops short of claiming a confirmed intrusion.The memory-safety path in Attack 3 is described at the class level.

What this demonstrates

One protocol carries three distinct classes of attack, each reproduced against a realistic controller and each traced back to the same unauthenticated trust model, with a control that closes it. The engineering worth here is the path itself. A captured packet becomes a named technique, and the named technique becomes a specific, standards-mapped fix.