]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
mudp: fix unaligned 32-bit read when parsing peer ID
authorGianmarco De Gregori <gianmarco@mandelbit.com>
Wed, 10 Dec 2025 10:48:33 +0000 (11:48 +0100)
committerGert Doering <gert@greenie.muc.de>
Wed, 10 Dec 2025 10:53:56 +0000 (11:53 +0100)
The code previously read a 32-bit value from a uint8_t
buffer using a direct cast and dereference.
This can cause unaligned memory access and undefined
behavior on architectures that do not support unaligned
reads, potentially leading to a one-packet crash.

Fix this by reading the bytes individually and
combining them manually.

Reported-By: Joshua Rogers <contact@joshua.hu>
Found-By: ZeroPath (https://zeropath.com)
Change-Id: Id0bb4c45d373437ab8dbaff7a311745f9b538cbf
Signed-off-by: Gianmarco De Gregori <gianmarco@mandelbit.com>
Acked-by: Gert Doering <gert@greenie.muc.de>
Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1348
Message-Id: <20251210104839.8270-1-gert@greenie.muc.de>
Signed-off-by: Gert Doering <gert@greenie.muc.de>
src/openvpn/mudp.c

index b03e165e45e3dc3ae599e7d35a4a2e1566aabc29..5de3af69707439c6625c5502dbdd470063596f4c 100644 (file)
@@ -209,7 +209,7 @@ multi_get_create_instance_udp(struct multi_context *m, bool *floated, struct lin
         /* make sure buffer has enough length to read opcode (1 byte) and peer-id (3 bytes) */
         if (v2)
         {
-            uint32_t peer_id = ntohl(*(uint32_t *)ptr) & 0xFFFFFF;
+            uint32_t peer_id = ((uint32_t)ptr[1] << 16) | ((uint32_t)ptr[2] << 8) | ((uint32_t)ptr[3]);
             peer_id_disabled = (peer_id == MAX_PEER_ID);
 
             if (!peer_id_disabled && (peer_id < m->max_clients) && (m->instances[peer_id]))