Zephyr's WireGuard VPN data-plane receive handler wg_process_data_message() in subsys/net/lib/wireguard/wg_crypto.c validated the anti-replay counter too late. After AEAD decryption of a MESSAGE_TRANSPORT_DATA packet succeeded, the code committed several peer-state changes — update_peer_addr() (endpoint roaming update), the keypair->last_rx/peer->last_rx liveness timers, and keypair_update() (promote next→current and destroy the previous keypair) — and only afterward called wg_check_replay(). On a replayed packet the replay check returned -EINVAL, but none of the preceding mutations were rolled back.
The AEAD tag authenticates content but not freshness, so a replayed-but-authentic transport packet decrypts correctly. An attacker who captures one valid ciphertext off the wire (an on-path or shared-medium observer) can re-inject it from an arbitrary spoofed source address. Reaching the handler requires no credentials: it is driven directly from inbound UDP datagrams via the dispatch in subsys/net/lib/wireguard/wg.c.
Because the state mutations committed before the replay check, the replay repoints the peer endpoint to the attacker-chosen source address (roaming hijack), redirecting the victim's subsequent outbound tunnel traffic until the legitimate peer's next packet re-corrects it; it also prematurely destroys the previous keypair and refreshes the RX liveness timer. The tunnel payload stays encrypted under the session keypair, so this is an integrity/availability impact (traffic redirection and session disruption), not payload disclosure. The fix moves wg_check_replay() to immediately after a successful decrypt, before any peer-state mutation, matching the WireGuard specification and the Linux reference implementation.
{
"cna_assigner": "zephyr",
"cwe_ids": [
"CWE-294"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/13xxx/CVE-2026-13734.json"
}"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-13734.json"
[
{
"deprecated": false,
"digest": {
"function_hash": "149676935219164376109633264426281758290",
"length": 4227
},
"id": "CVE-2026-13734-75358885",
"signature_type": "Function",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/260c32ef9a89824bd25e17170e77aa4b98c84069",
"target": {
"file": "subsys/net/lib/wireguard/wg_crypto.c",
"function": "wg_process_data_message"
}
},
{
"deprecated": false,
"digest": {
"line_hashes": [
"103117181195481898046377296938137561102",
"200193105173350827086555565201390309278",
"120016397421143916966133274059705253598",
"183591915554302493201444779430703257621",
"94412807766288332342251957609800720664",
"264567372987153853044681618809087079948",
"46389748866110386258952112316894761297",
"189112168022437083384529095691058172847",
"275938397972107350733286108778580483668",
"63774273026178763839172612472165551893",
"210339593483420656622908764248730391181"
],
"threshold": 0.9
},
"id": "CVE-2026-13734-f75d4a9b",
"signature_type": "Line",
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/260c32ef9a89824bd25e17170e77aa4b98c84069",
"target": {
"file": "subsys/net/lib/wireguard/wg_crypto.c"
}
}
]
"2026-09-03T08:07:10Z"