<feed xmlns='http://www.w3.org/2005/Atom'>
<title>unetd, branch master</title>
<subtitle>WireGuard based VPN connection manager for OpenWrt</subtitle>
<id>https://git.openwrt.org/project/unetd/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/project/unetd/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/'/>
<updated>2026-07-22T10:49:26Z</updated>
<entry>
<title>network: keep in-memory network data when reloading from disk fails</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:33:44Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=7c3213d002257df53ca74ad389f2c3ea1d778320'/>
<id>urn:sha1:7c3213d002257df53ca74ad389f2c3ea1d778320</id>
<content type='text'>
network_load_dynamic() read the saved file directly into the live
net_data buffer and zeroed net_data_len on any failure, while
net_data_version survived. A missing or corrupt file at reload time
therefore destroyed the validated copy still held in memory and took
the network down, and the stale version made the update response
handler discard any re-fetched data of the same version, leaving the
node broken until a restart or a version bump.

Read the file into a separate buffer instead and use whichever copy of
the data is valid and newer. When the in-memory copy wins, write it
back to disk to restore the missing or stale file. The auth data
validation requires the payload to be NUL-terminated, so the JSON in a
validated in-memory blob is safe to parse directly.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>network: cap dynamic data size when loading from disk</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:33:08Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=2dd6d2156f6c759c2991859dafc7ea9aa1325580'/>
<id>urn:sha1:2dd6d2156f6c759c2991859dafc7ea9aa1325580</id>
<content type='text'>
Network data received via PEX is limited to UNETD_NET_DATA_SIZE_MAX,
but network_load_dynamic() allocated and read whatever size the saved
file had. A corrupt or foreign .bin file thus caused an unbounded
allocation before validation could reject it. Apply the same limit as
the receive path.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>enroll: make the attribute table static</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:23:21Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=e113c20e659757ec26118ab42de85d73edf53483'/>
<id>urn:sha1:e113c20e659757ec26118ab42de85d73edf53483</id>
<content type='text'>
The parsed attribute table was defined as a non-static global named
tb, exposing a generic symbol that silently aliases with any other
global of the same name in another compilation unit.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>vxlan: handle missing local host in tunnel setup</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:23:10Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=b62a3f2702502a8865991dfd13d9f1bda499d6f6'/>
<id>urn:sha1:b62a3f2702502a8865991dfd13d9f1bda499d6f6</id>
<content type='text'>
vxlan_tunnel_init() dereferenced net_config.local_host to read the
local tunnel address, crashing when a vxlan service exists on a
network the local node is not a member of, e.g. while it has not been
enrolled yet. Skip the tunnel setup without a local host and gate the
service reuse path on an established tunnel, so the creation is
retried on the reload that adds the local host instead of being
skipped as an unchanged service.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>enroll: verify the confirmation hash in client accept messages</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:04:23Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=c3b6bfd2cdd940c4419d3a1fb6a262c656d4a6d9'/>
<id>urn:sha1:c3b6bfd2cdd940c4419d3a1fb6a262c656d4a6d9</id>
<content type='text'>
The client accept message carries a hash over the auth key received
in the server confirm and the server session key, but the server
marked the peer as confirmed without ever checking it. Validate the
hash so a peer is only reported as confirmed when it actually holds
the correct network auth key.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>enroll: do not update peer state from unauthenticated messages</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:03:57Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=8553e53c488463853ba5e3b4b72b0172e806d9d6'/>
<id>urn:sha1:8553e53c488463853ba5e3b4b72b0172e806d9d6</id>
<content type='text'>
Client discovery messages carry no HMAC and a zero nonce, but looking
up an existing peer for one still overwrote the stored address and
reset the recorded nonce to zero. A spoofed discovery containing a
known session public key could redirect the peer address and disable
replay detection. Update address and nonce only for messages with
verified key data.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>enroll: apply replay protection to accept and confirm messages</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:03:43Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=daa04def5a0bd6f9054ecdb71575d759c78c6cfc'/>
<id>urn:sha1:daa04def5a0bd6f9054ecdb71575d759c78c6cfc</id>
<content type='text'>
The accept and confirm handlers passed a NULL key_data to
enroll_get_peer(), which skips the nonce replay check for these
messages even though their HMAC and nonce were already verified.
A replayed message was not only accepted, it also rewound the
recorded peer nonce, reopening the replay window for messages that
do get checked.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>pex: do not send peer messages without an open local PEX socket</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:03:17Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=9348469045fa560b2fb1e6c3a200469db01d5b69'/>
<id>urn:sha1:9348469045fa560b2fb1e6c3a200469db01d5b69</id>
<content type='text'>
network_pex_recv_update_response() notifies connected peers via the
local PEX socket, but can be invoked through the global socket while
the local socket is closed (no local pex_port). In that case
pex_msg_send() passed fd -1 to __pex_msg_send(), which treats a
negative fd as the extended-header global path: it subtracts the
extended header size from a header that has none and emits the
mangled packet on the global socket.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>pex-msg: fix response data leak on failed continuation init</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:02:50Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=f4b83ba82f0f51a7f5f93d64b01549a364941593'/>
<id>urn:sha1:f4b83ba82f0f51a7f5f93d64b01549a364941593</id>
<content type='text'>
When __pex_msg_init_ext() fails in pex_msg_update_response_continue(),
the caller stops sending and the remaining response buffer was never
freed.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
<entry>
<title>pex-msg: do not drop packets when unix socket forwarding fails</title>
<updated>2026-07-22T10:49:26Z</updated>
<author>
<name>Felix Fietkau</name>
</author>
<published>2026-07-18T08:02:34Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/unetd/commit/?id=c0ab6efc2f2c0a658074bc1cc83bd9d10392a0ad'/>
<id>urn:sha1:c0ab6efc2f2c0a658074bc1cc83bd9d10392a0ad</id>
<content type='text'>
A transient sendmsg error (EAGAIN, ENOBUFS, EMSGSIZE) on the unix
forwarding socket skipped local processing of the received packet as
well. A congested or stalled consumer on the unix socket would cause
incoming global PEX messages to be dropped entirely. Only skip the
forwarding, local processing is independent of it.

Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;
</content>
</entry>
</feed>
