Zephyr's WireGuard implementation in subsys/net/lib/wireguard/wgcrypto.c mishandled keepalive packets. In wgprocessdatamessage(), any type-4 transport-data message whose payload was exactly 16 bytes (an empty plaintext plus a bare Poly1305 tag, i.e. a keepalive) was accepted and returned immediately, before wgdecryptpacket() was ever called. The Poly1305 authentication tag was therefore never verified; the only preceding gates were a cleartext receiver-index lookup (getpeerkeypairforindex() on the attacker-supplied data_hdr->receiver) and a non-cryptographic keypair validity/expiry check.
The path is reachable entirely from the network: inbound UDP on the WireGuard port is dispatched by wginput() to handletransportdata() and then wgprocessdatamessage(). The 32-bit receiver index is transmitted in cleartext in WireGuard handshake and data messages, so an on-path observer learns it directly and an off-path attacker can brute-force it against the UDP port. Given an active receiving-valid session for that index, an attacker could send a 16-byte garbage payload and have it accepted without possessing the session key.
On acceptance the unauthenticated message caused the management layer to observe a spoofed NETEVENTVPNCONNECTED signal (setting peer->firstvalid and notifying any net_mgmt listener) and incremented the keepalive-RX statistic. The impact is limited to integrity of this status signal: no plaintext is decrypted or injected, no key is disclosed, and the early-return path did not update the peer endpoint or liveness timers, so there is no traffic-injection, session-takeover, or availability consequence.
The fix removes the pre-decrypt early return so a 16-byte payload flows through wgdecryptpacket(), which verifies the Poly1305 tag over the empty plaintext, followed by the existing anti-replay check; only an authenticated, non-replayed message is then recognised as a keepalive. Forged keepalives now fail the tag check and are counted as decrypt failures.
{
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/13xxx/CVE-2026-13735.json",
"cwe_ids": [
"CWE-290"
],
"cna_assigner": "zephyr"
}[
{
"id": "CVE-2026-13735-347c0501",
"target": {
"file": "subsys/net/lib/wireguard/wg_crypto.c"
},
"deprecated": false,
"digest": {
"threshold": 0.9,
"line_hashes": [
"18635276415716625867733275086465581431",
"302568142741183751589394891538570763713",
"213543599759502005230833093905232517478",
"88070670232955323555308087999190132173",
"40984148538149733877764175429930878901",
"302450822851061763873106091997119348403",
"173994340155452646250710106747307416261",
"19535356268115805935967410584552780717",
"49956291015723853406243872476547833365",
"171420908809214125598081123281473776732",
"222144012558225053097924550071115888269",
"16969940149563401650044940687924174184",
"964976394941585290680283373464712585",
"47880234042428587152148963439826927885",
"209096055345821703734256939857123044745",
"268900142374199602929954184951870847945",
"210339593483420656622908764248730391181"
]
},
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/87c520a55f0f0e7cd4adf8780166e45eaad6d81c",
"signature_type": "Line"
},
{
"id": "CVE-2026-13735-ce88b9d2",
"target": {
"function": "wg_process_data_message",
"file": "subsys/net/lib/wireguard/wg_crypto.c"
},
"deprecated": false,
"digest": {
"function_hash": "62271222734382762935760878513104810537",
"length": 4227.0
},
"signature_version": "v1",
"source": "https://github.com/zephyrproject-rtos/zephyr/commit/87c520a55f0f0e7cd4adf8780166e45eaad6d81c",
"signature_type": "Function"
}
]
"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-13735.json"
"2026-08-30T08:17:12Z"