From 4e31670b1e1215130ffaec0f6769e084169da0f1 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Wed, 12 Nov 2025 15:13:28 +0100 Subject: [PATCH] Fix construction of invalid pointer in tls_pre_decrypt In tls_pre_decrypt we construct a pointer ks with an invalid i if i is TM_SIZE, doing a out-of-bounds read in multi->session. This is a something that exists at least since 2.3.0 (I didn't go further back but probalby exists in earlier version as well as the commits date back to SVN beta21 branch). So we construct the pointer but do not do anything with it if it is invalid as we check i *after* we construct the pointer `ks`. I suspect that the compiler optimises the bug away in any higher optimisation level. Assuming there is no optimisation, let's check what is possible. Since we never use the value `ks` if it is invalid, we do not have worry if it ends up invalid or not. The only thing that we have to worry about is whether `session + offsetof(struct tls_session, key[KS_PRIMARY])` is pointing to memory that is valid to read to construct the `ks` pointer. This is outside the tls_multi struct, so this is not guaranteed to be allocated memory but at the same time it is also only few bytes (or few tens/hundred) after the struct, so it the propability is very high that it will be be in a memory region that will not cause a segfault on read. Every time this condition is hit and we construct the invalid pointer, the log message "TLS Error: Unroutable control packet received" is printed at `verb 1` or higher. And this is a quite common log message, which serves as indication as well that a crash is not something that typically happens but either the optimisation fixes or the memory region of the invalid access is valid to read from. Based on this this was categorized as "bug, but no way to exploit this, thus no CVE". Change-Id: Ided1ac7c804487055b175d8766535bead257b7d5 Reported-By: Jon Chiappetta Reported-By: Joshua Rogers Found-by: ZeroPath (https://zeropath.com/) Signed-off-by: Arne Schwabe Acked-by: Gert Doering Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1373 Message-Id: <20251112141335.17417-1-gert@greenie.muc.de> Signed-off-by: Gert Doering (cherry picked from commit 5cdf3f9724c89b278c88fd408714a8d2c1f4d1a1) --- src/openvpn/ssl.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/openvpn/ssl.c b/src/openvpn/ssl.c index 5a0bf95a..9814bb39 100644 --- a/src/openvpn/ssl.c +++ b/src/openvpn/ssl.c @@ -3840,9 +3840,6 @@ tls_pre_decrypt(struct tls_multi *multi, } else { - struct tls_session *session = &multi->session[i]; - struct key_state *ks = &session->key[KS_PRIMARY]; - /* * Packet must belong to an existing session. */ @@ -3856,6 +3853,8 @@ tls_pre_decrypt(struct tls_multi *multi, goto error; } + struct tls_session *session = &multi->session[i]; + struct key_state *ks = &session->key[KS_PRIMARY]; /* * Verify remote IP address */