# CVE-2026-13735: WireGuard keepalive transport-data messages accepted without Poly1305 authentication

> Attackers can bypass WireGuard keepalive authentication in Zephyr RTOS, spoofing connection status signals without possessing the session key.

- **Severity:** Low 3.7 (`CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N`)
- **Exploited in the wild:** Not known
- **Login needed:** Not needed
- **Attackable:** Over the internet
- **Victim action needed:** Not needed
- **Fix available:** No
- **Published:** 28 Aug 2026
- **Updated:** 1 Sep 2026
- **Also known as:** GHSA-xxrw-r78f-f6mx

## What is CVE-2026-13735?

CVE-2026-13735 is a low-severity vulnerability in zephyrproject zephyr, published on 28 Aug 2026. An attacker can exploit it over the internet without logging in, with no action from the victim.

### Official description

Zephyr's WireGuard implementation in subsys/net/lib/wireguard/wg_crypto.c mishandled keepalive packets. In wg_process_data_message(), 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 wg_decrypt_packet() was ever called. The Poly1305 authentication tag was therefore never verified; the only preceding gates were a cleartext receiver-index lookup (get_peer_keypair_for_index() 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 wg_input() to handle_transport_data() and then wg_process_data_message(). 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 NET_EVENT_VPN_CONNECTED signal (setting peer->first_valid 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 wg_decrypt_packet(), 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.

Weakness: CWE-290 (Authentication Bypass by Spoofing)

## Which versions are affected by CVE-2026-13735?


## How do I fix CVE-2026-13735?

No fix has been published for CVE-2026-13735 yet. Limit exposure of the affected software until one is available.

## Is CVE-2026-13735 being exploited?

There is no known exploitation of CVE-2026-13735 in the wild and no public exploit code.

## Fix prompt for AI coding agents

```text
Check this codebase for CVE-2026-13735 and fix it if it is affected.

What it is: CVE-2026-13735 is a low-severity vulnerability in zephyrproject zephyr, published on 28 Aug 2026. An attacker can exploit it over the internet without logging in, with no action from the victim.
Exploitation: There is no known exploitation of CVE-2026-13735 in the wild and no public exploit code.

Affected product: zephyrproject zephyr. No package-level version data is available, so check the vendor advisory linked from the reference page.

Task:
1. Search the dependency manifests and lockfiles (for example package.json, package-lock.json, requirements.txt, poetry.lock, uv.lock, pom.xml, build.gradle, go.mod, Cargo.lock, Gemfile.lock) and any Dockerfiles for the affected packages, including transitive dependencies.
2. If an affected version is in use, upgrade it to the fixed version for its release line with the project's package manager, so the lockfile is regenerated. Prefer the smallest upgrade that fixes it.
3. If there is no fix, or the upgrade would break the build, do not guess: explain the risk and the safest workaround instead.
4. Run the tests and summarise what changed and why.
5. If nothing in the project is affected, say so and change nothing.

Reference: https://insights.sbomify.com/CVE-2026-13735/ (Markdown: https://insights.sbomify.com/CVE-2026-13735/index.md)
```

## Sources

- CVE record: https://www.cve.org/CVERecord?id=CVE-2026-13735
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-13735
- OSV: https://osv.dev/vulnerability/CVE-2026-13735

---
From sbomify Insights: https://insights.sbomify.com/CVE-2026-13735/
Summaries are generated and may contain mistakes; the official description above is the record.
