Skip to main content
Call Eric:863-698-8266
CURRYCONTROLS.COMControls & Automation Knowledge Hub
ReferenceCybersecurityPLCSCADAProgrammingAlarms

Program Change Detection

Knowing when a controller program changed and whether it was supposed to: change counters and signatures the SCADA can alarm on, scheduled compares, audit logs, mode and network monitoring, what each catches, and what to do when one fires.

9 min readUpdated Sep 5, 2026Published Sep 5, 2026By Eric Sullivan

The short answer

Program Change Detection

Controllers can tell you when their program changes: most report a change counter, a program checksum, or a signature that the SCADA can poll and alarm on when it moves, and many keep an audit log of online edits and downloads with the user and the time. Version control products upload each controller on a schedule, compare it with the stored project, and record the differences with who and when. Keyswitch and mode monitoring alarms when a controller is placed in program or remote-program mode. Passive network monitoring recognizes the vendor protocol messages that carry a download or an online edit and alerts as they happen. Each catches something the others miss, and the practice is to run at least two: the signature alarm in the SCADA, which costs one tag per controller, and either scheduled compares or network monitoring. A detection is matched against the change records, and one that matches nothing is treated as an incident.

Key points

  • Poll the controller change counter or signature from the SCADA and alarm when it changes; one tag per controller.
  • Scheduled uploads and compares record what changed; the signature alarm only says that something did.
  • Controller audit logs name the user and the time where the platform keeps them; forward them.
  • Mode and keyswitch monitoring catches the controller being opened for editing, before the edit.
  • Network monitoring sees the download on the wire, whoever sent it and whatever the controller logged.
  • A detection that matches no change record is an incident until it is explained.

Why it matters

The attacks that have damaged physical processes did it by changing what the controller does, and the controller did exactly what its new program said. An unauthorized program change is also what a well-meaning technician does at 2 a.m. to get a pump running, and what an integrator does during a support session that nobody recorded. All three look the same to the process; the difference is whether anyone knows. Detection turns a silent change into an event with a time, which is the beginning of both an investigation and a proper change record.

The methods

MethodWhat it catchesWhat it missesCost
Change counter or signature polled by the SCADAAny change to the program or configuration that changes the value, within one pollWhat changed and who; some platforms do not change the value on every kind of editOne tag and one alarm per controller
Scheduled upload and compareExactly what changed, in the program, with a recordChanges made and reverted between compares; the compare interval is the blind spotA version control product, or hours per month by hand
Controller audit logDownloads, online edits, mode changes, with user and time where the platform supports authenticationPlatforms without logs or without user identity; logs that are overwrittenConfiguration and log forwarding
Mode and keyswitch monitoringThe controller placed in a mode that permits editingEdits on platforms that allow online changes in run modeOne tag and one alarm per controller
Passive network monitoringThe download or edit message on the wire, with the source address, in real timeEdits made through a serial port or a USB cable; encrypted vendor protocolsA monitoring sensor and someone to watch it
Physical access controlWho was in the room with the controllerNetwork changesDoor alarms and a log

The signature alarm

Most controller families expose a value that changes whenever the program or the configuration changes: a change counter that increments, a checksum of the program, a signature computed at download, or a timestamp of the last edit. The SCADA polls that value like any tag, stores the expected value, and raises an alarm when the live value differs. The alarm says which controller and when, to the poll interval, and it is the cheapest detection there is. It is configured once per controller, its expected value is updated as the last step of every approved change, and the alarm goes to the same list as process alarms so that it is seen. On platforms where some edits do not change the value, the scheduled compare covers the gap.

When a detection fires

  1. 1

    Confirm

    Which controller, what time, which method. Read the controller audit log and the SCADA event log for the window.

  2. 2

    Match

    Against the open change records and the vendor session log. A change record with that controller and that window explains it; update the baseline and close the record.

  3. 3

    Ask

    The engineers and the integrator, if no record matches. An undocumented but legitimate change is recorded now, and the process that let it go unrecorded is fixed.

  4. 4

    Investigate

    If nobody made it: upload the program, compare with the baseline, and read exactly what changed. Assess whether the process is at risk. Check the network logs for the source of the download. Treat it as an intrusion until proven otherwise.

  5. 5

    Decide

    Revert to the baseline if the change is unexplained or harmful, with the process in a safe state and the reversion itself under a change record. Rotate the controller credentials. Preserve the evidence.

  6. 6

    Close

    The record, the baseline update, and the lesson: what allowed the change and what will detect the next one sooner.

What to do about controllers that cannot be watched

Older controllers report no signature, keep no log, and change mode with a keyswitch nobody monitors. For those, the scheduled upload and compare is the only program-level detection, and the surrounding controls carry the rest: the controller reachable only from the engineering zone, the programming software on a workstation with individual logins and logging, physical access to the panel controlled and logged, and network monitoring that sees the vendor protocol. When the controller is replaced, program change detection is on the specification.

Frequently asked questions

The controller checksum changes when an operator changes a setpoint. How do I separate that?
Some platforms include data in the checksum, so setpoint writes change it. Use a value that covers the program only, if the platform offers one, or move setpoints to a data area excluded from the signature, or accept that the alarm on that platform covers data as well and rely on the scheduled compare to tell program from data.
Can the SCADA itself make the change and trigger the alarm?
The SCADA writes data, not programs, so it should not change a program signature. If it does, the signature includes data and the answer above applies. A SCADA that can download programs to controllers is a design that should be reconsidered.
How fast should detection be?
The signature alarm is as fast as the poll, seconds to a minute; network monitoring is real time. The scheduled compare is hours to a month. For the controllers whose compromise would hurt people or the environment, real-time detection is worth the cost; for the rest, the poll and a monthly compare are proportionate.
What is the first thing a small utility should do?
Configure the change counter or signature alarm on every controller that reports one, this week; it costs nothing but an hour. Then start a monthly compare of the critical controllers against the stored project with the vendor tool, and put the mode and keyswitch status on the HMI.

Direct contact

Have a controls question?

Reach Eric Sullivan directly about anything on this site, a controls or automation topic, or one of his personal projects.