167   Replay attack for GOOSE and SV

Created: 20 May 2026

Status: Triage

Part: Part 6 (2020, Edition 1)

Links:

Page: 15 and 19

Clause: 6.2.1.2 and 6.2.2.3.1

Paragraph: N/A

Issue

In the replay state processing requirements described in clause 6.2.1.3 and 6.2.2.3.2 and illustrated in figures 2 and 3, the replay states are only checked when the current replay state is not invalid (i.e. when the current replay state has been initialized and is currently tracking a value). However, for both GOOSE and SV a mechanism exists in which that state can be re-initialized to an invalid value (i.e uninitialized) by triggering multicast association loss detection (steps 11-12-13 in both figure 2 and 3). This can be achieved by an attacker by intercepting and dropping or delaying packets for a time greater than the configured timeout delay to reinitialize the value. At that point, an attacker can replay previously recorded packets, even if they are encrypted or authenticated (assuming the key has not changed) and they would not be rejected by the replay state machine.

Proposal

In clauses 6.2.1.2 and 6.2.2.3.1 (security check protection requirements), add an additional security validation in which data timestamps (e.g. timestamp value in APDU) are checked against the absolute value of the receiver clock to ensure the timestamp values are greater or equal to the current value of the receiver clock and lesser or equal to the current value of the receiver clock plus a configurable delta. This requires that the clocks or the sender(s) and the receiver(s) are synchronized. The data timestamps are protected by encryption and/or authentication and cannot be modified by an attacker without knowledge of the key. As such, replaying the contents of a secured GOOSE or SV message would have timestamps in the past, which would fail the proposed additional data integrity check.

Discussion Created Status
This proposal assumes either a MAC or encryption is used to prevent spoofing or tampering with the packets. The replay attack described works even with these countermeasures in place, unlike previously documented replay attacks.

In terms of protection, no solution based on STnum, SQnum or even lastRcvT would work as an attacker can arbitrarily trigger a reset of these value to an uninitialized state (e.g. invalid) by intercepting and then holding or dropping packets until the multicast association loss loop is triggered. This capability is easily achievable through arp cache poisoning for example.

As for introducing denial of service scenarios, I fully agree that this is case. It is an explicit tradeoff of availability outcomes for integrity outcomes. A way to address this would be that, if a "fail closed" option is not suitable, at least a warning error log should mandatorily be raised in order to enable compensatory controls (e.g. detection by parsing the logs).
21 May 26 Triage
The timestamp will not work for GOOSE nor will STnum, SQnum comparison without an HMAC. If you do the check, the GOOSE can be spoofed and this might create a DOS.

There is no real Timestamp is SV.

The proposal might prevent replay, but would create the opportunity for DOS.

If we make the state machines specific to HMAC, for GOOSE it should be STnum, Sqnum, and I believe the mechanism for SV is as good as we can get.
20 May 26 Triage

 

Privacy | Contact | Disclaimer

Tissue DB v. 25.7.7.1