CISA Says Log Everything. OT Protocols Can't. Here's What Actually Works.
Jeff Gray · July 13, 2026 · 18 min read
Analysis · Cyborama OT Intelligence · CISA GUIDANCE vs OT REALITY
The Problem
CISA's March 2025 guidance on Living Off The Land (LOTL) detection tells defenders:
"Implement detailed logging and aggregate logs in an out-of-band, centralized location."
"Establish and continuously maintain baselines of network, user, administrative, and application activity."
"Build or acquire automation (such as machine learning models) to continually review all logs."
Solid advice. For IT networks.
For OT networks? Fundamentally broken.
Why CISA Guidance Fails in OT
1. OT Protocols Don't Log by Design
CISA assumes every protocol logs every action.
OT reality:
| Protocol | Default Logging | What's Logged | What's NOT Logged |
|---|---|---|---|
| Modbus TCP | None | Nothing | Everything (reads, writes, who, when) |
| S7COMM | Optional | Sometimes logic uploads | Read operations, connection metadata |
| DNP3 | Minimal | Critical commands (if enabled) | Normal operations, query patterns |
| BACnet | None | Nothing | All property reads/writes |
| EtherNet/IP | None | Nothing | CIP commands, register access |
Why OT Protocols Don't Log
These protocols were designed in the 1970s-1990s when:
- Networks were air-gapped (no external threat model)
- Storage was expensive (logging = wasted space)
- Speed mattered more than security (logging adds latency)
CISA says: "Log everything"
OT reality: "We log nothing by default"
2. Baselining Requires Data You Don't Have
CISA guidance:
"Establish baselines of network, user, administrative, and application activity."
OT reality check:
Question: What's the normal Modbus read/write ratio for your SCADA system?
Defender: "I don't know."
Question: How many historian queries per hour is normal?
Defender: "I don't know."
Question: Which engineering workstations should connect to which PLCs?
Defender: "I don't know. The vendor does maintenance remotely sometimes?"
Why defenders don't know:
- No logging - Can't baseline what you don't measure
- No monitoring - OT networks often have zero visibility tools
- Legacy systems - Some PLCs been running 20+ years, nobody documented normal behavior
- Vendor access - Remote support sessions happen ad-hoc, no central tracking
CISA says: "Baseline first, alert on anomaly"
OT reality: "We don't know what normal looks like"
3. Logging Everything = Alert Fatigue (Unusable)
Let's do the math for a medium-sized facility:
Scenario: 100 PLCs, 10 SCADA workstations, 5 historians
Normal operations (per hour):
- SCADA polls each PLC every 1 second = 360,000 Modbus reads/hour
- Historians query every 10 seconds = 180,000 queries/hour
- Operators make manual adjustments = 50-100 writes/hour
If we log EVERY operation:
- 540,000+ log entries per hour
- 13 million per day
- 4.7 billion per year
If we alert on "unusual" activity:
- Vendor logs in for maintenance = 1,000+ alerts (new IP, unusual time, rapid commands)
- Operator batch update (legitimate) = 500+ alerts (write spike)
- Night shift personnel (legitimate) = 200+ alerts (unusual time pattern)
Result: 1,000+ false positive alerts per day. Defenders tune them out. Real attack gets buried.
CISA says: "Review all logs continuously"
OT reality: "Alert fatigue makes this unusable"
4. Legitimate Tools = Attack Tools (Can't Distinguish)
CISA guidance focuses on IT LOLBins (PowerShell, WMI, PsExec).
OT equivalent: Every legitimate tool IS an attack tool.
| Legitimate Activity | Attack Activity | How to Tell the Difference? |
|---|---|---|
| Vendor uploads new PLC logic | Attacker uploads malicious logic | You can't. Same protocol, same commands. |
| Engineer batch-updates setpoints | Attacker modifies setpoints | You can't. Same write commands. |
| Historian pulls data for dashboard | Attacker exfiltrates data | You can't. Same query pattern. |
| Operator connects via HMI | Attacker connects via captured session | You can't. Same credentials, same protocol. |
Why OT LOTL is Harder Than IT LOTL
IT: PowerShell spawning from Excel = suspicious
OT: Modbus write from engineering workstation = could be legitimate OR attack
No signatures. No malware. No obvious IOC.
CISA says: "Monitor LOLBins usage"
OT reality: "Every tool is a LOLBin. Legitimate and attack look identical."
What Actually Works (Given OT Protocol Limitations)
Since we CAN'T implement CISA guidance as written, here's what defenders CAN do:
1. Protocol-Level Anomaly Detection (Not Volume-Based)
Don't: Log every Modbus read (13 million/day = unusable)
Do: Log protocol ANOMALIES:
- Modbus write to register that's normally read-only
- S7COMM logic upload outside maintenance window
- DNP3 command from IP that's never issued commands before
- Historian query for unusual register range
# Example: Modbus anomaly detection (not volume logging)
IF write_command AND register IN read_only_list:
ALERT("Write to read-only register")
IF logic_upload AND time NOT IN maintenance_window:
ALERT("Logic upload outside maintenance window")
IF command_source_ip NOT IN whitelist:
ALERT("Command from unknown source")
Result: 10-50 alerts/day (actionable) instead of 1,000+ (noise)
2. Asset-Level Baselining (Not Activity-Level)
Don't: Try to baseline "normal" Modbus traffic (you don't have the data)
Do: Baseline WHAT devices exist and WHAT they're allowed to do:
- These 3 engineering workstations MAY upload PLC logic
- These 5 historian IPs MAY query registers
- These 10 SCADA workstations MAY issue write commands
- Everything else = suspicious
# Allowlist-based detection (no baseline needed)
IF upload_command AND source_ip NOT IN engineering_workstation_list:
ALERT("Logic upload from unauthorized source")
IF modbus_write AND source_ip NOT IN scada_workstation_list:
ALERT("Write command from unauthorized source")
Result: Detects LOTL without needing "normal" activity baseline
3. Time-Based + Source-Based Detection
Don't: Alert on every vendor remote access session (too many false positives)
Do: Alert on CONTEXT:
- Remote access at 3 AM (unusual time)
- Remote access from new IP without change ticket
- Remote access during incident response window (suspicious timing)
- Rapid commands during session (automated script vs human)
# Context-based detection
IF vendor_session AND time BETWEEN 00:00-05:00 AND no_maintenance_ticket:
ALERT("Vendor access at unusual time without ticket")
IF vendor_session AND commands_per_minute > 50:
ALERT("Automated command script detected")
Result: Catches LOTL abuse without flagging legitimate vendor work
4. Unidirectional Gateways for Historian/Monitoring
Don't: Let historians query production network bidirectionally (LOTL pivot path)
Do: Force historian data OUT via unidirectional gateway (data diode):
- Historians receive data (monitoring)
- Historians CANNOT send commands back (attack prevention)
Why this works:
- Attacker compromises historian (common LOTL target)
- Attacker tries to pivot to production PLC
- Unidirectional gateway blocks reverse traffic
- Attack stops at historian layer
Result: LOTL lateral movement blocked by physics (not signatures)
5. Authentication ABOVE Protocol Layer
Don't: Try to add auth to Modbus/S7COMM/DNP3 (protocols don't support it)
Do: Force ALL OT access through authenticated gateway:
- VPN with MFA for remote access
- Jump box with session recording for engineering access
- Separate VLAN for vendor access (isolated, monitored)
Why this works:
- Protocols still have zero auth (legacy compatibility preserved)
- But access to network requires MFA (LOTL attacker needs stolen VPN creds + 2FA)
- Session recording catches LOTL commands after the fact
Result: LOTL detection via access layer, not protocol layer
DIY LOTL Detection for OT (Practical Guide)
Step 1: Deploy Protocol-Aware Monitoring (30 days)
Tools (open source):
- Zeek - Modbus/DNP3/S7COMM protocol parsing
- Suricata - ICS-specific signatures
- NetworkMiner - Passive asset discovery
Goal: Learn what devices exist and what protocols they speak
Step 2: Build Allowlists (Not Baselines) (7 days)
Document:
- Which IPs are engineering workstations (may upload logic)
- Which IPs are SCADA/HMI (may issue writes)
- Which IPs are historians (may query registers)
- Which IPs are vendors (remote access)
Store in CSV:
IP,Role,Allowed_Actions,Maintenance_Window
XXX.XXX.XX.10,engineering_ws,modbus_write|s7_upload,any
XXX.XXX.XX.20,scada_hmi,modbus_write,any
XXX.XXX.XX.30,historian,modbus_read,any
XXX.XXX.XXX.XX,vendor_remote,s7_upload,Mon-Fri 08:00-17:00
Goal: Know who SHOULD be doing what (not "normal" volume)
Step 3: Deploy Anomaly Alerts (Not Volume Alerts) (7 days)
Alert rules (Zeek/Suricata):
# Write from unknown source
alert modbus any any -> $OT_NETWORK any (
msg:"Modbus write from unauthorized source";
flow:to_server;
modbus_func:write;
!src_ip:$ALLOWED_WRITE_IPS;
sid:1000001;
)
# Logic upload outside maintenance window
alert s7comm any any -> $OT_NETWORK any (
msg:"S7 logic upload outside maintenance window";
flow:to_server;
s7_func:upload;
time:!maintenance_window;
sid:1000002;
)
# Rapid command sequence (automation/script)
alert modbus any any -> $OT_NETWORK any (
msg:"Rapid Modbus commands detected (potential automation)";
flow:to_server;
threshold:type both,track by_src,count 50,seconds 60;
sid:1000003;
)
Goal: Catch LOTL without alert fatigue
Step 4: Session Recording for Engineering Access (14 days)
Deploy jump box for all engineering access:
- All PLC logic uploads go through jump box
- All vendor remote sessions go through jump box
- Jump box records every session (video + command log)
Why:
- Can't prevent LOTL commands (protocols allow them)
- CAN review what happened after incident
- Attacker knows they're being recorded (deterrent)
Goal: Post-incident forensics when LOTL is detected
Step 5: Unidirectional Gateway for Monitoring (30 days)
Force all historian/dashboard data through data diode:
- Production PLCs send data OUT only
- Historians/dashboards receive data (no reverse path)
- Monitoring preserved, attack path eliminated
Why:
- Historian compromise is common LOTL entry point
- Unidirectional gateway prevents pivot back to production
- Physics-based security (not signature-based)
Goal: Block LOTL lateral movement
The Honest Assessment
CISA guidance is correct for IT networks.
For OT networks:
- ✅ Principle is right - Baseline, log anomalies, detect LOTL
- ❌ Implementation is wrong - OT protocols can't do what CISA assumes
What defenders need:
- Protocol-aware monitoring (not generic logging)
- Allowlist-based detection (not volume baselines)
- Context-based alerts (not signature-based)
- Physics-based segmentation (unidirectional gateways)
The gap between CISA guidance and OT reality is real.
This guide bridges it.
Key Takeaways
- CISA says log everything → OT protocols log nothing by default
- CISA says baseline normal activity → OT defenders don't know normal (no data)
- CISA says alert on anomalies → OT logging everything = 13M alerts/day (unusable)
- CISA says detect LOLBins → OT: every tool is a LOLBin (legitimate = attack)
What Works
- Protocol anomaly detection (not volume)
- Allowlist-based detection (not baselines)
- Context-based alerts (time + source + command)
- Unidirectional monitoring (physics beats signatures)
- Authentication above protocol layer (gateway-based)
CISA guidance + OT protocol reality = this article.
References
- CISA Joint Guidance: Identifying and Mitigating Living Off the Land Techniques (March 2025)
https://www.cisa.gov/sites/default/files/2025-03/Joint-Guidance-Identifying-and-Mitigating-LOTL508.pdf - Modbus Protocol Specification - No authentication, no logging by design
- IEC 61850 / S7COMM - Optional logging, rarely enabled in practice
- DNP3 Secure Authentication - Exists but rarely deployed (legacy compatibility)
Analysis by Jeff Gray, Cyborama OT Intelligence
Published: July 13, 2026
Basis: CISA Joint Guidance + OT Protocol Reality
For defensive use by OT security professionals.
← Back to Control Systems Security · Previous: The 2% Problem