* [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235
@ 2026-09-24 4:32 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 2/24] rabbitmq-c: patch CVE-2026-44236 ankur.tyagi85
` (23 more replies)
0 siblings, 24 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-44235
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../rabbitmq-c/CVE-2026-44235.patch | 95 +++++++++++++++++++
.../rabbitmq-c/rabbitmq-c_0.15.0.bb | 1 +
2 files changed, 96 insertions(+)
create mode 100644 meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
new file mode 100644
index 0000000000..fcb0e1e1d1
--- /dev/null
+++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
@@ -0,0 +1,95 @@
+From 52f00ef57e55c783c2c436590296d9ff986b65d0 Mon Sep 17 00:00:00 2001
+From: Claude <noreply@anthropic.com>
+Date: Tue, 28 Apr 2026 00:30:47 +0000
+Subject: [PATCH] amqp_connection: reject undersized frames in
+ amqp_handle_input
+
+A malicious AMQP server (or active network attacker on an unencrypted
+connection) can send an AMQP frame whose stated frame body is shorter
+than the per-frame-type header it claims to carry. amqp_handle_input()
+then computed encoded.len as
+
+ state->target_size - HEADER_SIZE - <fixed_header_bytes> - FOOTER_SIZE
+
+with no lower-bound check on target_size. Because encoded.len is a
+size_t, the subtraction wrapped to a value near SIZE_MAX. The bogus
+length was passed to amqp_decode_method() / amqp_decode_properties()
+and through to the table decoder, whose internal bounds checks could
+no longer constrain the parser. The result was an out-of-bounds read
+and process crash on the client side, reachable during amqp_login.
+
+Validate target_size against the minimum required for each frame type
+(METHOD: HEADER_SIZE+4+FOOTER_SIZE, HEADER: HEADER_SIZE+12+FOOTER_SIZE,
+BODY: HEADER_SIZE+FOOTER_SIZE) and return AMQP_STATUS_BAD_AMQP_DATA
+when the frame is too small, before computing encoded.len.
+
+Add the verified PoC bytes as a regression seed for the existing
+fuzz_server harness.
+
+Refs: GHSA-9mmv-r8g3-qp46
+(cherry picked from commit 1d3afbb056fee5cc9ea05680bf32288715d0d802)
+
+CVE: CVE-2026-44235
+Upstream-Status: Backport [https://github.com/alanxz/rabbitmq-c/commit/1d3afbb056fee5cc9ea05680bf32288715d0d802]
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ .../input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw | Bin 0 -> 113 bytes
+ librabbitmq/amqp_connection.c | 19 ++++++++++++++++++
+ 2 files changed, 19 insertions(+)
+ create mode 100644 fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw
+
+diff --git a/fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw b/fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw
+new file mode 100644
+index 0000000000000000000000000000000000000000..558e9f5bff6b24ad3104b8a3038ab5b271257dcc
+GIT binary patch
+literal 113
+zcmZQ%0D&+DE+FItvaHO#6&U^l0azR#5qxj8*#?Ay5=J1KHNeNw(+|W*&5I8WKF0)>
+L=Vq{ht2+k({(TL>
+
+literal 0
+HcmV?d00001
+
+diff --git a/librabbitmq/amqp_connection.c b/librabbitmq/amqp_connection.c
+index 56ab8a8..4326ef7 100644
+--- a/librabbitmq/amqp_connection.c
++++ b/librabbitmq/amqp_connection.c
+@@ -320,6 +320,13 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
+
+ switch (decoded_frame->frame_type) {
+ case AMQP_FRAME_METHOD:
++ /* A METHOD frame body must contain at least the 4-byte method id.
++ * Reject undersized frames before subtracting from target_size to
++ * avoid an unsigned underflow that would yield a huge encoded.len
++ * and cause out-of-bounds reads in amqp_decode_method(). */
++ if (state->target_size < HEADER_SIZE + 4 + FOOTER_SIZE) {
++ return AMQP_STATUS_BAD_AMQP_DATA;
++ }
+ decoded_frame->payload.method.id =
+ amqp_d32(amqp_offset(raw_frame, HEADER_SIZE));
+ encoded.bytes = amqp_offset(raw_frame, HEADER_SIZE + 4);
+@@ -335,6 +342,15 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
+ break;
+
+ case AMQP_FRAME_HEADER:
++ /* A HEADER frame body must contain at least 12 bytes (class_id,
++ * weight, body_size). Reject undersized frames before subtracting
++ * from target_size to avoid an unsigned underflow that would yield
++ * a huge encoded.len and cause out-of-bounds reads in
++ * amqp_decode_properties() / the table decoder
++ * (CVE: GHSA-9mmv-r8g3-qp46). */
++ if (state->target_size < HEADER_SIZE + 12 + FOOTER_SIZE) {
++ return AMQP_STATUS_BAD_AMQP_DATA;
++ }
+ decoded_frame->payload.properties.class_id =
+ amqp_d16(amqp_offset(raw_frame, HEADER_SIZE));
+ /* unused 2-byte weight field goes here */
+@@ -354,6 +370,9 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
+ break;
+
+ case AMQP_FRAME_BODY:
++ if (state->target_size < HEADER_SIZE + FOOTER_SIZE) {
++ return AMQP_STATUS_BAD_AMQP_DATA;
++ }
+ decoded_frame->payload.body_fragment.len =
+ state->target_size - HEADER_SIZE - FOOTER_SIZE;
+ decoded_frame->payload.body_fragment.bytes =
diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
index 4fd6302f2c..642e1e443b 100644
--- a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
+++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
@@ -4,6 +4,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7e12f6e40e662e039e2f02b4893011ec"
LICENSE = "MIT"
SRC_URI = "git://github.com/alanxz/rabbitmq-c.git;branch=master;protocol=https \
+ file://CVE-2026-44235.patch \
"
SRCREV = "84b81cd97a1b5515d3d4b304796680da24c666d8"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 2/24] rabbitmq-c: patch CVE-2026-44236
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 3/24] redis: patch CVE-2026-81934 ankur.tyagi85
` (22 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-44236
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../rabbitmq-c/CVE-2026-44236.patch | 145 ++++++++++++++++++
.../rabbitmq-c/rabbitmq-c_0.15.0.bb | 1 +
2 files changed, 146 insertions(+)
create mode 100644 meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44236.patch
diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44236.patch b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44236.patch
new file mode 100644
index 0000000000..3c8a5a71a3
--- /dev/null
+++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44236.patch
@@ -0,0 +1,145 @@
+From 17f19124ba26f9c924f9ab53bca975cb8673f862 Mon Sep 17 00:00:00 2001
+From: Kevin Valerio <kvalerio@protonmail.com>
+Date: Tue, 28 Apr 2026 13:45:22 +0200
+Subject: [PATCH] fix(connection): enforce minimum frame_max
+
+(cherry picked from commit 4777d0b5c58cb02966a04a85832436bd66ed5d1f)
+
+CVE: CVE-2026-44236
+Upstream-Status: Backport [https://github.com/alanxz/rabbitmq-c/commit/4777d0b5c58cb02966a04a85832436bd66ed5d1f]
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ README.md | 6 ++++-
+ librabbitmq/amqp_connection.c | 4 +++
+ librabbitmq/amqp_socket.c | 1 +
+ tests/CMakeLists.txt | 5 +++-
+ tests/test_tune_connection.c | 51 +++++++++++++++++++++++++++++++++++
+ 5 files changed, 65 insertions(+), 2 deletions(-)
+ create mode 100644 tests/test_tune_connection.c
+
+diff --git a/README.md b/README.md
+index 7c02d52..2682993 100644
+--- a/README.md
++++ b/README.md
+@@ -133,6 +133,10 @@ terminal window:
+ Please see the `examples` directory for short examples of the use of
+ the `librabbitmq` library.
+
++During login, `frame_max` negotiation follows the AMQP minimum frame size.
++Values below `AMQP_FRAME_MIN_SIZE` are raised before the client sizes its
++outbound frame buffer or sends `connection.tune-ok`.
++
+ ### Threading
+
+ You cannot share a socket, an `amqp_connection_state_t`, or a channel
+@@ -177,4 +181,4 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-SOFTWARE.
+\ No newline at end of file
++SOFTWARE.
+diff --git a/librabbitmq/amqp_connection.c b/librabbitmq/amqp_connection.c
+index 4326ef7..f016fc1 100644
+--- a/librabbitmq/amqp_connection.c
++++ b/librabbitmq/amqp_connection.c
+@@ -113,6 +113,10 @@ int amqp_tune_connection(amqp_connection_state_t state, int channel_max,
+
+ ENFORCE_STATE(state, CONNECTION_STATE_IDLE);
+
++ if (frame_max < AMQP_FRAME_MIN_SIZE) {
++ frame_max = AMQP_FRAME_MIN_SIZE;
++ }
++
+ state->channel_max = channel_max;
+ state->frame_max = frame_max;
+
+diff --git a/librabbitmq/amqp_socket.c b/librabbitmq/amqp_socket.c
+index 094ceb7..a7206c7 100644
+--- a/librabbitmq/amqp_socket.c
++++ b/librabbitmq/amqp_socket.c
+@@ -1387,6 +1387,7 @@ static amqp_rpc_reply_t amqp_login_inner(amqp_connection_state_t state,
+ if (res < 0) {
+ goto error_res;
+ }
++ client_frame_max = (uint32_t)amqp_get_frame_max(state);
+
+ {
+ amqp_connection_tune_ok_t s;
+diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
+index 8c0aee0..624e7f5 100644
+--- a/tests/CMakeLists.txt
++++ b/tests/CMakeLists.txt
+@@ -23,6 +23,10 @@ add_executable(test_status_enum
+ target_link_libraries(test_status_enum rabbitmq-static)
+ add_test(status_enum test_status_enum)
+
++add_executable(test_tune_connection test_tune_connection.c)
++target_link_libraries(test_tune_connection rabbitmq-static)
++add_test(tune_connection test_tune_connection)
++
+ add_executable(test_basic
+ test_basic.c)
+ target_link_libraries(test_basic rabbitmq-static)
+@@ -40,4 +44,3 @@ add_test(sasl_mechanism test_sasl_mechanism)
+ add_executable(test_merge_capabilities test_merge_capabilities.c)
+ target_link_libraries(test_merge_capabilities rabbitmq-static)
+ add_test(merge_capabilities test_merge_capabilities)
+-
+diff --git a/tests/test_tune_connection.c b/tests/test_tune_connection.c
+new file mode 100644
+index 0000000..276e18d
+--- /dev/null
++++ b/tests/test_tune_connection.c
+@@ -0,0 +1,51 @@
++// Copyright 2007 - 2021, Alan Antonuk and the rabbitmq-c contributors.
++// SPDX-License-Identifier: mit
++
++#include "amqp_private.h"
++#include <rabbitmq-c/amqp.h>
++#include <rabbitmq-c/framing.h>
++
++#include <stdio.h>
++#include <stdlib.h>
++
++static void expect_frame_max(int requested, int expected) {
++ int res;
++ amqp_connection_state_t state = amqp_new_connection();
++
++ if (state == NULL) {
++ fprintf(stderr, "amqp_new_connection failed\n");
++ abort();
++ }
++
++ state->state = CONNECTION_STATE_IDLE;
++
++ res = amqp_tune_connection(state, 0, requested, 0);
++ if (res != AMQP_STATUS_OK) {
++ fprintf(stderr, "amqp_tune_connection returned %d\n", res);
++ abort();
++ }
++
++ if (amqp_get_frame_max(state) != expected) {
++ fprintf(stderr, "expected frame_max %d, got %d\n", expected,
++ amqp_get_frame_max(state));
++ abort();
++ }
++
++ if (state->outbound_buffer.len != (size_t)expected) {
++ fprintf(stderr, "expected outbound buffer length %d, got %zu\n", expected,
++ state->outbound_buffer.len);
++ abort();
++ }
++
++ amqp_destroy_connection(state);
++}
++
++int main(void) {
++ expect_frame_max(0, AMQP_FRAME_MIN_SIZE);
++ expect_frame_max(1, AMQP_FRAME_MIN_SIZE);
++ expect_frame_max(AMQP_FRAME_MIN_SIZE - 1, AMQP_FRAME_MIN_SIZE);
++ expect_frame_max(AMQP_FRAME_MIN_SIZE, AMQP_FRAME_MIN_SIZE);
++ expect_frame_max(AMQP_DEFAULT_FRAME_SIZE, AMQP_DEFAULT_FRAME_SIZE);
++
++ return 0;
++}
diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
index 642e1e443b..f3c2a52fa2 100644
--- a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
+++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
@@ -5,6 +5,7 @@ LICENSE = "MIT"
SRC_URI = "git://github.com/alanxz/rabbitmq-c.git;branch=master;protocol=https \
file://CVE-2026-44235.patch \
+ file://CVE-2026-44236.patch \
"
SRCREV = "84b81cd97a1b5515d3d4b304796680da24c666d8"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 3/24] redis: patch CVE-2026-81934
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 2/24] rabbitmq-c: patch CVE-2026-44236 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 4/24] sngrep: patch CVE-2026-90558 ankur.tyagi85
` (21 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-81934
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../redis/redis-8.0.6/CVE-2026-81934.patch | 53 +++++++++++++++++++
meta-oe/recipes-extended/redis/redis_8.0.6.bb | 1 +
2 files changed, 54 insertions(+)
create mode 100644 meta-oe/recipes-extended/redis/redis-8.0.6/CVE-2026-81934.patch
diff --git a/meta-oe/recipes-extended/redis/redis-8.0.6/CVE-2026-81934.patch b/meta-oe/recipes-extended/redis/redis-8.0.6/CVE-2026-81934.patch
new file mode 100644
index 0000000000..80a9118d92
--- /dev/null
+++ b/meta-oe/recipes-extended/redis/redis-8.0.6/CVE-2026-81934.patch
@@ -0,0 +1,53 @@
+From 83b6dda66e69bdaf7927140d70666f838b33cbf0 Mon Sep 17 00:00:00 2001
+From: Sergei Georgiev <s_ggeorgiev@yahoo.com>
+Date: Tue, 9 Jun 2026 14:22:50 +0300
+Subject: [PATCH] Fix use-after-free in tlsProcessPendingData() pending-list
+ iteration (#1391)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+`tlsProcessPendingData()` iterates `pending_list` using a `listIter`, which pre-caches the `next` node pointer on every `listNext()` call. This cached pointer can dangle and be dereferenced after the node it points to has been freed, causing a use-after-free and a server crash (SIGSEGV).
+
+The issue occurs because `tlsHandleEvent()` runs the connection's read handler, which can execute a command (e.g. `CLIENT KILL`) that closes a *different* pending TLS connection. That close path goes through `freeClient()` → `connClose()` → `connTLSClose()`, which calls `listDelNode()` and frees the victim connection's `pending_list` node. If the iterator's cached `next` pointer referenced that node, the following `listNext()` reads freed memory. The `listNext()` contract only permits removing the *current* node, not arbitrary other nodes.
+
+Replace the `listIter`-based iteration with a detach-from-head, bounded drain so that no list node pointer is ever held across a handler call:
+
+- Re-read `listFirst()` on each iteration instead of relying on a pre-cached `next` pointer
+- Detach the head via `tlsPendingRemove()` *before* calling `tlsHandleEvent()`, so the loop always makes forward progress
+- Semantics are preserved: in the common case each connection is handled exactly once per cycle, in order
+
+(cherry picked from commit 98ff29b2828bf3245167b416ee23e6797f551a37)
+(cherry picked from commit 6d088c335d5c3ec49a6c28486140b498e70b7834)
+
+CVE: CVE-2026-81934
+Upstream-Status: Backport [https://github.com/redis/redis/commit/6d088c335d5c3ec49a6c28486140b498e70b7834]
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/tls.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/src/tls.c b/src/tls.c
+index a0733a4b6..0fa468cfc 100644
+--- a/src/tls.c
++++ b/src/tls.c
+@@ -1098,15 +1098,14 @@ static int tlsHasPendingData(struct aeEventLoop *el) {
+ }
+
+ static int tlsProcessPendingData(struct aeEventLoop *el) {
+- listIter li;
+- listNode *ln;
+-
+ list *pending_list = el->privdata[1];
+ if (!pending_list) return 0;
+ int processed = listLength(pending_list);
+- listRewind(pending_list,&li);
+- while((ln = listNext(&li))) {
++ for (int i = 0; i < processed; i++) {
++ listNode *ln = listFirst(pending_list);
++ if (!ln) break;
+ tls_connection *conn = listNodeValue(ln);
++ tlsPendingRemove(conn);
+ tlsHandleEvent(conn, AE_READABLE);
+ }
+ return processed;
diff --git a/meta-oe/recipes-extended/redis/redis_8.0.6.bb b/meta-oe/recipes-extended/redis/redis_8.0.6.bb
index fe31033328..67126c9fcf 100644
--- a/meta-oe/recipes-extended/redis/redis_8.0.6.bb
+++ b/meta-oe/recipes-extended/redis/redis_8.0.6.bb
@@ -15,6 +15,7 @@ SRC_URI = "http://download.redis.io/releases/${BP}.tar.gz \
file://0003-hack-to-force-use-of-libc-malloc.patch \
file://0004-src-Do-not-reset-FINAL_LIBS.patch \
file://0005-Define-_GNU_SOURCE-to-get-PTHREAD_MUTEX_INITIALIZER.patch \
+ file://CVE-2026-81934.patch \
"
SRC_URI[sha256sum] = "6d0a9913887a4972536f9da226f1575859c34d86354129163260a5f9c6bd4229"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 4/24] sngrep: patch CVE-2026-90558
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 2/24] rabbitmq-c: patch CVE-2026-44236 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 3/24] redis: patch CVE-2026-81934 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 5/24] strongswan: patch CVE-2026-78123 ankur.tyagi85
` (20 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-90558
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../sngrep/sngrep/CVE-2026-90558.patch | 84 +++++++++++++++++++
.../recipes-support/sngrep/sngrep_1.8.2.bb | 4 +-
2 files changed, 87 insertions(+), 1 deletion(-)
create mode 100644 meta-networking/recipes-support/sngrep/sngrep/CVE-2026-90558.patch
diff --git a/meta-networking/recipes-support/sngrep/sngrep/CVE-2026-90558.patch b/meta-networking/recipes-support/sngrep/sngrep/CVE-2026-90558.patch
new file mode 100644
index 0000000000..64fd8044a9
--- /dev/null
+++ b/meta-networking/recipes-support/sngrep/sngrep/CVE-2026-90558.patch
@@ -0,0 +1,84 @@
+From 399346a12ca3bcf7703734fa33b5b3427775b014 Mon Sep 17 00:00:00 2001
+From: Kaian <kaian@irontec.com>
+Date: Fri, 7 Aug 2026 08:45:42 +0200
+Subject: [PATCH] fix: prevent stack buffer overflow in SIP attribute
+ formatting
+
+call_get_attribute() formatted the Call-ID, X-Call-ID and Reason header
+text with an unbounded sprintf("%s"). Call-ID/X-Call-ID can hold up to
+MAX_CALLID_SIZE/MAX_XCALLID_SIZE (1023 bytes) and Reason text is copied
+from the raw payload (up to MAX_SIP_PAYLOAD), while all callers pass a
+255-byte SIP_ATTR_MAXLEN stack buffer (call list rendering, sort compare).
+A SIP message with a long Call-ID, X-Call-ID or Reason header overflowed
+the stack, triggerable via pcap, live capture or HEP/EEP remote capture.
+
+Bound these writes with "%.*s" and SIP_ATTR_MAXLEN - 1. Also fix a
+matching off-by-one in msg_get_attribute(), where the existing "%.*s"
+used SIP_ATTR_MAXLEN as the precision and could write 256 bytes
+(255 chars + NUL) into the 255-byte buffer.
+
+Thanks to TristanInSec for reporting the issue.
+
+(cherry picked from commit 1ff74ee3ab5ff280e8ba976aa8c744dca57eb35b)
+
+CVE: CVE-2026-90558
+Upstream-Status: Backport [https://github.com/irontec/sngrep/commit/1ff74ee3ab5ff280e8ba976aa8c744dca57eb35b]
+
+SIP contract change was dropped during backport as it was introduced in
+v1.8.4[1]
+
+[1]https://github.com/irontec/sngrep/commit/c61a26d90c166f996e31aceefc9c2f8f831ccd86
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/sip_call.c | 6 +++---
+ src/sip_msg.c | 6 +++---
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/sip_call.c b/src/sip_call.c
+index bea879a..68ecb50 100644
+--- a/src/sip_call.c
++++ b/src/sip_call.c
+@@ -257,10 +257,10 @@ call_get_attribute(sip_call_t *call, enum sip_attr_id id, char *value)
+ sprintf(value, "%d", call->index);
+ break;
+ case SIP_ATTR_CALLID:
+- sprintf(value, "%s", call->callid);
++ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, call->callid);
+ break;
+ case SIP_ATTR_XCALLID:
+- sprintf(value, "%s", call->xcallid);
++ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, call->xcallid);
+ break;
+ case SIP_ATTR_MSGCNT:
+ sprintf(value, "%d", vector_count(call->msgs));
+@@ -282,7 +282,7 @@ call_get_attribute(sip_call_t *call, enum sip_attr_id id, char *value)
+ break;
+ case SIP_ATTR_REASON_TXT:
+ if (call->reasontxt)
+- sprintf(value, "%s", call->reasontxt);
++ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, call->reasontxt);
+ break;
+ case SIP_ATTR_WARNING:
+ if (call->warning)
+diff --git a/src/sip_msg.c b/src/sip_msg.c
+index 379a40a..6762862 100644
+--- a/src/sip_msg.c
++++ b/src/sip_msg.c
+@@ -136,13 +136,13 @@ msg_get_attribute(sip_msg_t *msg, int id, char *value)
+ }
+ break;
+ case SIP_ATTR_METHOD:
+- sprintf(value, "%.*s", SIP_ATTR_MAXLEN, sip_get_msg_reqresp_str(msg));
++ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, sip_get_msg_reqresp_str(msg));
+ break;
+ case SIP_ATTR_SIPFROM:
+- sprintf(value, "%.*s", SIP_ATTR_MAXLEN, msg->sip_from);
++ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, msg->sip_from);
+ break;
+ case SIP_ATTR_SIPTO:
+- sprintf(value, "%.*s", SIP_ATTR_MAXLEN, msg->sip_to);
++ sprintf(value, "%.*s", SIP_ATTR_MAXLEN - 1, msg->sip_to);
+ break;
+ case SIP_ATTR_SIPFROMUSER:
+ if (msg->sip_from && (ar = strchr(msg->sip_from, '@'))) {
diff --git a/meta-networking/recipes-support/sngrep/sngrep_1.8.2.bb b/meta-networking/recipes-support/sngrep/sngrep_1.8.2.bb
index 12fe3ececa..1bcbebf554 100644
--- a/meta-networking/recipes-support/sngrep/sngrep_1.8.2.bb
+++ b/meta-networking/recipes-support/sngrep/sngrep_1.8.2.bb
@@ -15,7 +15,9 @@ DEPENDS = "\
ncurses \
"
-SRC_URI = "git://github.com/irontec/sngrep.git;protocol=https;branch=master"
+SRC_URI = "git://github.com/irontec/sngrep.git;protocol=https;branch=master \
+ file://CVE-2026-90558.patch \
+"
SRCREV = "dad1033640f249fa4994f976cf6ee96826c15702"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 5/24] strongswan: patch CVE-2026-78123
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (2 preceding siblings ...)
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 4/24] sngrep: patch CVE-2026-90558 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 6/24] strongswan: patch CVE-2026-78124 ankur.tyagi85
` (19 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78123
[1]https://download.strongswan.org/security/CVE-2026-78123/strongswan-5.0.2-6.0.7_openssl_pkcs7_info_init.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78123).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78123.patch | 51 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 52 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78123.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78123.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78123.patch
new file mode 100644
index 0000000000..5a810f0613
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78123.patch
@@ -0,0 +1,51 @@
+From 23707d346f1f85dba0419c43658a86a80a24f568 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Mon, 1 Jun 2026 17:51:35 +0200
+Subject: [PATCH] openssl: Fix undefined memory access when verifying PKCS#7
+ containers
+
+If the signerInfo or recipientInfo structure doesn't contain
+issuerAndSerialNumber but instead a subjectKeyIdentifier, then the called
+functions will leave the passed name and serial numbers unchanged. While
+openssl_x509_name2id() prevents a NULL-pointer dereference, it tries to
+DER-encode the object at the passed pointer via i2d_X509_NAME().
+Depending on the stack contents, this likely causes a segmentation fault.
+
+Fixes: 3c820cdc232a ("Implement PKCS#7 decryption using openssl")
+Fixes: c61723c69fb5 ("Implement OpenSSL PKCS#7 signed-data parsing and verification")
+Fixes: CVE-2026-78123
+
+CVE: CVE-2026-78123
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/e59b4c96990635a482d6532f7905143f2541d8b5]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libstrongswan/plugins/openssl/openssl_pkcs7.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/libstrongswan/plugins/openssl/openssl_pkcs7.c b/src/libstrongswan/plugins/openssl/openssl_pkcs7.c
+index d9abcf8..b15c8d7 100644
+--- a/src/libstrongswan/plugins/openssl/openssl_pkcs7.c
++++ b/src/libstrongswan/plugins/openssl/openssl_pkcs7.c
+@@ -222,8 +222,8 @@ static auth_cfg_t *verify_signature(CMS_SignerInfo *si,
+ auth_cfg_t *auth, *found = NULL;
+ identification_t *issuer, *serial;
+ chunk_t attrs = chunk_empty, sig, attr;
+- X509_NAME *name;
+- ASN1_INTEGER *snr;
++ X509_NAME *name = NULL;
++ ASN1_INTEGER *snr = NULL;
+ int i;
+
+ if (CMS_SignerInfo_get0_signer_id(si, NULL, &name, &snr) != 1)
+@@ -628,8 +628,8 @@ static bool decrypt(private_openssl_pkcs7_t *this,
+ identification_t *serial, *issuer;
+ private_key_t *private;
+ X509_ALGOR *alg;
+- X509_NAME *name;
+- ASN1_INTEGER *sn;
++ X509_NAME *name = NULL;
++ ASN1_INTEGER *sn = NULL;
+ u_char zero = 0;
+ int oid;
+
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index d6176f000e..4d9fe14eb2 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -10,6 +10,7 @@ DEPENDS:append = "${@bb.utils.contains('DISTRO_FEATURES', 'tpm2', ' tpm2-tss',
SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-47895.patch \
+ file://CVE-2026-78123.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 6/24] strongswan: patch CVE-2026-78124
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (3 preceding siblings ...)
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 5/24] strongswan: patch CVE-2026-78123 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 7/24] strongswan: patch CVE-2026-78126 ankur.tyagi85
` (18 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78124
[1]https://download.strongswan.org/security/CVE-2026-78124/strongswan-5.0.2-6.0.7_openssl_pkcs7_certs_leak.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78124).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78124.patch | 34 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 35 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78124.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78124.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78124.patch
new file mode 100644
index 0000000000..b0b2a9eeef
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78124.patch
@@ -0,0 +1,34 @@
+From 36ce778a76b4b912699a52cf1109394fce109c83 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Mon, 15 Jun 2026 16:02:01 +0200
+Subject: [PATCH] openssl: Fix memory leaks after enumerating certificates in
+ PKCS#7 container
+
+This can be triggered via IKEv1.
+
+Fixes: 04884be3b5f7 ("Implement openssl PKCS#7 certficiate enumeration")
+Fixes: CVE-2026-78124
+
+CVE: CVE-2026-78124
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/49bf0725fa61198d1e29d5b4c2651c9190b2c10c]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libstrongswan/plugins/openssl/openssl_pkcs7.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/src/libstrongswan/plugins/openssl/openssl_pkcs7.c b/src/libstrongswan/plugins/openssl/openssl_pkcs7.c
+index b15c8d7..cefe1ae 100644
+--- a/src/libstrongswan/plugins/openssl/openssl_pkcs7.c
++++ b/src/libstrongswan/plugins/openssl/openssl_pkcs7.c
+@@ -132,6 +132,10 @@ typedef struct {
+ METHOD(enumerator_t, cert_destroy, void,
+ cert_enumerator_t *this)
+ {
++ if (this->certs)
++ {
++ sk_X509_pop_free(this->certs, X509_free);
++ }
+ DESTROY_IF(this->cert);
+ free(this);
+ }
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 4d9fe14eb2..e7a5370f03 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -11,6 +11,7 @@ DEPENDS:append = "${@bb.utils.contains('DISTRO_FEATURES', 'tpm2', ' tpm2-tss',
SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-47895.patch \
file://CVE-2026-78123.patch \
+ file://CVE-2026-78124.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 7/24] strongswan: patch CVE-2026-78126
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (4 preceding siblings ...)
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 6/24] strongswan: patch CVE-2026-78124 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 8/24] strongswan: patch CVE-2026-78127 ankur.tyagi85
` (17 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78126
[1]https://download.strongswan.org/security/CVE-2026-78126/strongswan-4.4.0-6.0.7_eap_aka_sync_fail.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78126).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78126.patch | 37 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 38 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78126.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78126.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78126.patch
new file mode 100644
index 0000000000..9d4ce09d38
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78126.patch
@@ -0,0 +1,37 @@
+From 13aa926cad7ec7f668249b6513c938b8c2e95af4 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Thu, 4 Jun 2026 10:00:02 +0200
+Subject: [PATCH] eap-aka: Only accept AKA-Synchronization-Failure if expected
+
+This fixes a NULL-pointer dereference if the client sends such an error
+before the server issued a challenge and allocated this->rand.
+
+Fixes: 26e246769224 ("ported EAP-AKA branch into trunk")
+Fixes: 4735965fc048 ("EAP servers check if the received EAP message was expected")
+Fixes: CVE-2026-78126
+
+CVE: CVE-2026-78126
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/7bedb451346261370256d390a8c155b86e4b455d]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libcharon/plugins/eap_aka/eap_aka_server.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/libcharon/plugins/eap_aka/eap_aka_server.c b/src/libcharon/plugins/eap_aka/eap_aka_server.c
+index 0712ccc..95d4b03 100644
+--- a/src/libcharon/plugins/eap_aka/eap_aka_server.c
++++ b/src/libcharon/plugins/eap_aka/eap_aka_server.c
+@@ -505,6 +505,12 @@ static status_t process_synchronize(private_eap_aka_server_t *this,
+ simaka_attribute_t type;
+ chunk_t data, auts = chunk_empty;
+
++ if (this->pending != AKA_CHALLENGE)
++ {
++ DBG1(DBG_IKE, "received %N, but not expected",
++ simaka_subtype_names, AKA_SYNCHRONIZATION_FAILURE);
++ return FAILED;
++ }
+ if (this->synchronized)
+ {
+ DBG1(DBG_IKE, "received %N, but peer did already resynchronize",
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index e7a5370f03..82dbd3367c 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -12,6 +12,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-47895.patch \
file://CVE-2026-78123.patch \
file://CVE-2026-78124.patch \
+ file://CVE-2026-78126.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 8/24] strongswan: patch CVE-2026-78127
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (5 preceding siblings ...)
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 7/24] strongswan: patch CVE-2026-78126 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 9/24] strongswan: patch CVE-2026-78129 ankur.tyagi85
` (16 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78127
[1]https://download.strongswan.org/security/CVE-2026-78127/strongswan-5.3.1-6.0.7_message_log_leak.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78127).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78127.patch | 115 ++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 116 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78127.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78127.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78127.patch
new file mode 100644
index 0000000000..4f1358e59b
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78127.patch
@@ -0,0 +1,115 @@
+From b38d55b7df137e599c0364a8f0e6d3e1ab84ed50 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Mon, 8 Jun 2026 09:19:42 +0200
+Subject: [PATCH] message: Avoid memory leak if string buffer for message is
+ too small
+
+This leaked 40 or 80 bytes per parsed message for the enumerators that
+were not destroyed. While triggering an OOM condition will require quite
+a lot of messages and the DoS protection also helps avoiding that this
+is triggered quickly, it all depends on the memory constraints of the
+system and the time available to the attacker. Also, if IKEv1 is allowed,
+it could get quicker as the lack of message IDs doesn't allow dismissing
+unexpected messages before parsing them.
+
+Fixes: 092958c89d52 ("fixed payload debug message")
+Fixes: 6a4a47511f75 ("Show contents of the CP payload in message_t stringification")
+Fixes: CVE-2026-78127
+
+CVE: CVE-2026-78127
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/4b7108ac0f84fbf40da2b510eb6333afa2a54240]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libcharon/encoding/message.c | 23 ++++++++++++-----------
+ 1 file changed, 12 insertions(+), 11 deletions(-)
+
+diff --git a/src/libcharon/encoding/message.c b/src/libcharon/encoding/message.c
+index 8da9a1d..a4bf9cb 100644
+--- a/src/libcharon/encoding/message.c
++++ b/src/libcharon/encoding/message.c
+@@ -1398,7 +1398,7 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ payload->get_type(payload));
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1424,7 +1424,7 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ }
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1454,7 +1454,7 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ eap->get_code(eap), method);
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1495,7 +1495,8 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ attribute->get_type(attribute));
+ if (written >= len || written < 0)
+ {
+- return buf;
++ attributes->destroy(attributes);
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1507,7 +1508,7 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ written = snprintf(pos, len, ")");
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1529,7 +1530,7 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ }
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1544,7 +1545,7 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ frag->get_total_fragments(frag));
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+@@ -1557,16 +1558,16 @@ static char* get_string(private_message_t *this, char *buf, int len)
+ written = snprintf(pos, len, "(%d)", unknown->get_type(unknown));
+ if (written >= len || written < 0)
+ {
+- return buf;
++ goto err;
+ }
+ pos += written;
+ len -= written;
+ }
+ }
+- enumerator->destroy(enumerator);
+-
+- /* remove last space */
+ snprintf(pos, len, " ]");
++
++err:
++ enumerator->destroy(enumerator);
+ return buf;
+ }
+ #endif
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 82dbd3367c..2637c19d1e 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -13,6 +13,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78123.patch \
file://CVE-2026-78124.patch \
file://CVE-2026-78126.patch \
+ file://CVE-2026-78127.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 9/24] strongswan: patch CVE-2026-78129
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (6 preceding siblings ...)
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 8/24] strongswan: patch CVE-2026-78127 ankur.tyagi85
@ 2026-09-24 4:32 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 10/24] strongswan: patch CVE-2026-78133 ankur.tyagi85
` (15 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:32 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78129
[1]https://download.strongswan.org/security/CVE-2026-78129/strongswan-5.6.3-6.0.7_pkcs5_params_dos.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78129).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78129.patch | 155 ++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 156 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78129.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78129.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78129.patch
new file mode 100644
index 0000000000..2a6167dd62
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78129.patch
@@ -0,0 +1,155 @@
+From ec14a504137915cc45080323238c64d348d020eb Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Tue, 23 Jun 2026 11:55:31 +0200
+Subject: [PATCH] pkcs5: Validate parsed parameters to avoid DoS attacks
+
+With the unbounded iterations, an attacker can craft a PKCS#7 file and
+send it during IKEv1 to block the processing thread practically for an
+unlimited amount of time.
+
+As the key length is used for an allocation on the stack, not limiting
+it could cause a crash. We validate it after parsing the params, but
+since `encryption_algorithm_from_oid()` only returns trusted key lengths
+that are lower than the limit, that's fine.
+
+The unlimited salt length had no direct impact (the maximum is bound by
+the accepted message size), but we now limit it as well before cloning.
+
+Fixes: 4076e3ee9121 ("Extract PKCS#5 handling from pkcs8 plugin to separate helper class")
+Fixes: fd1ff46f6143 ("Added support for PKCS#5 v2 schemes when decrypting PKCS#8 files.")
+Fixes: cab127cba66c ("Added support for encrypted PKCS#8 files (for some PKCS#5 v1.5 schemes).")
+Fixes: CVE-2026-78129
+
+CVE: CVE-2026-78129
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/f60a55e36f95e210ab067de295c9f6bacefcdd1a]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libstrongswan/crypto/pkcs5.c | 65 +++++++++++++++++++++++++++++++-
+ 1 file changed, 64 insertions(+), 1 deletion(-)
+
+diff --git a/src/libstrongswan/crypto/pkcs5.c b/src/libstrongswan/crypto/pkcs5.c
+index 822656f..e01010b 100644
+--- a/src/libstrongswan/crypto/pkcs5.c
++++ b/src/libstrongswan/crypto/pkcs5.c
+@@ -14,6 +14,8 @@
+ * for more details.
+ */
+
++#include <inttypes.h>
++
+ #include "pkcs5.h"
+
+ #include <utils/debug.h>
+@@ -22,6 +24,15 @@
+ #include <asn1/asn1_parser.h>
+ #include <credentials/containers/pkcs12.h>
+
++/** maximum accepted length for salts in parsed parameters */
++#define PKCS5_SALT_LEN_MAX 128
++
++/** maximum accepted iteration count in parsed parameters */
++#define PKCS5_ITERATIONS_MAX 1000000
++
++/** maximum key length accepted in parsed parameters */
++#define PKCS5_KEY_LEN_MAX 64
++
+ typedef struct private_pkcs5_t private_pkcs5_t;
+
+ /**
+@@ -379,6 +390,41 @@ METHOD(pkcs5_t, decrypt, bool,
+ keymat, key, iv);
+ }
+
++/**
++ * Make sure the salt has an appropriate length
++ */
++static bool validate_salt_length(chunk_t salt)
++{
++ if (salt.len > PKCS5_SALT_LEN_MAX)
++ {
++ DBG1(DBG_ASN, " salt length %zu exceeds maximum of %zu bytes",
++ salt.len, (size_t)PKCS5_SALT_LEN_MAX);
++ return FALSE;
++ }
++ return TRUE;
++}
++
++/**
++ * Validate that parsed parameters are in an allowed range
++ */
++static bool validate_params(private_pkcs5_t *this)
++{
++ if (!this->iterations || this->iterations > PKCS5_ITERATIONS_MAX)
++ {
++ DBG1(DBG_ASN, " iteration count %" PRIu64 " is out of range "
++ "(1-%" PRIu64 ")", this->iterations,
++ (uint64_t)PKCS5_ITERATIONS_MAX);
++ return FALSE;
++ }
++ if (this->keylen > PKCS5_KEY_LEN_MAX)
++ {
++ DBG1(DBG_ASN, " key length %zu exceeds maximum of %zu bytes",
++ this->keylen, (size_t)PKCS5_KEY_LEN_MAX);
++ return FALSE;
++ }
++ return TRUE;
++}
++
+ /**
+ * ASN.1 definition of a PBEParameter structure
+ */
+@@ -399,7 +445,7 @@ static bool parse_pbes1_params(private_pkcs5_t *this, chunk_t blob, int level0)
+ asn1_parser_t *parser;
+ chunk_t object;
+ int objectID;
+- bool success;
++ bool success = FALSE;
+
+ parser = asn1_parser_create(pbeParameterObjects, blob);
+ parser->set_top_level(parser, level0);
+@@ -410,6 +456,10 @@ static bool parse_pbes1_params(private_pkcs5_t *this, chunk_t blob, int level0)
+ {
+ case PBEPARAM_SALT:
+ {
++ if (!validate_salt_length(object))
++ {
++ goto end;
++ }
+ this->salt = chunk_clone(object);
+ break;
+ }
+@@ -421,6 +471,11 @@ static bool parse_pbes1_params(private_pkcs5_t *this, chunk_t blob, int level0)
+ }
+ }
+ success = parser->success(parser);
++ if (success)
++ {
++ success = validate_params(this);
++ }
++end:
+ parser->destroy(parser);
+ return success;
+ }
+@@ -471,6 +526,10 @@ static bool parse_pbkdf2_params(private_pkcs5_t *this, chunk_t blob, int level0)
+ {
+ case PBKDF2_SALT:
+ {
++ if (!validate_salt_length(object))
++ {
++ goto end;
++ }
+ this->salt = chunk_clone(object);
+ break;
+ }
+@@ -500,6 +559,10 @@ static bool parse_pbkdf2_params(private_pkcs5_t *this, chunk_t blob, int level0)
+ }
+ }
+ success = parser->success(parser);
++ if (success)
++ {
++ success = validate_params(this);
++ }
+ end:
+ parser->destroy(parser);
+ return success;
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 2637c19d1e..c8f956f4d8 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -14,6 +14,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78124.patch \
file://CVE-2026-78126.patch \
file://CVE-2026-78127.patch \
+ file://CVE-2026-78129.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 10/24] strongswan: patch CVE-2026-78133
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (7 preceding siblings ...)
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 9/24] strongswan: patch CVE-2026-78129 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 11/24] strongswan: patch CVE-2026-78131 ankur.tyagi85
` (14 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78133
[1]https://download.strongswan.org/security/CVE-2026-78133/strongswan-6.0.0-6.0.7_ikev2_rekey_collision.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78133).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78133.patch | 620 ++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 621 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78133.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78133.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78133.patch
new file mode 100644
index 0000000000..126f818023
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78133.patch
@@ -0,0 +1,620 @@
+From 3f5768c48bc9dff62511c91157e0a9bd12b2159b Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Fri, 5 Jun 2026 08:15:46 +0200
+Subject: [PATCH] ikev2: Prevent use-after-free during collision after passive
+ multi-KE rekeying failed
+
+During a multi-KE rekey collision, where the initial response to the
+active rekeying is delayed (or withheld), the active task already keeps
+track of the passive task to eventually resolve the collision (it can
+only do so once all nonces are known).
+
+If the passive task then fails, e.g. due to a missing or invalid KE
+payload, and completes with SUCCESS, `collide()` previously recognized
+that the passive task is not yet complete returned FALSE, which caused
+the task manager to destroy the task. However, the reference in the
+active task would remain. So once the active rekeying progresses and
+the collision is resolved, that dangling pointer would get dereferenced
+for an indirect method call. This happens via the `get_lower_nonce`
+function pointer of the `child_create_t` instance in the private task
+struct. So besides having to be authenticated, an attacker has to get
+two indirections right to exploit this flaw for a potential RCE.
+Otherwise, the effects are a crash or basically undefined behavior
+triggered by the method call.
+
+By passing whether the passive task is done (and would get destroyed),
+the active tasks can properly clear the held reference.
+
+Note that this patch includes another fix for a state change during
+Child SA rekeying that's included in 6.1.0 (4611f41b1e14 ("child-rekey:
+Only reset state of SAs not actively rekeyed if passive rekeying
+fails")).
+
+Fixes: d2b2e1b3fae8 ("ikev2: Make CHILD_SAs properly trackable during rekey collisions")
+Fixes: ca3e6d2d144e ("ike-rekey: Support IKE_SA rekeying with multiple key exchanges")
+Fixes: CVE-2026-78133
+
+CVE: CVE-2026-78133
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/eb615b452539461d57503f50041f01773c1ccf86]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libcharon/sa/ikev2/task_manager_v2.c | 13 +-
+ src/libcharon/sa/ikev2/tasks/child_rekey.c | 47 ++++--
+ src/libcharon/sa/ikev2/tasks/child_rekey.h | 3 +-
+ src/libcharon/sa/ikev2/tasks/ike_rekey.c | 40 +++--
+ src/libcharon/sa/ikev2/tasks/ike_rekey.h | 3 +-
+ src/libcharon/tests/suites/test_child_rekey.c | 136 ++++++++++++++++
+ src/libcharon/tests/suites/test_ike_rekey.c | 147 ++++++++++++++++++
+ 7 files changed, 361 insertions(+), 28 deletions(-)
+
+diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c
+index 0f3b937..5a19ce8 100644
+--- a/src/libcharon/sa/ikev2/task_manager_v2.c
++++ b/src/libcharon/sa/ikev2/task_manager_v2.c
+@@ -927,7 +927,8 @@ static status_t process_response(private_task_manager_t *this,
+ * Handle exchange collisions, returns TRUE if the given passive task was
+ * adopted by the active task and the task manager lost control over it.
+ */
+-static bool handle_collisions(private_task_manager_t *this, task_t *task)
++static bool handle_collisions(private_task_manager_t *this, task_t *task,
++ bool done)
+ {
+ enumerator_t *enumerator;
+ task_t *active;
+@@ -951,7 +952,7 @@ static bool handle_collisions(private_task_manager_t *this, task_t *task)
+ if (type == TASK_IKE_REKEY || type == TASK_IKE_DELETE)
+ {
+ ike_rekey_t *rekey = (ike_rekey_t*)active;
+- adopted = rekey->collide(rekey, task);
++ adopted = rekey->collide(rekey, task, done);
+ break;
+ }
+ continue;
+@@ -959,7 +960,7 @@ static bool handle_collisions(private_task_manager_t *this, task_t *task)
+ if (type == TASK_CHILD_REKEY)
+ {
+ child_rekey_t *rekey = (child_rekey_t*)active;
+- adopted = rekey->collide(rekey, task);
++ adopted = rekey->collide(rekey, task, done);
+ break;
+ }
+ continue;
+@@ -1011,14 +1012,14 @@ static status_t build_response(private_task_manager_t *this, message_t *request)
+ case SUCCESS:
+ /* task completed, remove it */
+ array_remove_at(this->passive_tasks, enumerator);
+- if (!handle_collisions(this, task))
++ if (!handle_collisions(this, task, TRUE))
+ {
+ task->destroy(task);
+ }
+ break;
+ case NEED_MORE:
+ /* processed, but task needs another exchange */
+- if (handle_collisions(this, task))
++ if (handle_collisions(this, task, FALSE))
+ {
+ array_remove_at(this->passive_tasks, enumerator);
+ }
+@@ -1029,7 +1030,7 @@ static status_t build_response(private_task_manager_t *this, message_t *request)
+ /* FALL */
+ case DESTROY_ME:
+ /* destroy IKE_SA, but SEND response first */
+- if (handle_collisions(this, task))
++ if (handle_collisions(this, task, FALSE))
+ {
+ array_remove_at(this->passive_tasks, enumerator);
+ }
+diff --git a/src/libcharon/sa/ikev2/tasks/child_rekey.c b/src/libcharon/sa/ikev2/tasks/child_rekey.c
+index fb3ba2a..e984668 100644
+--- a/src/libcharon/sa/ikev2/tasks/child_rekey.c
++++ b/src/libcharon/sa/ikev2/tasks/child_rekey.c
+@@ -403,7 +403,7 @@ METHOD(task_t, build_r, status_t,
+ child_sa_t *child_sa, *old_replacement;
+ child_sa_state_t state = CHILD_INSTALLED;
+ uint32_t reqid;
+- bool followup_sent = FALSE;
++ bool active, followup_sent = FALSE;
+
+ if (!this->child_sa)
+ {
+@@ -423,7 +423,8 @@ METHOD(task_t, build_r, status_t,
+ message->add_notify(message, TRUE, TEMPORARY_FAILURE, chunk_empty);
+ return SUCCESS;
+ }
+- if (actively_rekeying(this, &followup_sent) && followup_sent)
++ active = actively_rekeying(this, &followup_sent);
++ if (active && followup_sent)
+ {
+ DBG1(DBG_IKE, "peer initiated rekeying, but we did too and already "
+ "sent IKE_FOLLOWUP_KE");
+@@ -483,8 +484,9 @@ METHOD(task_t, build_r, status_t,
+ /* like installing the outbound SA, we only trigger the child-rekey
+ * event once the old SA is deleted */
+ }
+- else if (this->child_sa->get_state(this->child_sa) == CHILD_REKEYING)
+- { /* rekeying failed, reuse old child */
++ else if (!active &&
++ this->child_sa->get_state(this->child_sa) == CHILD_REKEYING)
++ { /* rekeying failed, reuse old child, unless we are actively rekeying */
+ this->child_sa->set_state(this->child_sa, state);
+ }
+ return SUCCESS;
+@@ -1127,8 +1129,22 @@ METHOD(child_rekey_t, handle_delete, child_rekey_collision_t,
+ return CHILD_REKEY_COLLISION_NONE;
+ }
+
++/**
++ * Clear the colliding passive task if it did not complete successfully.
++ */
++static void clear_collision(private_child_rekey_t *this, task_t *other)
++{
++ if (this->collision == other)
++ {
++ DBG1(DBG_IKE, "colliding passive rekeying for CHILD_SA %s{%u} "
++ "failed", this->child_sa->get_name(this->child_sa),
++ this->child_sa->get_unique_id(this->child_sa));
++ this->collision = NULL;
++ }
++}
++
+ METHOD(child_rekey_t, collide, bool,
+- private_child_rekey_t *this, task_t *other)
++ private_child_rekey_t *this, task_t *other, bool done)
+ {
+ private_child_rekey_t *rekey = (private_child_rekey_t*)other;
+ child_sa_t *other_child;
+@@ -1142,16 +1158,25 @@ METHOD(child_rekey_t, collide, bool,
+ other_child = rekey->child_create->get_child(rekey->child_create);
+ if (!other_child)
+ {
+- /* ignore passive tasks that did not successfully create a CHILD_SA */
++ /* ignore passive tasks that did not successfully create a CHILD_SA,
++ * if we are already tracking it in the multi-KE case, clear it */
++ clear_collision(this, other);
+ return FALSE;
+ }
+ if (other_child->get_state(other_child) != CHILD_INSTALLED)
+ {
+- DBG1(DBG_IKE, "colliding passive rekeying for CHILD_SA %s{%u} is not "
+- "yet complete", this->child_sa->get_name(this->child_sa),
+- this->child_sa->get_unique_id(this->child_sa));
+- /* we do reference the task to check its state later */
+- this->collision = other;
++ if (done)
++ { /* passive task failed, clear it if necessary */
++ clear_collision(this, other);
++ }
++ else
++ {
++ DBG1(DBG_IKE, "colliding passive rekeying for CHILD_SA %s{%u} is "
++ "not yet complete", this->child_sa->get_name(this->child_sa),
++ this->child_sa->get_unique_id(this->child_sa));
++ /* we do reference the task to check its state later */
++ this->collision = other;
++ }
+ return FALSE;
+ }
+ if (this->collision && this->collision != other)
+diff --git a/src/libcharon/sa/ikev2/tasks/child_rekey.h b/src/libcharon/sa/ikev2/tasks/child_rekey.h
+index a8daed7..fef0bba 100644
+--- a/src/libcharon/sa/ikev2/tasks/child_rekey.h
++++ b/src/libcharon/sa/ikev2/tasks/child_rekey.h
+@@ -79,10 +79,11 @@ struct child_rekey_t {
+ * are going on and notifies the active task by passing the passive.
+ *
+ * @param other passive task
++ * @param done passive task is done and gets destroyed if not adopted
+ * @return whether the task was adopted and should be removed from
+ * the task manager's control
+ */
+- bool (*collide)(child_rekey_t* this, task_t *other);
++ bool (*collide)(child_rekey_t* this, task_t *other, bool done);
+ };
+
+ /**
+diff --git a/src/libcharon/sa/ikev2/tasks/ike_rekey.c b/src/libcharon/sa/ikev2/tasks/ike_rekey.c
+index c7e8ffb..f275d2d 100644
+--- a/src/libcharon/sa/ikev2/tasks/ike_rekey.c
++++ b/src/libcharon/sa/ikev2/tasks/ike_rekey.c
+@@ -743,8 +743,23 @@ METHOD(ike_rekey_t, did_collide, bool,
+ return this->collision != NULL;
+ }
+
++/**
++ * Clear the colliding passive task if it did not complete successfully.
++ */
++static bool clear_collision(private_ike_rekey_t *this,
++ private_ike_rekey_t *other)
++{
++ if (this->collision == other)
++ {
++ DBG1(DBG_IKE, "colliding passive rekeying failed, ignore");
++ this->collision = NULL;
++ return TRUE;
++ }
++ return FALSE;
++}
++
+ METHOD(ike_rekey_t, collide, bool,
+- private_ike_rekey_t* this, task_t *other)
++ private_ike_rekey_t* this, task_t *other, bool done)
+ {
+ DBG1(DBG_IKE, "detected %N collision with %N", task_type_names,
+ TASK_IKE_REKEY, task_type_names, other->get_type(other));
+@@ -760,23 +775,30 @@ METHOD(ike_rekey_t, collide, bool,
+
+ if (!rekey->ike_init)
+ {
+- DBG1(DBG_IKE, "colliding exchange did not result in an IKE_SA, "
+- "ignore");
+- if (this->collision == rekey)
++ if (!clear_collision(this, rekey))
+ {
+- this->collision = NULL;
++ DBG1(DBG_IKE, "colliding exchange did not result in an "
++ "IKE_SA, ignore");
+ }
+ break;
+ }
+- /* we keep track of the passive exchange in any case, if not
+- * complete yet, this method might be called again later */
+- this->collision = rekey;
++ /* we keep track of the passive exchange, if not complete yet, this
++ * method might be called again later */
+ if (rekey->flags & IKE_REKEY_DONE)
+ {
++ this->collision = rekey;
+ this->flags |= IKE_REKEY_ADOPTED_PASSIVE;
+ return TRUE;
+ }
+- DBG1(DBG_IKE, "colliding passive exchange is not yet complete");
++ else if (done)
++ { /* passive task failed, clear it if necessary */
++ clear_collision(this, rekey);
++ }
++ else
++ {
++ DBG1(DBG_IKE, "colliding passive exchange is not yet complete");
++ this->collision = rekey;
++ }
+ break;
+ }
+ default:
+diff --git a/src/libcharon/sa/ikev2/tasks/ike_rekey.h b/src/libcharon/sa/ikev2/tasks/ike_rekey.h
+index 5fab349..e68fa62 100644
+--- a/src/libcharon/sa/ikev2/tasks/ike_rekey.h
++++ b/src/libcharon/sa/ikev2/tasks/ike_rekey.h
+@@ -54,10 +54,11 @@ struct ike_rekey_t {
+ * are going on and notifies the active task by passing the passive.
+ *
+ * @param other passive task
++ * @param done passive task is done and gets destroyed if not adopted
+ * @return whether the task was adopted and should be removed from
+ * the task manager's control
+ */
+- bool (*collide)(ike_rekey_t* this, task_t *other);
++ bool (*collide)(ike_rekey_t* this, task_t *other, bool done);
+ };
+
+ /**
+diff --git a/src/libcharon/tests/suites/test_child_rekey.c b/src/libcharon/tests/suites/test_child_rekey.c
+index 1c81e75..4ef081a 100644
+--- a/src/libcharon/tests/suites/test_child_rekey.c
++++ b/src/libcharon/tests/suites/test_child_rekey.c
+@@ -2546,6 +2546,141 @@ START_TEST(test_collision_delayed_response_multi_ke)
+ }
+ END_TEST
+
++/**
++ * Remove the KE payload from the IKE_FOLLOWUP_KE request
++ */
++static bool remove_ke(listener_t *listener, ike_sa_t *ike_sa,
++ message_t *message, bool incoming, bool plain)
++{
++ if (plain && incoming &&
++ message->get_exchange_type(message) == IKE_FOLLOWUP_KE &&
++ message->get_request(message))
++ {
++ enumerator_t *enumerator = message->create_payload_enumerator(message);
++ payload_t *pld;
++
++ while (enumerator->enumerate(enumerator, &pld))
++ {
++ if (pld->get_type(pld) == PLV2_KEY_EXCHANGE)
++ {
++ message->remove_payload_at(message, enumerator);
++ pld->destroy(pld);
++ break;
++ }
++ }
++ enumerator->destroy(enumerator);
++ free(listener);
++ return FALSE;
++ }
++ return TRUE;
++}
++
++#define remove_ke_from_ike_followup_ke() ({ \
++ listener_t *_ke_listener; \
++ INIT(_ke_listener, \
++ .message = remove_ke, \
++ ); \
++ exchange_test_helper->add_listener(exchange_test_helper, _ke_listener); \
++})
++
++/**
++ * This simulates an incorrect behavior by the peer. It triggers a collision by
++ * not responding to the initial CREATE_CHILD_SA and then sends an invalid
++ * IKE_FOLLOWUP_KE (in this case the KE payload is missing). The initiator
++ * has to correctly track and then untrack the passive rekey task.
++ *
++ * Peer A Peer B
++ * rekey ----\ /---- rekey
++ * \-----/----> detect collision and withhold response
++ * detect collision <---------/
++ * ---------------->
++ * handle failure <---------------- send invalid additional KE
++ * handle rekey <---------------- send withheld response
++ */
++START_TEST(test_collision_delayed_response_multi_ke_failure)
++{
++ ike_sa_t *a, *b;
++ message_t *msg;
++
++ assert_track_sas_start();
++
++ exchange_test_helper->establish_sa(exchange_test_helper,
++ &a, &b, &multi_ke_conf);
++
++ /* make sure the responder wins the collision so it continues */
++ exchange_test_helper->nonce_first_byte = 0x00;
++ initiate_rekey(a, 1);
++ assert_ipsec_sas_installed(a, 1, 2);
++ exchange_test_helper->nonce_first_byte = 0xff;
++ initiate_rekey(b, 2);
++ assert_ipsec_sas_installed(b, 1, 2);
++
++ /* these should not get called as no SA goes down or gets rekeyed */
++ assert_hook_not_called(child_updown);
++ assert_hook_not_called(child_rekey);
++
++ /* CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } --> */
++ exchange_test_helper->nonce_first_byte = 0xff;
++ exchange_test_helper->process_message(exchange_test_helper, b, NULL);
++ assert_child_sa_state(b, 2, CHILD_REKEYING, CHILD_OUTBOUND_INSTALLED);
++ assert_ipsec_sas_installed(b, 1, 2);
++
++ /* <-- CREATE_CHILD_SA { N(REKEY_SA), SA, Ni, [KEi,] TSi, TSr } */
++ exchange_test_helper->nonce_first_byte = 0xff;
++ exchange_test_helper->process_message(exchange_test_helper, a, NULL);
++ assert_child_sa_state(a, 1, CHILD_REKEYING, CHILD_OUTBOUND_INSTALLED);
++ assert_ipsec_sas_installed(a, 1, 2);
++
++ /* the responder is not responding */
++ msg = exchange_test_helper->sender->dequeue(exchange_test_helper->sender);
++
++ /* CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } --> */
++ exchange_test_helper->process_message(exchange_test_helper, b, NULL);
++ assert_num_tasks(b, 0, TASK_QUEUE_PASSIVE);
++ assert_num_tasks(b, 1, TASK_QUEUE_ACTIVE);
++ assert_child_sa_state(b, 2, CHILD_REKEYING, CHILD_OUTBOUND_INSTALLED);
++ assert_ipsec_sas_installed(b, 1, 2);
++
++ /* remove the KE payload in the IKE_FOLLOWUP_KE request */
++ remove_ke_from_ike_followup_ke();
++
++ /* <-- IKE_FOLLOWUP_KE { N(ADD_KE) } */
++ assert_no_payload(IN, PLV2_KEY_EXCHANGE);
++ assert_single_notify(OUT, INVALID_SYNTAX);
++ exchange_test_helper->process_message(exchange_test_helper, a, NULL);
++ assert_child_sa_state(a, 1, CHILD_REKEYING, CHILD_OUTBOUND_INSTALLED);
++ assert_ipsec_sas_installed(a, 1, 2);
++ assert_num_tasks(a, 0, TASK_QUEUE_PASSIVE);
++
++ /* <-- CREATE_CHILD_SA { SA, Nr, [KEr,] TSi, TSr } (delayed) */
++ exchange_test_helper->process_message(exchange_test_helper, a, msg);
++ assert_num_tasks(a, 0, TASK_QUEUE_PASSIVE);
++ assert_num_tasks(a, 1, TASK_QUEUE_ACTIVE);
++ assert_child_sa_state(a, 1, CHILD_REKEYING, CHILD_OUTBOUND_INSTALLED);
++ assert_ipsec_sas_installed(a, 1, 2);
++
++ /* drop the STATE_NOT_FOUND error message from the initiator */
++ msg = exchange_test_helper->sender->dequeue(exchange_test_helper->sender);
++ msg->destroy(msg);
++
++ /* since we explicitly forced the responder to win, it already removed
++ * the passive task it won't accept the request */
++
++ /* IKE_FOLLOWUP_KE { KEi, N(ADD_KE) } --> */
++ assert_payload(IN, PLV2_KEY_EXCHANGE);
++ assert_notify(IN, ADDITIONAL_KEY_EXCHANGE);
++ exchange_test_helper->process_message(exchange_test_helper, b, NULL);
++
++ /* child_rekey/child_updown */
++ assert_hook();
++ assert_hook();
++ assert_track_sas(2, 2);
++
++ call_ikesa(a, destroy);
++ call_ikesa(b, destroy);
++}
++END_TEST
++
+ /**
+ * In this scenario one of the peers does not notice that there is a
+ * rekey collision:
+@@ -4436,6 +4571,7 @@ Suite *child_rekey_suite_create()
+ tcase_add_loop_test(tc, test_collision_delayed_response, 0, 4);
+ tcase_add_loop_test(tc, test_collision_delayed_response_delete, 0, 4);
+ tcase_add_loop_test(tc, test_collision_delayed_response_multi_ke, 0, 4);
++ tcase_add_test(tc, test_collision_delayed_response_multi_ke_failure);
+ tcase_add_loop_test(tc, test_collision_delayed_request, 0, 6);
+ tcase_add_loop_test(tc, test_collision_delayed_request_more, 0, 3);
+ tcase_add_loop_test(tc, test_collision_delayed_request_more_delete, 0, 3);
+diff --git a/src/libcharon/tests/suites/test_ike_rekey.c b/src/libcharon/tests/suites/test_ike_rekey.c
+index c6691ac..2c41022 100644
+--- a/src/libcharon/tests/suites/test_ike_rekey.c
++++ b/src/libcharon/tests/suites/test_ike_rekey.c
+@@ -1784,6 +1784,152 @@ START_TEST(test_collision_delayed_response_multi_ke)
+ }
+ END_TEST
+
++/**
++ * Remove the ADDITIONAL_KEY_EXCHANGE notify payload from the IKE_FOLLOWUP_KE
++ * request
++ */
++static bool remove_notify(listener_t *listener, ike_sa_t *ike_sa,
++ message_t *message, bool incoming, bool plain)
++{
++ if (plain && incoming &&
++ message->get_exchange_type(message) == IKE_FOLLOWUP_KE &&
++ message->get_request(message))
++ {
++ enumerator_t *enumerator = message->create_payload_enumerator(message);
++ payload_t *pld;
++
++ while (enumerator->enumerate(enumerator, &pld))
++ { /* we only expect one notify, so just remove the first */
++ if (pld->get_type(pld) == PLV2_NOTIFY)
++ {
++ message->remove_payload_at(message, enumerator);
++ pld->destroy(pld);
++ break;
++ }
++ }
++ enumerator->destroy(enumerator);
++ free(listener);
++ return FALSE;
++ }
++ return TRUE;
++}
++
++#define remove_notify_from_ike_followup_ke() ({ \
++ listener_t *_ke_listener; \
++ INIT(_ke_listener, \
++ .message = remove_notify, \
++ ); \
++ exchange_test_helper->add_listener(exchange_test_helper, _ke_listener); \
++})
++
++/**
++ * This simulates an incorrect behavior by the peer. It triggers a collision by
++ * not responding to the initial CREATE_CHILD_SA and then sends an invalid
++ * IKE_FOLLOWUP_KE (in this case by removing the ADDITIONAL_KEY_EXCHANGE
++ * notify). The initiator has to correctly track and then untrack the passive
++ * rekey task.
++ *
++ * Peer A Peer B
++ * rekey ----\ /---- rekey
++ * \-----/----> detect collision and withhold response
++ * detect collision <---------/
++ * ---------------->
++ * handle failure <---------------- send invalid additional KE
++ * handle rekey <---------------- send withheld response
++ */
++START_TEST(test_collision_delayed_response_multi_ke_failure)
++{
++ ike_sa_t *a, *b;
++ message_t *msg;
++
++ assert_track_sas_start();
++
++ exchange_test_helper->establish_sa(exchange_test_helper,
++ &a, &b, &multi_ke_conf);
++
++ /* these should not get called as no SA goes down or gets rekeyed */
++ assert_hook_not_called(ike_updown);
++ assert_hook_not_called(ike_rekey);
++ assert_hook_not_called(child_updown);
++
++ /* make sure the responder wins the collision so it continues */
++ exchange_test_helper->nonce_first_byte = 0x00;
++ initiate_rekey(a);
++ exchange_test_helper->nonce_first_byte = 0xff;
++ initiate_rekey(b);
++
++ /* CREATE_CHILD_SA { SA, Ni, KEi } --> */
++ exchange_test_helper->nonce_first_byte = 0xff;
++ exchange_test_helper->process_message(exchange_test_helper, b, NULL);
++ assert_ike_sa_state(b, IKE_REKEYING);
++ assert_child_sa_count(b, 1);
++ assert_ike_sa_count(0);
++
++ /* <-- CREATE_CHILD_SA { SA, Ni, KEi } */
++ exchange_test_helper->nonce_first_byte = 0xff;
++ exchange_test_helper->process_message(exchange_test_helper, a, NULL);
++ assert_ike_sa_state(a, IKE_REKEYING);
++ assert_child_sa_count(a, 1);
++ assert_ike_sa_count(0);
++
++ /* the responder is not responding */
++ msg = exchange_test_helper->sender->dequeue(exchange_test_helper->sender);
++
++ /* simplify next steps by checking in original IKE_SAs */
++ charon->ike_sa_manager->checkin(charon->ike_sa_manager, a);
++ charon->ike_sa_manager->checkin(charon->ike_sa_manager, b);
++ assert_ike_sa_count(2);
++
++ /* CREATE_CHILD_SA { SA, Nr, KEr, N(ADD_KE) } --> */
++ assert_notify(IN, ADDITIONAL_KEY_EXCHANGE);
++ exchange_test_helper->process_message(exchange_test_helper, b, NULL);
++ assert_num_tasks(b, 0, TASK_QUEUE_PASSIVE);
++ assert_num_tasks(b, 1, TASK_QUEUE_ACTIVE);
++ assert_ike_sa_state(b, IKE_REKEYING);
++ assert_ike_sa_count(2);
++
++ /* remove the ADD_KE notify from the IKE_FOLLOWUP_KE request */
++ remove_notify_from_ike_followup_ke();
++
++ /* <-- IKE_FOLLOWUP_KE { KEi } */
++ assert_payload(IN, PLV2_KEY_EXCHANGE);
++ assert_no_notify(IN, ADDITIONAL_KEY_EXCHANGE);
++ assert_single_notify(OUT, STATE_NOT_FOUND);
++ exchange_test_helper->process_message(exchange_test_helper, a, NULL);
++ assert_ike_sa_state(a, IKE_REKEYING);
++ assert_child_sa_count(a, 1);
++ assert_ike_sa_count(2);
++
++ /* <-- CREATE_CHILD_SA { SA, Nr, KEr } (delayed) */
++ exchange_test_helper->process_message(exchange_test_helper, a, msg);
++ assert_num_tasks(a, 0, TASK_QUEUE_PASSIVE);
++ assert_num_tasks(a, 1, TASK_QUEUE_ACTIVE);
++ assert_ike_sa_state(a, IKE_REKEYING);
++ assert_child_sa_count(a, 1);
++ assert_ike_sa_count(2);
++
++ /* drop the STATE_NOT_FOUND error message from the initiator */
++ msg = exchange_test_helper->sender->dequeue(exchange_test_helper->sender);
++ msg->destroy(msg);
++
++ /* since we explicitly forced the responder to win, it already removed
++ * the passive task it won't accept the request */
++
++ /* IKE_FOLLOWUP_KE { KEi, N(ADD_KE) } --> */
++ assert_payload(IN, PLV2_KEY_EXCHANGE);
++ assert_notify(IN, ADDITIONAL_KEY_EXCHANGE);
++ exchange_test_helper->process_message(exchange_test_helper, b, NULL);
++
++ /* ike_updown/rekey/child_updown */
++ assert_hook();
++ assert_hook();
++ assert_hook();
++ assert_track_sas(2, 2);
++
++ charon->ike_sa_manager->flush(charon->ike_sa_manager);
++}
++END_TEST
++
+ /**
+ * In this scenario one of the peers does not notice that there is a rekey
+ * collision because the other request is dropped:
+@@ -2590,6 +2736,7 @@ Suite *ike_rekey_suite_create()
+ tcase_add_loop_test(tc, test_collision_ke_invalid_delayed_retry, 0, 3);
+ tcase_add_loop_test(tc, test_collision_delayed_response, 0, 4);
+ tcase_add_loop_test(tc, test_collision_delayed_response_multi_ke, 0, 4);
++ tcase_add_test(tc, test_collision_delayed_response_multi_ke_failure);
+ tcase_add_loop_test(tc, test_collision_dropped_request, 0, 3);
+ tcase_add_loop_test(tc, test_collision_delayed_request, 0, 3);
+ tcase_add_loop_test(tc, test_collision_delayed_request_and_delete, 0, 3);
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index c8f956f4d8..4d13507151 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -15,6 +15,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78126.patch \
file://CVE-2026-78127.patch \
file://CVE-2026-78129.patch \
+ file://CVE-2026-78133.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 11/24] strongswan: patch CVE-2026-78131
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (8 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 10/24] strongswan: patch CVE-2026-78133 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130 ankur.tyagi85
` (13 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78131
[1]https://download.strongswan.org/security/CVE-2026-78131/strongswan-5.5.3-6.0.7_x509_ac_leaks.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78131).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78131.patch | 86 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 87 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78131.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78131.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78131.patch
new file mode 100644
index 0000000000..da53f8e5a0
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78131.patch
@@ -0,0 +1,86 @@
+From d1d29ac675b42a8c4a6454db84803bfecf5a0d99 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Fri, 12 Jun 2026 15:55:43 +0200
+Subject: [PATCH] x509: Fix memory leaks when parsing attribute certificates
+
+This can be triggered by an attribute certificate with lots of GeneralName
+entries or AuthorityKeyIdentifier extensions. There is no verification
+before the certificate is parsed.
+
+Fixes: 3134379ac7f1 ("x509: Fix some whitespaces and do some minor style cleanups in acert")
+Fixes: 26930a8c3e42 ("certificate factory can load certs from file")
+Fixes: CVE-2026-78131
+
+CVE: CVE-2026-78131
+Upstream-Status: Backport [1][2]
+
+[1]https://github.com/strongswan/strongswan/commit/23c9b9a2708e4958292d828424523fa63c0be829
+[2]https://github.com/strongswan/strongswan/commit/9762cc3b091b423543510113a5d05215daf16951
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libstrongswan/plugins/x509/x509_ac.c | 33 +++++++-----------------
+ 1 file changed, 9 insertions(+), 24 deletions(-)
+
+diff --git a/src/libstrongswan/plugins/x509/x509_ac.c b/src/libstrongswan/plugins/x509/x509_ac.c
+index 3fc5de2..68b7cf9 100644
+--- a/src/libstrongswan/plugins/x509/x509_ac.c
++++ b/src/libstrongswan/plugins/x509/x509_ac.c
+@@ -186,41 +186,25 @@ extern bool x509_parse_generalNames(chunk_t blob, int level0, bool implicit,
+ static bool parse_directoryName(chunk_t blob, int level, bool implicit,
+ identification_t **name)
+ {
+- identification_t *directoryName;
+- enumerator_t *enumerator;
+- bool first = TRUE;
+ linked_list_t *list;
+
+ list = linked_list_create();
+ if (!x509_parse_generalNames(blob, level, implicit, list))
+ {
+- list->destroy(list);
++ list->destroy_offset(list, offsetof(identification_t, destroy));
+ return FALSE;
+ }
+-
+- enumerator = list->create_enumerator(list);
+- while (enumerator->enumerate(enumerator, &directoryName))
+- {
+- if (first)
+- {
+- *name = directoryName;
+- first = FALSE;
+- }
+- else
+- {
+- DBG1(DBG_ASN, "more than one directory name - first selected");
+- directoryName->destroy(directoryName);
+- break;
+- }
+- }
+- enumerator->destroy(enumerator);
+- list->destroy(list);
+-
+- if (first)
++ if (list->remove_first(list, (void**)name) != SUCCESS)
+ {
+ DBG1(DBG_ASN, "no directoryName found");
++ list->destroy(list);
+ return FALSE;
+ }
++ if (list->get_count(list))
++ {
++ DBG1(DBG_ASN, "more than one directory name - first selected");
++ }
++ list->destroy_offset(list, offsetof(identification_t, destroy));
+ return TRUE;
+ }
+
+@@ -539,6 +523,7 @@ static bool parse_certificate(private_x509_ac_t *this)
+ DBG2(DBG_ASN, " need to parse crlDistributionPoints");
+ break;
+ case OID_AUTHORITY_KEY_ID:
++ chunk_free(&this->authKeyIdentifier);
+ this->authKeyIdentifier =
+ x509_parse_authorityKeyIdentifier(object,
+ level, &this->authKeySerialNumber);
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 4d13507151..19f1cc2f69 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -16,6 +16,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78127.patch \
file://CVE-2026-78129.patch \
file://CVE-2026-78133.patch \
+ file://CVE-2026-78131.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (9 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 11/24] strongswan: patch CVE-2026-78131 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-10-05 9:49 ` Anuj Mittal
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 13/24] strongswan: patch CVE-2026-78132 ankur.tyagi85
` (12 subsequent siblings)
23 siblings, 1 reply; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78130
[1]https://download.strongswan.org/security/CVE-2026-78130/strongswan-5.1.3-6.0.7_x509_ac_issuer_null.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78130).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78130.patch | 49 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 50 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
new file mode 100644
index 0000000000..36025c8093
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
@@ -0,0 +1,49 @@
+From 254d971bbe7479fe5fffc34cd1dd1e349a48e7aa Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Fri, 19 Jun 2026 11:57:48 +0200
+Subject: [PATCH] x509: Avoid NULL-pointer dereference if issuerName is missing
+ in attribute certificate
+
+If neither authoritiyKeyIdentifier nor issuerName are encoded in an
+attribute certificate, the validation in `acert_validator.c:verify()`
+will cause a NULL-pointer dereference via `issued_by()` (the lookup
+with NULL identity will enumerate all trusted certificates).
+
+Fixes: 26930a8c3e42 ("certificate factory can load certs from file")
+Fixes: CVE-2026-78130
+
+CVE: CVE-2026-78130
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/bee6ce27761e1f38958be36ebe6688ef963c3d22]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libstrongswan/plugins/x509/x509_ac.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/src/libstrongswan/plugins/x509/x509_ac.c b/src/libstrongswan/plugins/x509/x509_ac.c
+index 68b7cf9..11a847e 100644
+--- a/src/libstrongswan/plugins/x509/x509_ac.c
++++ b/src/libstrongswan/plugins/x509/x509_ac.c
+@@ -898,7 +898,11 @@ METHOD(certificate_t, has_issuer, id_match_t,
+ {
+ return ID_MATCH_PERFECT;
+ }
+- return this->issuerName->matches(this->issuerName, issuer);
++ if (this->issuerName)
++ {
++ return this->issuerName->matches(this->issuerName, issuer);
++ }
++ return ID_MATCH_NONE;
+ }
+
+ METHOD(certificate_t, issued_by, bool,
+@@ -935,7 +939,8 @@ METHOD(certificate_t, issued_by, bool,
+ }
+ else
+ {
+- if (!this->issuerName->equals(this->issuerName,
++ if (!this->issuerName ||
++ !this->issuerName->equals(this->issuerName,
+ issuer->get_subject(issuer)))
+ {
+ return FALSE;
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 19f1cc2f69..ffc9d1433e 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -17,6 +17,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78129.patch \
file://CVE-2026-78133.patch \
file://CVE-2026-78131.patch \
+ file://CVE-2026-78130.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 13/24] strongswan: patch CVE-2026-78132
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (10 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 14/24] strongswan: patch CVE-2026-78135 ankur.tyagi85
` (11 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78132
[1]https://download.strongswan.org/security/CVE-2026-78132/strongswan-5.1.3-6.0.7_x509_ac_ietfattr_loop.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78132).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78132.patch | 75 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 76 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78132.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78132.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78132.patch
new file mode 100644
index 0000000000..eb53d99ba5
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78132.patch
@@ -0,0 +1,75 @@
+From d8144c609148eda1ca55eac2ecddcd81bbd799b5 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Wed, 1 Jul 2026 16:24:23 +0200
+Subject: [PATCH] x509: Prevent infinite loop when parsing ietfAttrSyntax in
+ attribute certificates
+
+This is the same issue that was fixed with 407fcca200fd ("asn1-parser:
+Fix CHOICE parsing") for other CHOICE elements. This one was missed and
+can be triggered pre-auth by sending an attribute certificate to a peer.
+Since it's parsed before verifying it, the certificate doesn't have to
+be valid.
+
+For versions older than 5.5.3, this patch requires prior application of
+the fix for CVE-2017-9023, which introduced proper CHOICE handling in
+the ASN.1 parser.
+
+Fixes: a17598bc6992 ("x509: Integrate IETF attribute handling, and obsolete ietf_attributes_t")
+Fixes: CVE-2026-78132
+
+CVE: CVE-2026-78132
+Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/86bf2cbf5d9941b7ef16a1b25f0baf5589e0b64e]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libstrongswan/plugins/x509/x509_ac.c | 36 +++++++++++-------------
+ 1 file changed, 17 insertions(+), 19 deletions(-)
+
+diff --git a/src/libstrongswan/plugins/x509/x509_ac.c b/src/libstrongswan/plugins/x509/x509_ac.c
+index 11a847e..46c1f58 100644
+--- a/src/libstrongswan/plugins/x509/x509_ac.c
++++ b/src/libstrongswan/plugins/x509/x509_ac.c
+@@ -249,26 +249,24 @@ static void parse_roleSyntax(chunk_t blob, int level0)
+ */
+ static const asn1Object_t ietfAttrSyntaxObjects[] =
+ {
+- { 0, "ietfAttrSyntax", ASN1_SEQUENCE, ASN1_NONE }, /* 0 */
+- { 1, "policyAuthority", ASN1_CONTEXT_C_0, ASN1_OPT |
+- ASN1_BODY }, /* 1 */
+- { 1, "end opt", ASN1_EOC, ASN1_END }, /* 2 */
+- { 1, "values", ASN1_SEQUENCE, ASN1_LOOP }, /* 3 */
+- { 2, "octets", ASN1_OCTET_STRING, ASN1_OPT |
+- ASN1_BODY }, /* 4 */
+- { 2, "end choice", ASN1_EOC, ASN1_END }, /* 5 */
+- { 2, "oid", ASN1_OID, ASN1_OPT |
+- ASN1_BODY }, /* 6 */
+- { 2, "end choice", ASN1_EOC, ASN1_END }, /* 7 */
+- { 2, "string", ASN1_UTF8STRING, ASN1_OPT |
+- ASN1_BODY }, /* 8 */
+- { 2, "end choice", ASN1_EOC, ASN1_END }, /* 9 */
+- { 1, "end loop", ASN1_EOC, ASN1_END }, /* 10 */
+- { 0, "exit", ASN1_EOC, ASN1_EXIT }
++ { 0, "ietfAttrSyntax", ASN1_SEQUENCE, ASN1_NONE }, /* 0 */
++ { 1, "policyAuthority", ASN1_CONTEXT_C_0, ASN1_OPT|ASN1_BODY }, /* 1 */
++ { 1, "end opt", ASN1_EOC, ASN1_END }, /* 2 */
++ { 1, "values", ASN1_SEQUENCE, ASN1_LOOP }, /* 3 */
++ { 2, "value choice", ASN1_EOC, ASN1_CHOICE }, /* 4 */
++ { 3, "octets", ASN1_OCTET_STRING, ASN1_OPT|ASN1_BODY }, /* 5 */
++ { 3, "end choice", ASN1_EOC, ASN1_END|ASN1_CH }, /* 6 */
++ { 3, "oid", ASN1_OID, ASN1_OPT|ASN1_BODY }, /* 7 */
++ { 3, "end choice", ASN1_EOC, ASN1_END|ASN1_CH }, /* 8 */
++ { 3, "string", ASN1_UTF8STRING, ASN1_OPT|ASN1_BODY }, /* 9 */
++ { 3, "end choice", ASN1_EOC, ASN1_END|ASN1_CH }, /* 10 */
++ { 2, "end choices", ASN1_EOC, ASN1_END|ASN1_CHOICE }, /* 11 */
++ { 1, "end loop", ASN1_EOC, ASN1_END }, /* 12 */
++ { 0, "exit", ASN1_EOC, ASN1_EXIT }
+ };
+-#define IETF_ATTR_OCTETS 4
+-#define IETF_ATTR_OID 6
+-#define IETF_ATTR_STRING 8
++#define IETF_ATTR_OCTETS 5
++#define IETF_ATTR_OID 7
++#define IETF_ATTR_STRING 9
+
+ /**
+ * Parse group memberships, IETF attributes
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index ffc9d1433e..1597455d15 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -18,6 +18,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78133.patch \
file://CVE-2026-78131.patch \
file://CVE-2026-78130.patch \
+ file://CVE-2026-78132.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 14/24] strongswan: patch CVE-2026-78135
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (11 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 13/24] strongswan: patch CVE-2026-78132 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 15/24] strongswan: patch CVE-2026-78134 ankur.tyagi85
` (10 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78135
[1]https://download.strongswan.org/security/CVE-2026-78135/strongswan-5.9.7-6.0.7_early_create_child_sa.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78135).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78135.patch | 72 +++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 73 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78135.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78135.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78135.patch
new file mode 100644
index 0000000000..1b6c472b30
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78135.patch
@@ -0,0 +1,72 @@
+From 2c3d63bd7a05f88d25354dfe7805a5a6e474a699 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Mon, 27 Jul 2026 08:53:50 +0200
+Subject: [PATCH] ikev2: Properly reject CREATE_CHILD_SA requests on
+ unestablished IKE_SAs
+
+The previous check was not actually enforced as long as there were still
+tasks in the passive queue (it was originally added to fix an issue on
+initiators, so the passive queue was expected to be empty). This allowed
+an unauthenticated attacker to potentially establish a usable Child SA
+if certain preconditions were met.
+
+First, it required that the initiator is authenticated with EAP so the
+authentication and the creation of the first Child SA is deferred.
+Second, the responder must either not configure an IP address pool or
+an explicit remote TS, otherwise, traffic selector negotiation fails.
+
+Note that the half-open IKE SA and the installed IPsec SA will be removed
+after the default timeout of 30 seconds.
+
+Fixes: 8503077175cd ("ikev2: Reject CREATE_CHILD_SA exchange on unestablished IKE_SAs")
+Fixes: c60c7694d2d8 ("merged tasking branch into trunk")
+Fixes: CVE-2026-78135
+
+CVE: CVE-2026-78135
+Upstream-Status: Backport [https://github.com/strongswan/strongswan/commit/4dcb132266a954202509a3b4b3be99378f3e3b4d]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libcharon/sa/ikev2/task_manager_v2.c | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c
+index 5a19ce8..f9e9ab9 100644
+--- a/src/libcharon/sa/ikev2/task_manager_v2.c
++++ b/src/libcharon/sa/ikev2/task_manager_v2.c
+@@ -1134,9 +1134,18 @@ static status_t process_request(private_task_manager_t *this,
+ delete_payload_t *delete;
+ ike_sa_state_t state;
+
++ state = this->ike_sa->get_state(this->ike_sa);
++ if (message->get_exchange_type(message) == CREATE_CHILD_SA &&
++ (state == IKE_CREATED || state == IKE_CONNECTING))
++ {
++ DBG1(DBG_IKE, "received CREATE_CHILD_SA request for "
++ "unestablished IKE_SA, rejected");
++ return FAILED;
++ }
++
++ /* create tasks depending on request type, if not already some queued */
+ if (array_count(this->passive_tasks) == 0)
+- { /* create tasks depending on request type, if not already some queued */
+- state = this->ike_sa->get_state(this->ike_sa);
++ {
+ switch (message->get_exchange_type(message))
+ {
+ case IKE_SA_INIT:
+@@ -1177,14 +1186,6 @@ static status_t process_request(private_task_manager_t *this,
+ { /* FIXME: we should prevent this on mediation connections */
+ bool notify_found = FALSE, ts_found = FALSE;
+
+- if (state == IKE_CREATED ||
+- state == IKE_CONNECTING)
+- {
+- DBG1(DBG_IKE, "received CREATE_CHILD_SA request for "
+- "unestablished IKE_SA, rejected");
+- return FAILED;
+- }
+-
+ enumerator = message->create_payload_enumerator(message);
+ while (enumerator->enumerate(enumerator, &payload))
+ {
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 1597455d15..5ddc3c32b9 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -19,6 +19,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78131.patch \
file://CVE-2026-78130.patch \
file://CVE-2026-78132.patch \
+ file://CVE-2026-78135.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-networking][wrynose][PATCH 15/24] strongswan: patch CVE-2026-78134
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (12 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 14/24] strongswan: patch CVE-2026-78135 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 16/24] tesseract: patch CVE-2026-88052 ankur.tyagi85
` (9 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Use patch[1] provided by strongSwan[2]
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-78134
[1]https://download.strongswan.org/security/CVE-2026-78134/strongswan-5.9.10-6.0.7_eap_inner_auth_cfg.patch
[2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78134).html
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../strongswan/CVE-2026-78134.patch | 712 ++++++++++++++++++
.../strongswan/strongswan_6.0.6.bb | 1 +
2 files changed, 713 insertions(+)
create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78134.patch
diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78134.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78134.patch
new file mode 100644
index 0000000000..86646e5e96
--- /dev/null
+++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78134.patch
@@ -0,0 +1,712 @@
+From d95e9d363b0e23d0ba3080bb518695e05a453748 Mon Sep 17 00:00:00 2001
+From: Tobias Brunner <tobias@strongswan.org>
+Date: Mon, 27 Jul 2026 15:05:45 +0200
+Subject: [PATCH] eap-ttls/peap: Return auth-cfg with details on TLS and inner
+ EAP method
+
+This fixes several issues with binding identities to the IKE SA.
+
+If the client is authenticated with a certificate, the previous code still
+used the client's proclaimed inner EAP-Identity when starting the EAP-TNC
+method. So that method would potentially operate on an unverified
+identity.
+
+Second, if the inner EAP method overrides the client identity (the only
+one is currently EAP-MSCHAPV2), the missing merge meant that the outer
+IKE/EAP identity could potentially be unconfirmed.
+
+For inner methods that don't override the identity (e.g. EAP-MD5), not
+propagating the inner EAP-Identity could potentially have the same
+effect.
+
+While the EAP-TTLS implementation returned the auth-cfg of the TLS
+exchange since the first referenced commit, this was mainly intended to
+enforce public key constraints. So it didn't cover the phase 2 EAP
+methods. For some reason EAP-PEAP did not get that method at all in that
+changeset, so we'll add that now.
+
+Additionally, the EAP-PEAP implementation now forwards the phase 2 EAP
+method type to EAP-TNC like the EAP-TTLS implementation already did,
+which allows a more informed decision on the client's identity.
+
+Fixes: 0864a31d13ff ("eap-ttls: Support EAP auth information getter in EAP-TTLS")
+Fixes: 79f2102cb442 ("implemented server side support for EAP-TTLS")
+Fixes: 2a421163bf4f ("make TNC client authentication type available to IMVs")
+Fixes: 1be296dfb2af ("implemented the PEAP tunneling protocol as an EAP plugin")
+Fixes: CVE-2026-78134
+
+CVE: CVE-2026-78134
+Upstream-Status: Backport [1][2]
+
+[1]https://github.com/strongswan/strongswan/commit/e059077d3f3e307e78be7f91e5648aa5f94916a8
+[2]https://github.com/strongswan/strongswan/commit/6a7210731f6dd2889d22bf20310ab0ed7274d0d8
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ src/libcharon/plugins/eap_peap/eap_peap.c | 49 ++++++++++-
+ .../plugins/eap_peap/eap_peap_peer.c | 20 +++++
+ .../plugins/eap_peap/eap_peap_peer.h | 7 ++
+ .../plugins/eap_peap/eap_peap_server.c | 81 ++++++++++++++++---
+ .../plugins/eap_peap/eap_peap_server.h | 7 ++
+ src/libcharon/plugins/eap_ttls/eap_ttls.c | 43 +++++++++-
+ .../plugins/eap_ttls/eap_ttls_peer.c | 19 +++++
+ .../plugins/eap_ttls/eap_ttls_peer.h | 7 ++
+ .../plugins/eap_ttls/eap_ttls_server.c | 56 +++++++++++--
+ .../plugins/eap_ttls/eap_ttls_server.h | 7 ++
+ 10 files changed, 278 insertions(+), 18 deletions(-)
+
+diff --git a/src/libcharon/plugins/eap_peap/eap_peap.c b/src/libcharon/plugins/eap_peap/eap_peap.c
+index 3573cba..cd942f1 100644
+--- a/src/libcharon/plugins/eap_peap/eap_peap.c
++++ b/src/libcharon/plugins/eap_peap/eap_peap.c
+@@ -40,6 +40,25 @@ struct private_eap_peap_t {
+ * TLS stack, wrapped by EAP helper
+ */
+ tls_eap_t *tls_eap;
++
++ /**
++ * Role
++ */
++ bool is_server;
++
++ /**
++ * Actual server/client implementation
++ */
++ union {
++ tls_application_t *application;
++ eap_peap_server_t *server;
++ eap_peap_peer_t *client;
++ } impl;
++
++ /**
++ * Cached auth data for TLS and inner EAP methods
++ */
++ auth_cfg_t *auth;
+ };
+
+ /** Maximum number of EAP-PEAP messages/fragments allowed */
+@@ -113,10 +132,34 @@ METHOD(eap_method_t, is_mutual, bool,
+ return TRUE;
+ }
+
++METHOD(eap_method_t, get_auth, auth_cfg_t*,
++ private_eap_peap_t *this)
++{
++ if (!this->auth)
++ {
++ auth_cfg_t *inner;
++
++ this->auth = auth_cfg_create();
++ this->auth->merge(this->auth,
++ this->tls_eap->get_auth(this->tls_eap), FALSE);
++ if (this->is_server)
++ {
++ inner = this->impl.server->get_auth(this->impl.server);
++ }
++ else
++ {
++ inner = this->impl.client->get_auth(this->impl.client);
++ }
++ this->auth->merge(this->auth, inner, FALSE);
++ }
++ return this->auth;
++}
++
+ METHOD(eap_method_t, destroy, void,
+ private_eap_peap_t *this)
+ {
+ this->tls_eap->destroy(this->tls_eap);
++ DESTROY_IF(this->auth);
+ free(this);
+ }
+
+@@ -135,6 +178,7 @@ static private_eap_peap_t *eap_peap_create_empty(void)
+ .get_type = _get_type,
+ .is_mutual = _is_mutual,
+ .get_msk = _get_msk,
++ .get_auth = _get_auth,
+ .get_identifier = _get_identifier,
+ .set_identifier = _set_identifier,
+ .destroy = _destroy,
+@@ -147,7 +191,7 @@ static private_eap_peap_t *eap_peap_create_empty(void)
+ /**
+ * Generic private constructor
+ */
+-static eap_peap_t *eap_peap_create(private_eap_peap_t * this,
++static eap_peap_t *eap_peap_create(private_eap_peap_t *this,
+ identification_t *server,
+ identification_t *peer, bool is_server,
+ tls_application_t *application)
+@@ -157,6 +201,9 @@ static eap_peap_t *eap_peap_create(private_eap_peap_t * this,
+ bool include_length;
+ tls_t *tls;
+
++ this->is_server = is_server;
++ this->impl.application = application;
++
+ if (is_server && !lib->settings->get_bool(lib->settings,
+ "%s.plugins.eap-peap.request_peer_auth", FALSE,
+ lib->ns))
+diff --git a/src/libcharon/plugins/eap_peap/eap_peap_peer.c b/src/libcharon/plugins/eap_peap/eap_peap_peer.c
+index 95213a3..f6c087a 100644
+--- a/src/libcharon/plugins/eap_peap/eap_peap_peer.c
++++ b/src/libcharon/plugins/eap_peap/eap_peap_peer.c
+@@ -52,6 +52,11 @@ struct private_eap_peap_peer_t {
+ */
+ eap_method_t *ph2_method;
+
++ /**
++ * Auth data for phase 2 methods
++ */
++ auth_cfg_t *auth;
++
+ /**
+ * Pending outbound EAP message
+ */
+@@ -166,6 +171,12 @@ METHOD(tls_application_t, process, status_t,
+ switch (status)
+ {
+ case SUCCESS:
++ if (this->ph2_method->get_auth)
++ {
++ this->auth->merge(this->auth,
++ this->ph2_method->get_auth(this->ph2_method),
++ FALSE);
++ }
+ this->ph2_method->destroy(this->ph2_method);
+ this->ph2_method = NULL;
+ /* fall through to NEED_MORE */
+@@ -220,11 +231,18 @@ METHOD(tls_application_t, build, status_t,
+ return INVALID_STATE;
+ }
+
++METHOD(eap_peap_peer_t, get_auth, auth_cfg_t*,
++ private_eap_peap_peer_t *this)
++{
++ return this->auth;
++}
++
+ METHOD(tls_application_t, destroy, void,
+ private_eap_peap_peer_t *this)
+ {
+ this->server->destroy(this->server);
+ this->peer->destroy(this->peer);
++ this->auth->destroy(this->auth);
+ DESTROY_IF(this->ph2_method);
+ DESTROY_IF(this->out);
+ this->avp->destroy(this->avp);
+@@ -247,10 +265,12 @@ eap_peap_peer_t *eap_peap_peer_create(identification_t *server,
+ .build = _build,
+ .destroy = _destroy,
+ },
++ .get_auth = _get_auth,
+ },
+ .server = server->clone(server),
+ .peer = peer->clone(peer),
+ .ph1_method = eap_method,
++ .auth = auth_cfg_create(),
+ .avp = eap_peap_avp_create(FALSE),
+ );
+
+diff --git a/src/libcharon/plugins/eap_peap/eap_peap_peer.h b/src/libcharon/plugins/eap_peap/eap_peap_peer.h
+index 53c25cd..7d16957 100644
+--- a/src/libcharon/plugins/eap_peap/eap_peap_peer.h
++++ b/src/libcharon/plugins/eap_peap/eap_peap_peer.h
+@@ -38,6 +38,13 @@ struct eap_peap_peer_t {
+ * Implements the TLS application data handler.
+ */
+ tls_application_t application;
++
++ /**
++ * Get authentication details of this EAP method and its inner method(s).
++ *
++ * @return auth method, internal data
++ */
++ auth_cfg_t *(*get_auth)(eap_peap_peer_t *this);
+ };
+
+ /**
+diff --git a/src/libcharon/plugins/eap_peap/eap_peap_server.c b/src/libcharon/plugins/eap_peap/eap_peap_server.c
+index 29ab9b4..388c3c6 100644
+--- a/src/libcharon/plugins/eap_peap/eap_peap_server.c
++++ b/src/libcharon/plugins/eap_peap/eap_peap_server.c
+@@ -20,6 +20,8 @@
+ #include <utils/debug.h>
+ #include <daemon.h>
+
++#include <sa/eap/eap_inner_method.h>
++
+ typedef struct private_eap_peap_server_t private_eap_peap_server_t;
+
+ /**
+@@ -77,6 +79,16 @@ struct private_eap_peap_server_t {
+ */
+ eap_method_t *ph2_method;
+
++ /**
++ * Type of the completed phase 2 EAP method
++ */
++ eap_type_t phase2_type;
++
++ /**
++ * Auth data for phase 2 method
++ */
++ auth_cfg_t *auth;
++
+ /**
+ * Pending outbound EAP message
+ */
+@@ -132,8 +144,11 @@ static status_t start_phase2_auth(private_eap_peap_server_t *this)
+ /**
+ * If configured, start EAP-TNC protocol
+ */
+-static status_t start_phase2_tnc(private_eap_peap_server_t *this)
++static status_t start_phase2_tnc(private_eap_peap_server_t *this,
++ eap_type_t auth_type)
+ {
++ eap_inner_method_t *inner_method;
++
+ if (this->start_phase2_tnc && lib->settings->get_bool(lib->settings,
+ "%s.plugins.eap-peap.phase2_tnc", FALSE, lib->ns))
+ {
+@@ -145,6 +160,8 @@ static status_t start_phase2_tnc(private_eap_peap_server_t *this)
+ DBG1(DBG_IKE, "%N method not available", eap_type_names, EAP_TNC);
+ return FAILED;
+ }
++ inner_method = (eap_inner_method_t *)this->ph2_method;
++ inner_method->set_auth_type(inner_method, auth_type);
+ this->start_phase2_tnc = FALSE;
+
+ /* synchronize EAP message identifiers of inner protocol with outer */
+@@ -218,9 +235,13 @@ METHOD(tls_application_t, process, status_t,
+ DBG1(DBG_IKE, "received tunneled EAP-PEAP AVP [EAP/%N]",
+ eap_code_short_names, code);
+ in->destroy(in);
+- /* if EAP_SUCCESS check if to continue phase2 with EAP-TNC */
+- return (this->phase2_result == EAP_SUCCESS && code == EAP_SUCCESS) ?
+- start_phase2_tnc(this) : FAILED;
++ if (this->phase2_result == EAP_SUCCESS && code == EAP_SUCCESS)
++ {
++ /* only accept SUCCESS once after a successful inner method */
++ this->phase2_result = EAP_FAILURE;
++ return start_phase2_tnc(this, this->phase2_type);
++ }
++ return FAILED;
+ }
+
+ if (this->ph2_method)
+@@ -245,6 +266,10 @@ METHOD(tls_application_t, process, status_t,
+ if (!received_vendor && received_type == EAP_IDENTITY)
+ {
+ chunk_t eap_id;
++ bool peer_auth;
++
++ peer_auth = lib->settings->get_bool(lib->settings,
++ "%s.plugins.eap-peap.request_peer_auth", FALSE, lib->ns);
+
+ if (this->ph2_method == NULL)
+ {
+@@ -271,9 +296,22 @@ METHOD(tls_application_t, process, status_t,
+
+ if (this->ph2_method->get_msk(this->ph2_method, &eap_id) == SUCCESS)
+ {
+- this->peer->destroy(this->peer);
+- this->peer = identification_create_from_data(eap_id);
+- DBG1(DBG_IKE, "received EAP identity '%Y'", this->peer);
++ identification_t *id;
++
++ id = identification_create_from_data(eap_id);
++ if (peer_auth && !id->equals(id, this->peer))
++ {
++ DBG1(DBG_IKE, "received tunneled EAP identity '%Y', keeping "
++ "certificate-authenticated identity '%Y'", id, this->peer);
++ id->destroy(id);
++ }
++ else
++ {
++ DBG1(DBG_IKE, "received EAP identity '%Y'", id);
++ this->auth->add(this->auth, AUTH_RULE_EAP_IDENTITY, id);
++ this->peer->destroy(this->peer);
++ this->peer = id->clone(id);
++ }
+ }
+
+ in->destroy(in);
+@@ -281,10 +319,9 @@ METHOD(tls_application_t, process, status_t,
+ this->ph2_method = NULL;
+
+ /* Start Phase 2 of EAP-PEAP authentication */
+- if (lib->settings->get_bool(lib->settings,
+- "%s.plugins.eap-peap.request_peer_auth", FALSE, lib->ns))
++ if (peer_auth)
+ {
+- return start_phase2_tnc(this);
++ return start_phase2_tnc(this, EAP_TLS);
+ }
+ else
+ {
+@@ -305,11 +342,26 @@ METHOD(tls_application_t, process, status_t,
+ switch (status)
+ {
+ case SUCCESS:
++ if (this->ph2_method->get_auth)
++ {
++ identification_t *id;
++ auth_cfg_t *auth;
++
++ auth = this->ph2_method->get_auth(this->ph2_method);
++ id = auth->get(auth, AUTH_RULE_EAP_IDENTITY);
++ if (id)
++ {
++ this->peer->destroy(this->peer);
++ this->peer = id->clone(id);
++ }
++ this->auth->merge(this->auth, auth, FALSE);
++ }
+ DBG1(DBG_IKE, "%N phase2 authentication of '%Y' with %N successful",
+ eap_type_names, EAP_PEAP, this->peer,
+ eap_type_names, type);
+ this->ph2_method->destroy(this->ph2_method);
+ this->ph2_method = NULL;
++ this->phase2_type = type;
+
+ /* EAP-PEAP requires the sending of an inner EAP_SUCCESS message */
+ this->phase2_result = EAP_SUCCESS;
+@@ -407,11 +459,18 @@ METHOD(eap_peap_server_t, set_tls, void,
+ this->tls = tls;
+ }
+
++METHOD(eap_peap_server_t, get_auth, auth_cfg_t*,
++ private_eap_peap_server_t *this)
++{
++ return this->auth;
++}
++
+ METHOD(tls_application_t, destroy, void,
+ private_eap_peap_server_t *this)
+ {
+ this->server->destroy(this->server);
+ this->peer->destroy(this->peer);
++ this->auth->destroy(this->auth);
+ DESTROY_IF(this->ph2_method);
+ DESTROY_IF(this->out);
+ this->avp->destroy(this->avp);
+@@ -435,10 +494,12 @@ eap_peap_server_t *eap_peap_server_create(identification_t *server,
+ .destroy = _destroy,
+ },
+ .set_tls = _set_tls,
++ .get_auth = _get_auth,
+ },
+ .server = server->clone(server),
+ .peer = peer->clone(peer),
+ .ph1_method = eap_method,
++ .auth = auth_cfg_create(),
+ .start_phase2 = TRUE,
+ .start_phase2_tnc = TRUE,
+ .start_phase2_id = lib->settings->get_bool(lib->settings,
+diff --git a/src/libcharon/plugins/eap_peap/eap_peap_server.h b/src/libcharon/plugins/eap_peap/eap_peap_server.h
+index 3abe88b..8080e9f 100644
+--- a/src/libcharon/plugins/eap_peap/eap_peap_server.h
++++ b/src/libcharon/plugins/eap_peap/eap_peap_server.h
+@@ -47,6 +47,13 @@ struct eap_peap_server_t {
+ * @param tls TLS connection
+ */
+ void (*set_tls)(eap_peap_server_t *this, tls_t *tls);
++
++ /**
++ * Get authentication details of this EAP method and its inner method(s).
++ *
++ * @return auth method, internal data
++ */
++ auth_cfg_t *(*get_auth)(eap_peap_server_t *this);
+ };
+
+ /**
+diff --git a/src/libcharon/plugins/eap_ttls/eap_ttls.c b/src/libcharon/plugins/eap_ttls/eap_ttls.c
+index d8ad781..3df78bb 100644
+--- a/src/libcharon/plugins/eap_ttls/eap_ttls.c
++++ b/src/libcharon/plugins/eap_ttls/eap_ttls.c
+@@ -40,6 +40,25 @@ struct private_eap_ttls_t {
+ * TLS stack, wrapped by EAP helper
+ */
+ tls_eap_t *tls_eap;
++
++ /**
++ * Role
++ */
++ bool is_server;
++
++ /**
++ * Actual server/client implementation
++ */
++ union {
++ tls_application_t *application;
++ eap_ttls_server_t *server;
++ eap_ttls_peer_t *client;
++ } impl;
++
++ /**
++ * Cached auth data for TLS and inner EAP methods
++ */
++ auth_cfg_t *auth;
+ };
+
+ /** Maximum number of EAP-TTLS messages/fragments allowed */
+@@ -116,13 +135,31 @@ METHOD(eap_method_t, is_mutual, bool,
+ METHOD(eap_method_t, get_auth, auth_cfg_t*,
+ private_eap_ttls_t *this)
+ {
+- return this->tls_eap->get_auth(this->tls_eap);
++ if (!this->auth)
++ {
++ auth_cfg_t *inner;
++
++ this->auth = auth_cfg_create();
++ this->auth->merge(this->auth,
++ this->tls_eap->get_auth(this->tls_eap), FALSE);
++ if (this->is_server)
++ {
++ inner = this->impl.server->get_auth(this->impl.server);
++ }
++ else
++ {
++ inner = this->impl.client->get_auth(this->impl.client);
++ }
++ this->auth->merge(this->auth, inner, FALSE);
++ }
++ return this->auth;
+ }
+
+ METHOD(eap_method_t, destroy, void,
+ private_eap_ttls_t *this)
+ {
+ this->tls_eap->destroy(this->tls_eap);
++ DESTROY_IF(this->auth);
+ free(this);
+ }
+
+@@ -153,6 +190,10 @@ static eap_ttls_t *eap_ttls_create(identification_t *server,
+ .destroy = _destroy,
+ },
+ },
++ .is_server = is_server,
++ .impl = {
++ .application = application,
++ },
+ );
+ if (is_server && !lib->settings->get_bool(lib->settings,
+ "%s.plugins.eap-ttls.request_peer_auth", FALSE,
+diff --git a/src/libcharon/plugins/eap_ttls/eap_ttls_peer.c b/src/libcharon/plugins/eap_ttls/eap_ttls_peer.c
+index 63126a5..f8229f5 100644
+--- a/src/libcharon/plugins/eap_ttls/eap_ttls_peer.c
++++ b/src/libcharon/plugins/eap_ttls/eap_ttls_peer.c
+@@ -54,6 +54,11 @@ struct private_eap_ttls_peer_t {
+ */
+ eap_method_t *method;
+
++ /**
++ * Auth data for phase 2 method
++ */
++ auth_cfg_t *auth;
++
+ /**
+ * Pending outbound EAP message
+ */
+@@ -215,6 +220,11 @@ METHOD(tls_application_t, process, status_t,
+ switch (status)
+ {
+ case SUCCESS:
++ if (this->method->get_auth)
++ {
++ this->auth->merge(this->auth,
++ this->method->get_auth(this->method), FALSE);
++ }
+ this->method->destroy(this->method);
+ this->method = NULL;
+ /* fall through to NEED_MORE */
+@@ -275,11 +285,18 @@ METHOD(tls_application_t, build, status_t,
+ return INVALID_STATE;
+ }
+
++METHOD(eap_ttls_peer_t, get_auth, auth_cfg_t*,
++ private_eap_ttls_peer_t *this)
++{
++ return this->auth;
++}
++
+ METHOD(tls_application_t, destroy, void,
+ private_eap_ttls_peer_t *this)
+ {
+ this->server->destroy(this->server);
+ this->peer->destroy(this->peer);
++ this->auth->destroy(this->auth);
+ DESTROY_IF(this->method);
+ DESTROY_IF(this->out);
+ this->avp->destroy(this->avp);
+@@ -301,10 +318,12 @@ eap_ttls_peer_t *eap_ttls_peer_create(identification_t *server,
+ .build = _build,
+ .destroy = _destroy,
+ },
++ .get_auth = _get_auth,
+ },
+ .server = server->clone(server),
+ .peer = peer->clone(peer),
+ .start_phase2 = TRUE,
++ .auth = auth_cfg_create(),
+ .avp = eap_ttls_avp_create(),
+ );
+
+diff --git a/src/libcharon/plugins/eap_ttls/eap_ttls_peer.h b/src/libcharon/plugins/eap_ttls/eap_ttls_peer.h
+index 0c3d90a..69a8435 100644
+--- a/src/libcharon/plugins/eap_ttls/eap_ttls_peer.h
++++ b/src/libcharon/plugins/eap_ttls/eap_ttls_peer.h
+@@ -37,6 +37,13 @@ struct eap_ttls_peer_t {
+ * Implements the TLS application data handler.
+ */
+ tls_application_t application;
++
++ /**
++ * Get authentication details of this EAP method and its inner method(s).
++ *
++ * @return auth method, internal data
++ */
++ auth_cfg_t *(*get_auth)(eap_ttls_peer_t *this);
+ };
+
+ /**
+diff --git a/src/libcharon/plugins/eap_ttls/eap_ttls_server.c b/src/libcharon/plugins/eap_ttls/eap_ttls_server.c
+index fc97f81..e1de1bf 100644
+--- a/src/libcharon/plugins/eap_ttls/eap_ttls_server.c
++++ b/src/libcharon/plugins/eap_ttls/eap_ttls_server.c
+@@ -60,6 +60,11 @@ struct private_eap_ttls_server_t {
+ */
+ eap_method_t *method;
+
++ /**
++ * Auth data for phase 2 method
++ */
++ auth_cfg_t *auth;
++
+ /**
+ * Pending outbound EAP message
+ */
+@@ -220,6 +225,10 @@ METHOD(tls_application_t, process, status_t,
+ if (!received_vendor && received_type == EAP_IDENTITY)
+ {
+ chunk_t eap_id;
++ bool peer_auth;
++
++ peer_auth = lib->settings->get_bool(lib->settings,
++ "%s.plugins.eap-ttls.request_peer_auth", FALSE, lib->ns);
+
+ if (this->method == NULL)
+ {
+@@ -244,9 +253,22 @@ METHOD(tls_application_t, process, status_t,
+
+ if (this->method->get_msk(this->method, &eap_id) == SUCCESS)
+ {
+- this->peer->destroy(this->peer);
+- this->peer = identification_create_from_data(eap_id);
+- DBG1(DBG_IKE, "received EAP identity '%Y'", this->peer);
++ identification_t *id;
++
++ id = identification_create_from_data(eap_id);
++ if (peer_auth && !id->equals(id, this->peer))
++ {
++ DBG1(DBG_IKE, "received tunneled EAP identity '%Y', keeping "
++ "certificate-authenticated identity '%Y'", id, this->peer);
++ id->destroy(id);
++ }
++ else
++ {
++ DBG1(DBG_IKE, "received EAP identity '%Y'", id);
++ this->auth->add(this->auth, AUTH_RULE_EAP_IDENTITY, id);
++ this->peer->destroy(this->peer);
++ this->peer = id->clone(id);
++ }
+ }
+
+ in->destroy(in);
+@@ -254,8 +276,7 @@ METHOD(tls_application_t, process, status_t,
+ this->method = NULL;
+
+ /* Start Phase 2 of EAP-TTLS authentication */
+- if (lib->settings->get_bool(lib->settings,
+- "%s.plugins.eap-ttls.request_peer_auth", FALSE, lib->ns))
++ if (peer_auth)
+ {
+ return start_phase2_tnc(this, EAP_TLS);
+ }
+@@ -278,6 +299,20 @@ METHOD(tls_application_t, process, status_t,
+ switch (status)
+ {
+ case SUCCESS:
++ if (this->method->get_auth)
++ {
++ identification_t *id;
++ auth_cfg_t *auth;
++
++ auth = this->method->get_auth(this->method);
++ id = auth->get(auth, AUTH_RULE_EAP_IDENTITY);
++ if (id)
++ {
++ this->peer->destroy(this->peer);
++ this->peer = id->clone(id);
++ }
++ this->auth->merge(this->auth, auth, FALSE);
++ }
+ DBG1(DBG_IKE, "%N phase2 authentication of '%Y' with %N successful",
+ eap_type_names, EAP_TTLS, this->peer,
+ eap_type_names, type);
+@@ -348,11 +383,18 @@ METHOD(tls_application_t, build, status_t,
+ return INVALID_STATE;
+ }
+
++METHOD(eap_ttls_server_t, get_auth, auth_cfg_t*,
++ private_eap_ttls_server_t *this)
++{
++ return this->auth;
++}
++
+ METHOD(tls_application_t, destroy, void,
+ private_eap_ttls_server_t *this)
+ {
+ this->server->destroy(this->server);
+ this->peer->destroy(this->peer);
++ this->auth->destroy(this->auth);
+ DESTROY_IF(this->method);
+ DESTROY_IF(this->out);
+ this->avp->destroy(this->avp);
+@@ -374,11 +416,13 @@ eap_ttls_server_t *eap_ttls_server_create(identification_t *server,
+ .build = _build,
+ .destroy = _destroy,
+ },
++ .get_auth = _get_auth,
+ },
+ .server = server->clone(server),
+- .peer = peer->clone(peer),
++ .auth = auth_cfg_create(),
+ .start_phase2 = TRUE,
+ .start_phase2_tnc = TRUE,
++ .peer = peer->clone(peer),
+ .avp = eap_ttls_avp_create(),
+ );
+
+diff --git a/src/libcharon/plugins/eap_ttls/eap_ttls_server.h b/src/libcharon/plugins/eap_ttls/eap_ttls_server.h
+index 1e13f55..3348706 100644
+--- a/src/libcharon/plugins/eap_ttls/eap_ttls_server.h
++++ b/src/libcharon/plugins/eap_ttls/eap_ttls_server.h
+@@ -37,6 +37,13 @@ struct eap_ttls_server_t {
+ * Implements the TLS application data handler.
+ */
+ tls_application_t application;
++
++ /**
++ * Get authentication details of this EAP method and its inner method(s).
++ *
++ * @return auth method, internal data
++ */
++ auth_cfg_t *(*get_auth)(eap_ttls_server_t *this);
+ };
+
+ /**
diff --git a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
index 5ddc3c32b9..5421ecf8f9 100644
--- a/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
+++ b/meta-networking/recipes-support/strongswan/strongswan_6.0.6.bb
@@ -20,6 +20,7 @@ SRC_URI = "https://download.strongswan.org/strongswan-${PV}.tar.bz2 \
file://CVE-2026-78130.patch \
file://CVE-2026-78132.patch \
file://CVE-2026-78135.patch \
+ file://CVE-2026-78134.patch \
"
SRC_URI[sha256sum] = "07df7cedae56a7f3bb07e66d21a1f9f87e961db70e99184e11d3819413e4f87c"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 16/24] tesseract: patch CVE-2026-88052
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (13 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 15/24] strongswan: patch CVE-2026-78134 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 17/24] tesseract: patch CVE-2026-88048 ankur.tyagi85
` (8 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88052
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88052.patch | 165 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 166 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88052.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88052.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88052.patch
new file mode 100644
index 0000000000..fb21f6eb02
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88052.patch
@@ -0,0 +1,165 @@
+From 26355d536f148a45a43cfe8b5b5f4a748d99fe8e Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Fri, 21 Aug 2026 18:34:33 +0200
+Subject: [PATCH] Reject unicharset files whose inserts desync id from unichars
+
+UNICHARSET::load_via_fgets reads the unichar count via sscanf and
+trusts it as the loop bound, indexing the unichars vector with the
+loop index id via the unchecked set_* accessors. unichar_insert is a
+no-op for duplicate (or empty) representations, so once any insert
+no-ops, unichars.size() falls behind id and the subsequent
+set_*(id, ...) and unichars[id].properties writes land past the end
+of the vector - a deterministic heap out-of-bounds write (including a
+std::string assignment via set_normed) for every remaining line, on
+both the LSTM and legacy init paths. A malformed unicharset with a
+duplicate line (e.g. two identical entries) triggers it; a
+non-positive header count likewise loads an empty unicharset
+"successfully".
+
+Key changes:
+- unicharset.cpp: reject unicharset_size <= 0, and after each insert
+ verify the vector actually grew to id + 1; on mismatch report the
+ offending line and reject the file instead of writing out of bounds.
+- unittest: add unicharset_load_test with a duplicate-representation
+ unicharset (on unpatched code the test dies on the
+ container-overflow in load_via_fgets), a zero and a negative count,
+ and a positive control that a valid unicharset still loads.
+
+Reported-by: Zhixi "Jace" Sun <g.mygenie@gmail.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit 2d04d640db2e8c7e3bab2369d599343b5a8b8443)
+
+CVE: CVE-2026-88052
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/2d04d640db2e8c7e3bab2369d599343b5a8b8443]
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 +++
+ src/ccutil/unicharset.cpp | 12 ++++++
+ unittest/unicharset_load_test.cc | 64 ++++++++++++++++++++++++++++++++
+ 3 files changed, 81 insertions(+)
+ create mode 100644 unittest/unicharset_load_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index 9f2a367d..1a0a6771 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1249,6 +1249,7 @@ check_PROGRAMS += tfile_test
+ if ENABLE_TRAINING
+ check_PROGRAMS += unichar_test
+ check_PROGRAMS += unicharcompress_test
++check_PROGRAMS += unicharset_load_test
+ check_PROGRAMS += unicharset_test
+ check_PROGRAMS += validate_grapheme_test
+ check_PROGRAMS += validate_indic_test
+@@ -1522,6 +1523,10 @@ unicharcompress_test_SOURCES = unittest/unicharcompress_test.cc
+ unicharcompress_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ unicharcompress_test_LDADD = $(TRAINING_LIBS) $(ICU_UC_LIBS)
+
++unicharset_load_test_SOURCES = unittest/unicharset_load_test.cc
++unicharset_load_test_CPPFLAGS = $(unittest_CPPFLAGS)
++unicharset_load_test_LDADD = $(TESS_LIBS)
++
+ unicharset_test_SOURCES = unittest/unicharset_test.cc
+ unicharset_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ unicharset_test_LDADD = $(TRAINING_LIBS) $(ICU_UC_LIBS)
+diff --git a/src/ccutil/unicharset.cpp b/src/ccutil/unicharset.cpp
+index b29ec3b7..0e72ae48 100644
+--- a/src/ccutil/unicharset.cpp
++++ b/src/ccutil/unicharset.cpp
+@@ -791,6 +791,9 @@ bool UNICHARSET::load_via_fgets(
+ sscanf(buffer, "%d", &unicharset_size) != 1) {
+ return false;
+ }
++ if (unicharset_size <= 0) {
++ return false;
++ }
+ for (UNICHAR_ID id = 0; id < unicharset_size; ++id) {
+ char unichar[256];
+ unsigned int properties;
+@@ -884,6 +887,15 @@ bool UNICHARSET::load_via_fgets(
+ } else {
+ this->unichar_insert_backwards_compatible(unichar);
+ }
++ // A duplicate or empty representation makes the insert a no-op,
++ // desynchronizing id from the unichars vector; the set_* calls and
++ // unichars[id] below would then write out of bounds. The file is
++ // malformed, so reject it.
++ if (size() != static_cast<size_t>(id) + 1) {
++ fprintf(stderr, "%s:%d unichar %d has a duplicate or empty representation\n",
++ __FILE__, __LINE__, id);
++ return false;
++ }
+
+ this->set_isalpha(id, properties & ISALPHA_MASK);
+ this->set_islower(id, properties & ISLOWER_MASK);
+diff --git a/unittest/unicharset_load_test.cc b/unittest/unicharset_load_test.cc
+new file mode 100644
+index 00000000..d775e233
+--- /dev/null
++++ b/unittest/unicharset_load_test.cc
+@@ -0,0 +1,64 @@
++///////////////////////////////////////////////////////////////////////
++// File: unicharset_load_test.cc
++// Description: Tests that UNICHARSET::load_via_fgets rejects unicharset
++// files whose insertions desynchronize the id loop index
++// from the unichars vector (duplicate or empty
++// representations), which would make the subsequent set_*
++// calls write out of bounds, and non-positive size counts.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include "serialis.h" // for TFile
++#include "unicharset.h"
++
++#include <cstring>
++
++namespace tesseract {
++namespace {
++
++// Loads the given unicharset text via the TFile-based loader.
++bool LoadUnicharset(const char *text, UNICHARSET *unicharset) {
++ TFile fp;
++ if (!fp.Open(text, std::strlen(text))) {
++ return false;
++ }
++ return unicharset->load_from_file(&fp, false);
++}
++
++// A duplicate representation makes the second insert a no-op, so on
++// unpatched code the set_* calls for the remaining lines write past
++// the end of the unichars vector (ASan container-overflow).
++TEST(UnicharsetLoadTest, RejectsDuplicateRepresentation) {
++ const char *text = "3\nA 0 Latin\nA 0 Latin\nB 0 Latin\n";
++ UNICHARSET unicharset;
++ EXPECT_FALSE(LoadUnicharset(text, &unicharset));
++}
++
++// A non-positive size count must be rejected; on unpatched code a
++// zero or negative count loads an empty unicharset successfully.
++TEST(UnicharsetLoadTest, RejectsNonPositiveCount) {
++ const char *texts[] = {"0\n", "-1\n"};
++ for (const char *text : texts) {
++ UNICHARSET unicharset;
++ EXPECT_FALSE(LoadUnicharset(text, &unicharset));
++ }
++}
++
++// A valid unicharset must still be accepted.
++TEST(UnicharsetLoadTest, AcceptsValidUnicharset) {
++ const char *text = "3\nA 0 Latin\nB 0 Latin\nC 0 Latin\n";
++ UNICHARSET unicharset;
++ ASSERT_TRUE(LoadUnicharset(text, &unicharset));
++ EXPECT_EQ(unicharset.size(), 3u);
++ EXPECT_STREQ(unicharset.id_to_unichar(1), "B");
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index f26d2f36a1..a80407b749 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -10,6 +10,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-73066.patch \
file://CVE-2026-73067-1.patch \
file://CVE-2026-73067-2.patch \
+ file://CVE-2026-88052.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 17/24] tesseract: patch CVE-2026-88048
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (14 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 16/24] tesseract: patch CVE-2026-88052 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 18/24] tesseract: patch CVE-2026-88049 ankur.tyagi85
` (7 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88048
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88048.patch | 228 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 229 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88048.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88048.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88048.patch
new file mode 100644
index 0000000000..bc1beb5753
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88048.patch
@@ -0,0 +1,228 @@
+From 4dd118c5b87df1a4422ebb3ab3efaa3588b88cfa Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Fri, 21 Aug 2026 15:23:59 +0200
+Subject: [PATCH] Validate FullyConnected weight matrix dimensions at load
+
+FullyConnected::DeSerialize read the WeightMatrix without checking
+that its dimensions match the layer's declared ni/no. MatrixDotVector
+drives the dot product from the matrix dimensions (writes w.dim1()
+results, reads w.dim2()-1 inputs) while the scratch buffers are sized
+from no_ and ni_, so a crafted .traineddata with a mismatched matrix
+performed a heap out-of-bounds write (up to 65535 rows) and out-of-
+bounds read on the first recognition step (crash, or heap corruption
+with attacker-influenced size and content).
+
+Key changes:
+- weightmatrix.h: add Dim1()/Dim2() accessors for the active weight
+ matrix (int or float), alongside the existing NumOutputs().
+- fullyconnected.cpp: reject the layer in DeSerialize unless
+ Dim1() == no_ and Dim2() == ni_ + 1 (the second dimension
+ includes the bias column), the layout that InitWeightsFloat
+ always produces.
+- unittest: new fullyconnected_test that builds a Softmax network
+ with mismatched matrix dimensions and expects CreateFromFile to
+ return nullptr; on unpatched code the test reaches Forward and
+ ASan catches the out-of-bounds write in MatrixDotVector. A
+ second test verifies that matching dimensions are still accepted.
+
+Reported-by: Zhixi "Jace" Sun <g.mygenie@gmail.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit 103dc134eb36411ddc6833ec20aa2c76795bd0ff)
+
+CVE: CVE-2026-88048
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/103dc134eb36411ddc6833ec20aa2c76795bd0ff]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 ++
+ src/lstm/fullyconnected.cpp | 11 ++-
+ src/lstm/weightmatrix.h | 7 ++
+ unittest/fullyconnected_test.cc | 115 ++++++++++++++++++++++++++++++++
+ 4 files changed, 137 insertions(+), 1 deletion(-)
+ create mode 100644 unittest/fullyconnected_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index 1a0a6771..ea722409 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1187,6 +1187,7 @@ if !DISABLED_LEGACY_ENGINE
+ check_PROGRAMS += equationdetect_test
+ endif # !DISABLED_LEGACY_ENGINE
+ check_PROGRAMS += fileio_test
++check_PROGRAMS += fullyconnected_test
+ check_PROGRAMS += heap_test
+ check_PROGRAMS += imagedata_test
+ if !DISABLED_LEGACY_ENGINE
+@@ -1319,6 +1320,10 @@ fileio_test_SOURCES = unittest/fileio_test.cc
+ fileio_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ fileio_test_LDADD = $(TRAINING_LIBS)
+
++fullyconnected_test_SOURCES = unittest/fullyconnected_test.cc
++fullyconnected_test_CPPFLAGS = $(unittest_CPPFLAGS)
++fullyconnected_test_LDADD = $(TESS_LIBS)
++
+ heap_test_SOURCES = unittest/heap_test.cc
+ heap_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ heap_test_LDADD = $(TESS_LIBS)
+diff --git a/src/lstm/fullyconnected.cpp b/src/lstm/fullyconnected.cpp
+index 85989f40..380707a1 100644
+--- a/src/lstm/fullyconnected.cpp
++++ b/src/lstm/fullyconnected.cpp
+@@ -121,7 +121,16 @@ bool FullyConnected::Serialize(TFile *fp) const {
+
+ // Reads from the given file. Returns false in case of error.
+ bool FullyConnected::DeSerialize(TFile *fp) {
+- return weights_.DeSerialize(IsTraining(), fp);
++ if (!weights_.DeSerialize(IsTraining(), fp)) {
++ return false;
++ }
++ // The weight matrix must match the declared sizes (the second dimension
++ // includes the bias column); otherwise Forward would read or write
++ // outside the scratch buffers sized from ni_ and no_.
++ if (weights_.Dim1() != no_ || weights_.Dim2() != ni_ + 1) {
++ return false;
++ }
++ return true;
+ }
+
+ // Runs forward propagation of activations on the input line.
+diff --git a/src/lstm/weightmatrix.h b/src/lstm/weightmatrix.h
+index a2cdaa52..66b69dfa 100644
+--- a/src/lstm/weightmatrix.h
++++ b/src/lstm/weightmatrix.h
+@@ -107,6 +107,13 @@ public:
+ int NumOutputs() const {
+ return int_mode_ ? wi_.dim1() : wf_.dim1();
+ }
++ // The dimensions of the active weight matrix (wi_ in int mode, else wf_).
++ int Dim1() const {
++ return int_mode_ ? wi_.dim1() : wf_.dim1();
++ }
++ int Dim2() const {
++ return int_mode_ ? wi_.dim2() : wf_.dim2();
++ }
+ // Provides one set of weights. Only used by peep weight maxpool.
+ const TFloat *GetWeights(int index) const {
+ return wf_[index];
+diff --git a/unittest/fullyconnected_test.cc b/unittest/fullyconnected_test.cc
+new file mode 100644
+index 00000000..f9697de4
+--- /dev/null
++++ b/unittest/fullyconnected_test.cc
+@@ -0,0 +1,115 @@
++///////////////////////////////////////////////////////////////////////
++// File: fullyconnected_test.cc
++// Description: Tests that a FullyConnected (softmax) network layer with
++// weight-matrix dimensions that do not match the declared
++// ni/no is rejected at load. Without the check,
++// MatrixDotVector writes w.dim1() results into a scratch
++// buffer sized from no_ and reads w.dim2()-1 inputs from
++// a buffer sized from ni_ (heap out-of-bounds write/read)
++// on the first recognition step.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include "network.h" // for Network, NetworkType
++#include "networkio.h"
++#include "networkscratch.h"
++#include "serialis.h" // for TFile
++
++#include <cstdint>
++#include <vector>
++
++namespace tesseract {
++namespace {
++
++// Appends raw little-endian values to a byte buffer.
++class ByteWriter {
++public:
++ void PutU8(uint32_t v) { data_.push_back(static_cast<char>(v & 0xFF)); }
++ void PutU32(uint32_t v) {
++ for (int i = 0; i < 4; ++i) {
++ data_.push_back(static_cast<char>((v >> (8 * i)) & 0xFF));
++ }
++ }
++ void PutS32(int32_t v) { PutU32(static_cast<uint32_t>(v)); }
++ const std::vector<char> &data() const { return data_; }
++
++private:
++ std::vector<char> data_;
++};
++
++void PutDoubleLE(ByteWriter *w, double d) {
++ union {
++ double d;
++ uint64_t u;
++ } conv;
++ conv.d = d;
++ w->PutU32(static_cast<uint32_t>(conv.u & 0xFFFFFFFF));
++ w->PutU32(static_cast<uint32_t>(conv.u >> 32));
++}
++
++// Builds a serialized NT_SOFTMAX network: header with the given ni/no,
++// then a float-mode WeightMatrix with the given (corrupt) dimensions.
++// The matrix is stored as doubles on disk (see WeightMatrix::DeSerialize).
++std::vector<char> MakeSoftmaxNetwork(int ni, int no, int32_t dim1, int32_t dim2) {
++ ByteWriter w;
++ w.PutU8(static_cast<uint32_t>(NT_SOFTMAX));
++ w.PutU8(0); // training: TS_DISABLED
++ w.PutU8(0); // needs_to_backprop
++ w.PutU32(0); // network_flags
++ w.PutU32(static_cast<uint32_t>(ni));
++ w.PutU32(static_cast<uint32_t>(no));
++ w.PutU32(0); // num_weights (not cross-checked, kept consistent anyway)
++ w.PutU32(0); // name (empty string)
++ // WeightMatrix::DeSerialize:
++ w.PutU8(128); // mode: kDoubleFlag, float mode
++ w.PutS32(dim1);
++ w.PutS32(dim2);
++ PutDoubleLE(&w, 0.0); // empty_ cell
++ for (int32_t i = 0; i < dim1 * dim2; ++i) {
++ PutDoubleLE(&w, 0.0); // weight data
++ }
++ return w.data();
++}
++
++// A FullyConnected layer whose weight matrix does not match the declared
++// sizes must be rejected by CreateFromFile; on unpatched code the test
++// reaches Forward, where MatrixDotVector performs the out-of-bounds
++// write this regression test guards against.
++TEST(FullyconnectedTest, RejectsWeightMatrixDimensionMismatch) {
++ // ni_=no_=1 but dim1=3 (OOB write of 3 results into a 1-result buffer)
++ // and dim2=5 (OOB read of 4 inputs from a 1-input buffer).
++ std::vector<char> bytes = MakeSoftmaxNetwork(1, 1, 3, 5);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ Network *net = Network::CreateFromFile(&fp);
++ if (net == nullptr) {
++ return; // Fixed: the mismatched layer is rejected at load.
++ }
++ NetworkIO input;
++ input.Resize2d(false, /*width=*/1, /*num_features=*/1);
++ NetworkScratch scratch;
++ NetworkIO output;
++ net->Forward(false, input, nullptr, &scratch, &output);
++ delete net;
++ FAIL() << "crafted FullyConnected layer with mismatched weight matrix was accepted";
++}
++
++// Consistent dimensions must still be accepted.
++TEST(FullyconnectedTest, AcceptsMatchingDimensions) {
++ std::vector<char> bytes = MakeSoftmaxNetwork(1, 2, 2, 2);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ Network *net = Network::CreateFromFile(&fp);
++ ASSERT_NE(net, nullptr);
++ delete net;
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index a80407b749..a8b3e55c7d 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -11,6 +11,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-73067-1.patch \
file://CVE-2026-73067-2.patch \
file://CVE-2026-88052.patch \
+ file://CVE-2026-88048.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 18/24] tesseract: patch CVE-2026-88049
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (15 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 17/24] tesseract: patch CVE-2026-88048 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 19/24] tesseract: patch CVE-2026-88050 ankur.tyagi85
` (6 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88049
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88049.patch | 316 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 317 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88049.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88049.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88049.patch
new file mode 100644
index 0000000000..d7528e1825
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88049.patch
@@ -0,0 +1,316 @@
+From 2a118419439d1bfeb2bf8a78732a0fb2ad33475d Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Fri, 21 Aug 2026 16:41:51 +0200
+Subject: [PATCH] Validate LSTM gate matrix dimensions against na_/no_ at load
+
+LSTM::DeSerialize read na_ from the untrusted TESSDATA_LSTM component
+and derived ns_ from the CI gate matrix's dim1, but never checked that
+the deserialized dimensions were mutually consistent. The forward pass
+sizes its buffers from na_, no_ and ns_ while the gate matrices drive
+their own dimensions, so a crafted .traineddata performed heap
+out-of-bounds writes and reads during the first recognition step, e.g.
+WriteTimeStepPart writing ns_ floats at offset ni_+nf_ into a source_
+buffer sized from na_ (up to ~256 KB with an attacker-chosen gate
+matrix dim1).
+
+The bounds assertions added by 2f4d2f4 (CVE-2026-73066) covered only
+NetworkIO::CopyTimeStepGeneral and Randomize, leaving
+WriteTimeStepPart and AddTimeStepPart unguarded.
+
+Key changes:
+- weightmatrix.h: add Dim1()/Dim2() accessors for the active weight
+ matrix (int or float), alongside the existing NumOutputs().
+- lstm.cpp: reject the layer in DeSerialize unless na_ ==
+ ni_ + nf_ + (is_2d_ ? 2 : 1) * ns_, every deserialized gate has
+ Dim1() == ns_ and Dim2() == na_ + 1 (the layout InitWeightsFloat
+ always produces), ns_ == no_ for plain NT_LSTM/NT_LSTM_SUMMARY, and
+ the softmax layer's sizes match ns_/no_ for the softmax variants.
+- networkio.cpp: add the same defense-in-depth bounds assertions to
+ WriteTimeStepPart and AddTimeStepPart as 2f4d2f4 added to
+ CopyTimeStepGeneral and Randomize.
+- unittest: add lstm_layer_test with crafted NT_LSTM layers for the
+ na_ mismatch, gate dim1 mismatch, and gate dim2 mismatch cases
+ (each rejected at load; on unpatched code the tests reach Forward
+ and ASan catches the out-of-bounds write in WriteTimeStepPart),
+ plus a positive control that a consistent layer loads and runs.
+
+Reported-by: Zhixi "Jace" Sun <g.mygenie@gmail.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit b494ac18925f9d9aff9ef5815475de9943ab19bf)
+
+CVE: CVE-2026-88049
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/b494ac18925f9d9aff9ef5815475de9943ab19bf]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 +
+ src/lstm/lstm.cpp | 20 ++++
+ src/lstm/networkio.cpp | 2 +
+ unittest/lstm_layer_test.cc | 177 ++++++++++++++++++++++++++++++++++++
+ 4 files changed, 204 insertions(+)
+ create mode 100644 unittest/lstm_layer_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index ea722409..86ac9d0d 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1200,6 +1200,7 @@ check_PROGRAMS += layout_test
+ check_PROGRAMS += ligature_table_test
+ check_PROGRAMS += linlsq_test
+ check_PROGRAMS += list_test
++check_PROGRAMS += lstm_layer_test
+ if ENABLE_TRAINING
+ check_PROGRAMS += lstm_recode_test
+ check_PROGRAMS += lstm_squashed_test
+@@ -1381,6 +1382,10 @@ loadlang_test_SOURCES = unittest/loadlang_test.cc
+ loadlang_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ loadlang_test_LDADD = $(TESS_LIBS) $(LEPTONICA_LIBS)
+
++lstm_layer_test_SOURCES = unittest/lstm_layer_test.cc
++lstm_layer_test_CPPFLAGS = $(unittest_CPPFLAGS)
++lstm_layer_test_LDADD = $(TESS_LIBS)
++
+ lstm_recode_test_SOURCES = unittest/lstm_recode_test.cc
+ lstm_recode_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ lstm_recode_test_LDADD = $(TRAINING_LIBS)
+diff --git a/src/lstm/lstm.cpp b/src/lstm/lstm.cpp
+index 11722d79..4ce361eb 100644
+--- a/src/lstm/lstm.cpp
++++ b/src/lstm/lstm.cpp
+@@ -274,12 +274,32 @@ bool LSTM::DeSerialize(TFile *fp) {
+ is_2d_ = na_ - nf_ == ni_ + 2 * ns_;
+ }
+ }
++ // The deserialized dimensions must be mutually consistent: the forward
++ // pass sizes its buffers from na_, no_ and ns_ while the gate matrices
++ // drive their own dimensions.
++ if (na_ != ni_ + nf_ + (is_2d_ ? 2 : 1) * ns_) {
++ return false;
++ }
++ for (int w = 0; w < WT_COUNT; ++w) {
++ if (w == GFS && !Is2D()) {
++ continue;
++ }
++ if (gate_weights_[w].Dim1() != ns_ || gate_weights_[w].Dim2() != na_ + 1) {
++ return false;
++ }
++ }
++ if ((type_ == NT_LSTM || type_ == NT_LSTM_SUMMARY) && ns_ != no_) {
++ return false;
++ }
+ delete softmax_;
+ if (type_ == NT_LSTM_SOFTMAX || type_ == NT_LSTM_SOFTMAX_ENCODED) {
+ softmax_ = static_cast<FullyConnected *>(Network::CreateFromFile(fp));
+ if (softmax_ == nullptr) {
+ return false;
+ }
++ if (softmax_->NumInputs() != ns_ || softmax_->NumOutputs() != no_) {
++ return false;
++ }
+ } else {
+ softmax_ = nullptr;
+ }
+diff --git a/src/lstm/networkio.cpp b/src/lstm/networkio.cpp
+index 8636075b..929f5ac4 100644
+--- a/src/lstm/networkio.cpp
++++ b/src/lstm/networkio.cpp
+@@ -641,6 +641,7 @@ void NetworkIO::AddTimeStep(int t, TFloat *inout) const {
+
+ // Adds part of a single timestep to floats.
+ void NetworkIO::AddTimeStepPart(int t, int offset, int num_features, float *inout) const {
++ ASSERT_HOST(offset + num_features <= NumFeatures());
+ if (int_mode_) {
+ const int8_t *line = i_[t] + offset;
+ for (int i = 0; i < num_features; ++i) {
+@@ -662,6 +663,7 @@ void NetworkIO::WriteTimeStep(int t, const TFloat *input) {
+ // Writes a single timestep from floats in the range [-1, 1] writing only
+ // num_features elements of input to (*this)[t], starting at offset.
+ void NetworkIO::WriteTimeStepPart(int t, int offset, int num_features, const TFloat *input) {
++ ASSERT_HOST(offset + num_features <= NumFeatures());
+ if (int_mode_) {
+ int8_t *line = i_[t] + offset;
+ for (int i = 0; i < num_features; ++i) {
+diff --git a/unittest/lstm_layer_test.cc b/unittest/lstm_layer_test.cc
+new file mode 100644
+index 00000000..2c874995
+--- /dev/null
++++ b/unittest/lstm_layer_test.cc
+@@ -0,0 +1,177 @@
++///////////////////////////////////////////////////////////////////////
++// File: lstm_layer_test.cc
++// Description: Tests that an NT_LSTM network layer with mutually
++// inconsistent deserialized dimensions is rejected at
++// load. The forward pass sizes its buffers from na_, no_
++// and ns_ while the gate weight matrices drive their own
++// dimensions, so a crafted .traineddata performs heap
++// out-of-bounds writes/reads during the first
++// recognition step (e.g. WriteTimeStepPart writing ns_
++// floats into a source_ buffer sized from na_).
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include "network.h" // for Network, NetworkType
++#include "networkio.h"
++#include "networkscratch.h"
++#include "serialis.h" // for TFile
++#include "stridemap.h"
++
++#include <cstdint>
++#include <utility>
++#include <vector>
++
++namespace tesseract {
++namespace {
++
++// Appends raw little-endian values to a byte buffer.
++class ByteWriter {
++public:
++ void PutU8(uint32_t v) { data_.push_back(static_cast<char>(v & 0xFF)); }
++ void PutU32(uint32_t v) {
++ for (int i = 0; i < 4; ++i) {
++ data_.push_back(static_cast<char>((v >> (8 * i)) & 0xFF));
++ }
++ }
++ void PutS32(int32_t v) { PutU32(static_cast<uint32_t>(v)); }
++ const std::vector<char> &data() const { return data_; }
++
++private:
++ std::vector<char> data_;
++};
++
++void PutDoubleLE(ByteWriter *w, double d) {
++ union {
++ double d;
++ uint64_t u;
++ } conv;
++ conv.d = d;
++ w->PutU32(static_cast<uint32_t>(conv.u & 0xFFFFFFFF));
++ w->PutU32(static_cast<uint32_t>(conv.u >> 32));
++}
++
++// A serialized float-mode WeightMatrix with the given dimensions,
++// all weight data zeroed.
++void PutGateMatrix(ByteWriter *w, int32_t dim1, int32_t dim2) {
++ w->PutU8(128); // mode: kDoubleFlag, float mode
++ w->PutS32(dim1);
++ w->PutS32(dim2);
++ PutDoubleLE(w, 0.0); // empty_ cell
++ for (int32_t i = 0; i < dim1 * dim2; ++i) {
++ PutDoubleLE(w, 0.0);
++ }
++}
++
++// A serialized 1-D NT_LSTM network: header with the given ni/no, na_,
++// then the four gates CI, GI, GF1, GO (GFS is not serialized for 1-D).
++std::vector<char> MakeLstmNetwork(int ni, int no, int32_t na,
++ const int32_t gate_dim1[4], const int32_t gate_dim2[4]) {
++ ByteWriter w;
++ w.PutU8(static_cast<uint32_t>(NT_LSTM));
++ w.PutU8(0); // training: TS_DISABLED
++ w.PutU8(0); // needs_to_backprop
++ w.PutU32(0); // network_flags
++ w.PutU32(static_cast<uint32_t>(ni));
++ w.PutU32(static_cast<uint32_t>(no));
++ w.PutU32(0); // num_weights
++ w.PutU32(0); // name (empty string)
++ w.PutS32(na);
++ for (int g = 0; g < 4; ++g) {
++ PutGateMatrix(&w, gate_dim1[g], gate_dim2[g]);
++ }
++ return w.data();
++}
++
++// Builds the input a standalone LSTM layer would receive: one row of
++// the given width with ni features.
++NetworkIO MakeInput(int ni, int width) {
++ StrideMap stride_map;
++ stride_map.SetStride({{1, width}});
++ NetworkIO input;
++ input.ResizeToMap(false, stride_map, ni);
++ return input;
++}
++
++// Runs Forward on the loaded network; on unpatched code the out-of-
++// bounds access this regression test guards against fires here.
++void RunForward(Network *net, int ni, int width) {
++ NetworkIO input = MakeInput(ni, width);
++ NetworkScratch scratch;
++ NetworkIO output;
++ net->Forward(false, input, nullptr, &scratch, &output);
++ delete net;
++}
++
++// na_ must equal ni_ + nf_ + ns_ for a 1-D LSTM; here na_=2 but the
++// CI matrix makes ns_=64, so the layer must be rejected. On unpatched
++// code Forward writes 64 floats at offset ni_=1 into a source_ buffer
++// sized for na_=2 (heap out-of-bounds write).
++TEST(LstmLayerTest, RejectsInconsistentNa) {
++ const int32_t dim1[4] = {64, 64, 64, 64};
++ const int32_t dim2[4] = {3, 3, 3, 3};
++ std::vector<char> bytes = MakeLstmNetwork(1, 1, 2, dim1, dim2);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ Network *net = Network::CreateFromFile(&fp);
++ if (net == nullptr) {
++ return; // Fixed: the inconsistent layer is rejected at load.
++ }
++ RunForward(net, 1, 2);
++ FAIL() << "crafted LSTM layer with inconsistent na_ was accepted";
++}
++
++// All gate matrices must have dim1 == ns_; here the GI matrix has
++// dim1=9 while ns_=5. On unpatched code the GI gate dot product writes
++// 9 results into a temp line sized for 5 (heap out-of-bounds write).
++TEST(LstmLayerTest, RejectsGateDim1Mismatch) {
++ const int32_t dim1[4] = {5, 9, 5, 5};
++ const int32_t dim2[4] = {7, 7, 7, 7};
++ std::vector<char> bytes = MakeLstmNetwork(1, 5, 6, dim1, dim2);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ Network *net = Network::CreateFromFile(&fp);
++ if (net == nullptr) {
++ return; // Fixed: the inconsistent layer is rejected at load.
++ }
++ RunForward(net, 1, 2);
++ FAIL() << "crafted LSTM layer with inconsistent gate dim1 was accepted";
++}
++
++// All gate matrices must have dim2 == na_ + 1; here the GI matrix has
++// dim2=9 while na_=6. On unpatched code the GI gate dot product reads
++// 8 inputs from a buffer sized for 6 (heap out-of-bounds read).
++TEST(LstmLayerTest, RejectsGateDim2Mismatch) {
++ const int32_t dim1[4] = {5, 5, 5, 5};
++ const int32_t dim2[4] = {7, 9, 7, 7};
++ std::vector<char> bytes = MakeLstmNetwork(1, 5, 6, dim1, dim2);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ Network *net = Network::CreateFromFile(&fp);
++ if (net == nullptr) {
++ return; // Fixed: the inconsistent layer is rejected at load.
++ }
++ RunForward(net, 1, 2);
++ FAIL() << "crafted LSTM layer with inconsistent gate dim2 was accepted";
++}
++
++// A fully consistent 1-D LSTM layer must still be accepted and usable.
++TEST(LstmLayerTest, AcceptsConsistentLayer) {
++ const int32_t dim1[4] = {5, 5, 5, 5};
++ const int32_t dim2[4] = {7, 7, 7, 7};
++ std::vector<char> bytes = MakeLstmNetwork(1, 5, 6, dim1, dim2);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ Network *net = Network::CreateFromFile(&fp);
++ ASSERT_NE(net, nullptr);
++ RunForward(net, 1, 2);
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index a8b3e55c7d..df6ff11d78 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -12,6 +12,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-73067-2.patch \
file://CVE-2026-88052.patch \
file://CVE-2026-88048.patch \
+ file://CVE-2026-88049.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 19/24] tesseract: patch CVE-2026-88050
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (16 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 18/24] tesseract: patch CVE-2026-88049 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 20/24] tesseract: patch CVE-2026-88047 ankur.tyagi85
` (5 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88050
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88050.patch | 210 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 211 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88050.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88050.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88050.patch
new file mode 100644
index 0000000000..b07ef69989
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88050.patch
@@ -0,0 +1,210 @@
+From bb1e72a7f8488d653d2a37e482babac6d9dc7ab2 Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Fri, 21 Aug 2026 16:56:51 +0200
+Subject: [PATCH] Reject recoder code values outside the sane range at load
+
+RecodedCharID::DeSerialize (hardened by 82727cc to check length_
+only) still read the individual code values as raw signed int32.
+UnicharCompress::ComputeCodeRange computes code_range_ as 1 plus the
+maximum code using a signed > comparison, so a code value of -1
+never raises the maximum and yields code_range_ = 0. SetupDecoder
+then resizes is_valid_start_ to 0 and writes is_valid_start_[code(0)]
+on the size-0 vector<bool>, an out-of-bounds write at a wild wrapped
+index (deterministic crash) on LSTMRecognizer load. A code value of
+INT32_MAX instead wraps code_range_ negative and makes resize()
+throw.
+
+Key changes:
+- unicharcompress.h: validate each deserialized code value to be
+ within [0, UINT16_MAX), the same arbitrary cap used elsewhere for
+ .traineddata counts; reject the recoder otherwise.
+- unicharcompress.h/.cpp: add defense-in-depth bounds assertions to
+ IsValidFirstCode and SetupDecoder, matching the style of the
+ NetworkIO assertions from 2f4d2f4.
+- unittest: add recoder_test, which feeds a crafted UnicharCompress
+ with a -1 code and an INT32_MAX code and expects DeSerialize to
+ fail (on unpatched code the -1 case dies on the SEGV in
+ SetupDecoder, the huge case on the uncaught length_error), plus a
+ positive control that valid codes load and answer
+ code_range()/IsValidFirstCode() correctly.
+
+Reported-by: Zhixi "Jace" Sun <g.mygenie@gmail.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit c94a5532ee04db5a4919542832fd94caee5ea58f)
+
+CVE: CVE-2026-88050
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/c94a5532ee04db5a4919542832fd94caee5ea58f]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 ++
+ src/ccutil/unicharcompress.cpp | 1 +
+ src/ccutil/unicharcompress.h | 13 ++++-
+ unittest/recoder_test.cc | 91 ++++++++++++++++++++++++++++++++++
+ 4 files changed, 109 insertions(+), 1 deletion(-)
+ create mode 100644 unittest/recoder_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index 86ac9d0d..c1491263 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1231,6 +1231,7 @@ endif # !DISABLED_LEGACY_ENGINE
+ check_PROGRAMS += progress_test
+ check_PROGRAMS += qrsequence_test
+ check_PROGRAMS += recodebeam_test
++check_PROGRAMS += recoder_test
+ check_PROGRAMS += rect_test
+ check_PROGRAMS += resultiterator_test
+ check_PROGRAMS += scanutils_test
+@@ -1464,6 +1465,10 @@ recodebeam_test_SOURCES = unittest/recodebeam_test.cc
+ recodebeam_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ recodebeam_test_LDADD = $(TRAINING_LIBS) $(ICU_I18N_LIBS) $(ICU_UC_LIBS)
+
++recoder_test_SOURCES = unittest/recoder_test.cc
++recoder_test_CPPFLAGS = $(unittest_CPPFLAGS)
++recoder_test_LDADD = $(TESS_LIBS)
++
+ rect_test_SOURCES = unittest/rect_test.cc
+ rect_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ rect_test_LDADD = $(TESS_LIBS)
+diff --git a/src/ccutil/unicharcompress.cpp b/src/ccutil/unicharcompress.cpp
+index d5efccab..7f3d48fe 100644
+--- a/src/ccutil/unicharcompress.cpp
++++ b/src/ccutil/unicharcompress.cpp
+@@ -400,6 +400,7 @@ void UnicharCompress::SetupDecoder() {
+ for (unsigned c = 0; c < encoder_.size(); ++c) {
+ const RecodedCharID &code = encoder_[c];
+ decoder_[code] = c;
++ ASSERT_HOST(code(0) >= 0 && code(0) < code_range_);
+ is_valid_start_[code(0)] = true;
+ RecodedCharID prefix = code;
+ int len = code.length() - 1;
+diff --git a/src/ccutil/unicharcompress.h b/src/ccutil/unicharcompress.h
+index 67a441e8..05778ce6 100644
+--- a/src/ccutil/unicharcompress.h
++++ b/src/ccutil/unicharcompress.h
+@@ -79,7 +79,17 @@ public:
+ if (length_ > kMaxCodeLen) {
+ return false;
+ }
+- return fp->DeSerialize(&code_[0], length_);
++ if (!fp->DeSerialize(&code_[0], length_)) {
++ return false;
++ }
++ // Code values index arrays sized from the maximum code; reject values
++ // that are out of the sane range for a recoded alphabet.
++ for (uint32_t i = 0; i < length_; ++i) {
++ if (code_[i] < 0 || code_[i] >= static_cast<int32_t>(UINT16_MAX)) {
++ return false;
++ }
++ }
++ return true;
+ }
+ bool operator==(const RecodedCharID &other) const {
+ if (length_ != other.length_) {
+@@ -185,6 +195,7 @@ public:
+ int DecodeUnichar(const RecodedCharID &code) const;
+ // Returns true if the given code is a valid start or single code.
+ bool IsValidFirstCode(int code) const {
++ ASSERT_HOST(code >= 0 && code < code_range_);
+ return is_valid_start_[code];
+ }
+ // Returns a list of valid non-final next codes for a given prefix code,
+diff --git a/unittest/recoder_test.cc b/unittest/recoder_test.cc
+new file mode 100644
+index 00000000..48dfa7ea
+--- /dev/null
++++ b/unittest/recoder_test.cc
+@@ -0,0 +1,91 @@
++///////////////////////////////////////////////////////////////////////
++// File: recoder_test.cc
++// Description: Tests that a UnicharCompress (LSTM recoder) with code
++// values outside the sane range is rejected at load.
++// Negative code values leave code_range_ at zero, so
++// SetupDecoder writes is_valid_start_[code(0)] out of
++// bounds on a size-0 vector<bool>; huge code values wrap
++// code_range_ and make resize() throw.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include "serialis.h" // for TFile
++#include "unicharcompress.h"
++
++#include <cstdint>
++#include <vector>
++
++namespace tesseract {
++namespace {
++
++// Appends raw little-endian values to a byte buffer.
++class ByteWriter {
++public:
++ void PutU8(uint32_t v) { data_.push_back(static_cast<char>(v & 0xFF)); }
++ void PutU32(uint32_t v) {
++ for (int i = 0; i < 4; ++i) {
++ data_.push_back(static_cast<char>((v >> (8 * i)) & 0xFF));
++ }
++ }
++ void PutS32(int32_t v) { PutU32(static_cast<uint32_t>(v)); }
++ const std::vector<char> &data() const { return data_; }
++
++private:
++ std::vector<char> data_;
++};
++
++// A serialized UnicharCompress with one length-1 RecodedCharID per
++// given code value (self-normalizing).
++std::vector<char> MakeRecoder(const std::vector<int32_t> &codes) {
++ ByteWriter w;
++ w.PutU32(codes.size());
++ for (int32_t code : codes) {
++ w.PutU8(1); // self_normalized_
++ w.PutU32(1); // length_
++ w.PutS32(code); // code_[0]
++ }
++ return w.data();
++}
++
++// A recoder code of -1 keeps code_range_ at 0, so on unpatched code
++// SetupDecoder performs an out-of-bounds write into the size-0
++// is_valid_start_ vector<bool>.
++TEST(RecoderTest, RejectsNegativeCode) {
++ std::vector<char> bytes = MakeRecoder({-1});
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ UnicharCompress recoder;
++ EXPECT_FALSE(recoder.DeSerialize(&fp));
++}
++
++// A recoder code of INT32_MAX wraps code_range_ to a negative value,
++// so on unpatched code SetupDecoder's resize() throws.
++TEST(RecoderTest, RejectsHugeCode) {
++ std::vector<char> bytes = MakeRecoder({INT32_MAX});
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ UnicharCompress recoder;
++ EXPECT_FALSE(recoder.DeSerialize(&fp));
++}
++
++// A valid recoder must still be accepted and usable.
++TEST(RecoderTest, AcceptsValidCodes) {
++ std::vector<char> bytes = MakeRecoder({0, 1});
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ UnicharCompress recoder;
++ ASSERT_TRUE(recoder.DeSerialize(&fp));
++ EXPECT_EQ(recoder.code_range(), 2);
++ EXPECT_TRUE(recoder.IsValidFirstCode(0));
++ EXPECT_TRUE(recoder.IsValidFirstCode(1));
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index df6ff11d78..756e780659 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -13,6 +13,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-88052.patch \
file://CVE-2026-88048.patch \
file://CVE-2026-88049.patch \
+ file://CVE-2026-88050.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 20/24] tesseract: patch CVE-2026-88047
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (17 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 19/24] tesseract: patch CVE-2026-88050 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 21/24] tesseract: patch CVE-2026-88051 ankur.tyagi85
` (4 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88047
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88047.patch | 226 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 227 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88047.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88047.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88047.patch
new file mode 100644
index 0000000000..04e9953d2a
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88047.patch
@@ -0,0 +1,226 @@
+From a6e329ff576ad4a90952f08359dbffab7e480157 Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Mon, 24 Aug 2026 13:39:22 +0200
+Subject: [PATCH] Limit unichar extraction in ReadNormProtos to the buffer size
+
+Classify::ReadNormProtos parsed each normproto line with
+`stream >> unichar >> NumProtos` into a char unichar[2 * UNICHAR_LEN + 1]
+stack buffer, but char* extraction from an istream has no length limit
+(the stream width was never set). A crafted TESSDATA_NORMPROTO component
+in a .traineddata file whose first proto-line token exceeds 60
+characters (the 100-byte line buffer allows up to 99) overflows the
+stack buffer during legacy engine initialization (CWE-121).
+
+Toolchain note: Apple's libc++ provides a C++20 array overload of
+operator>>(basic_istream&, char(&)[N]) that implicitly bounds the
+extraction to the array size, so builds against that standard library
+are incidentally protected. Standard libraries without that overload
+(e.g. libstdc++) still take the unbounded char* overload, so the
+explicit width limit below makes the behavior defined on all
+toolchains.
+
+Key changes:
+- normmatch.cpp: read the unichar token with
+ std::setw(2 * UNICHAR_LEN + 1); char* extraction takes at most
+ width - 1 characters, which fits the buffer exactly. Overlong
+ tokens are truncated and the line is rejected like any other
+ unparseable line.
+- unittest: add normproto_test covering a 99-character token (the
+ maximum a 100-byte line can hold), a token of exactly 2 *
+ UNICHAR_LEN characters, and a well-formed component. A minimal
+ reproduction of the unbounded extraction crashes an ASan build
+ with a stack-buffer-overflow.
+
+Reported-by: Tristan Madani <tristan@talencesecurity.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit 1bda5079b1c8a7e25f523486837426903d29ce84)
+
+CVE: CVE-2026-88047
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/1bda5079b1c8a7e25f523486837426903d29ce84]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 ++
+ src/classify/normmatch.cpp | 6 +-
+ unittest/CMakeLists.txt | 1 +
+ unittest/normproto_test.cc | 111 +++++++++++++++++++++++++++++++++++++
+ 4 files changed, 122 insertions(+), 1 deletion(-)
+ create mode 100644 unittest/normproto_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index c1491263..48e7dcbc 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1213,6 +1213,7 @@ check_PROGRAMS += mastertrainer_test
+ endif # !DISABLED_LEGACY_ENGINE
+ check_PROGRAMS += matrix_test
+ check_PROGRAMS += networkio_test
++check_PROGRAMS += normproto_test
+ if ENABLE_TRAINING
+ check_PROGRAMS += normstrngs_test
+ endif # ENABLE_TRAINING
+@@ -1417,6 +1418,10 @@ networkio_test_SOURCES = unittest/networkio_test.cc
+ networkio_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ networkio_test_LDADD = $(TESS_LIBS)
+
++normproto_test_SOURCES = unittest/normproto_test.cc
++normproto_test_CPPFLAGS = $(unittest_CPPFLAGS)
++normproto_test_LDADD = $(TESS_LIBS)
++
+ normstrngs_test_SOURCES = unittest/normstrngs_test.cc
+ normstrngs_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ normstrngs_test_LDADD = $(TRAINING_LIBS) $(ICU_I18N_LIBS) $(ICU_UC_LIBS)
+diff --git a/src/classify/normmatch.cpp b/src/classify/normmatch.cpp
+index d5bd7e6a..1ce7c928 100644
+--- a/src/classify/normmatch.cpp
++++ b/src/classify/normmatch.cpp
+@@ -28,6 +28,7 @@
+
+ #include <cmath>
+ #include <cstdio>
++#include <iomanip> // for std::setw
+ #include <sstream> // for std::istringstream
+
+ namespace tesseract {
+@@ -190,7 +191,10 @@ NORM_PROTOS *Classify::ReadNormProtos(TFile *fp) {
+ while (fp->FGets(line, kMaxLineSize) != nullptr) {
+ std::istringstream stream(line);
+ stream.imbue(std::locale::classic());
+- stream >> unichar >> NumProtos;
++ // unichar holds at most 2 * UNICHAR_LEN characters; the width limit
++ // (width - 1 characters for char* extraction) keeps the extraction
++ // from overflowing the buffer on overlong lines.
++ stream >> std::setw(2 * UNICHAR_LEN + 1) >> unichar >> NumProtos;
+ if (stream.fail()) {
+ continue;
+ }
+diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt
+index 6a91c62f..b65cf922 100644
+--- a/unittest/CMakeLists.txt
++++ b/unittest/CMakeLists.txt
+@@ -61,6 +61,7 @@ set(LEGACY_TESTS
+ indexmapbidi_test.cc
+ intfeaturemap_test.cc
+ mastertrainer_test.cc
++ normproto_test.cc
+ osd_test.cc
+ params_model_test.cc
+ shapetable_test.cc)
+diff --git a/unittest/normproto_test.cc b/unittest/normproto_test.cc
+new file mode 100644
+index 00000000..574b2f3d
+--- /dev/null
++++ b/unittest/normproto_test.cc
+@@ -0,0 +1,111 @@
++///////////////////////////////////////////////////////////////////////
++// File: normproto_test.cc
++// Description: Tests that Classify::ReadNormProtos handles a normproto
++// line whose first (unichar) token exceeds the
++// unichar[2 * UNICHAR_LEN + 1] stack buffer. The
++// istream extraction has no intrinsic length limit, so a
++// crafted NORMPROTO component in a .traineddata file
++// could overflow the stack buffer during legacy engine
++// initialization.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include "classify.h"
++#include "serialis.h" // for TFile
++
++#include <cstdio>
++#include <cstdlib>
++#include <string>
++#include <vector>
++
++namespace tesseract {
++namespace {
++
++// Minimal unicharset (space and 'a').
++const char kMinUnicharset[] =
++ "2\n"
++ "NULL 1 0,255,0,255,0,0,0,0,0,0 Latin 2 0 2\n"
++ "a 1 0,255,0,255,0,0,0,0,0,0 Latin 2 0 2\n";
++
++// Builds a normproto component: a sample-size line (5), five parameter
++// description lines, then the given raw proto lines.
++std::vector<char> MakeNormproto(const std::string &lines) {
++ std::string data = "5\n";
++ for (int i = 0; i < 5; ++i) {
++ data += "e e 0 1\n";
++ }
++ data += lines;
++ return std::vector<char>(data.begin(), data.end());
++}
++
++class NormprotoTest : public testing::Test {
++protected:
++ void SetUp() override {
++ tmpl_ = "/tmp/tess_normproto_test_XXXXXX";
++ char *dir = mkdtemp(tmpl_.data());
++ ASSERT_NE(dir, nullptr);
++ dir_ = dir;
++ std::string uc_path = dir_ + "/eng.unicharset";
++ FILE *f = fopen(uc_path.c_str(), "w");
++ ASSERT_NE(f, nullptr);
++ ASSERT_EQ(fwrite(kMinUnicharset, 1, sizeof(kMinUnicharset) - 1, f),
++ sizeof(kMinUnicharset) - 1);
++ fclose(f);
++ // Load the minimal unicharset into the classifier's inherited
++ // unicharset member.
++ ASSERT_TRUE(classifier_.unicharset.load_from_file(uc_path.c_str()));
++ }
++ void TearDown() override {
++ std::remove((dir_ + "/eng.unicharset").c_str());
++ rmdir(dir_.c_str());
++ }
++ std::string dir_;
++ std::string tmpl_;
++ Classify classifier_;
++};
++
++// A 99-character first token (the maximum FGets can return) overflows
++// unichar[2 * UNICHAR_LEN + 1] on unpatched code; the width-limited
++// extraction must reject the line instead.
++TEST_F(NormprotoTest, ToleratesOverlongUnicharToken) {
++ std::vector<char> bytes = MakeNormproto(std::string(99, 'A') + "\n");
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ classifier_.NormProtos = classifier_.ReadNormProtos(&fp);
++ ASSERT_NE(classifier_.NormProtos, nullptr);
++ classifier_.FreeNormProtos();
++ EXPECT_EQ(classifier_.NormProtos, nullptr);
++}
++
++// A token of exactly 2 * UNICHAR_LEN characters is the maximum legitimate
++// size; it must not be truncated or rejected by the width limit.
++TEST_F(NormprotoTest, ToleratesMaxLenUnicharToken) {
++ std::vector<char> bytes = MakeNormproto(std::string(2 * UNICHAR_LEN, 'A') + " 0\n");
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ classifier_.NormProtos = classifier_.ReadNormProtos(&fp);
++ ASSERT_NE(classifier_.NormProtos, nullptr);
++ classifier_.FreeNormProtos();
++ EXPECT_EQ(classifier_.NormProtos, nullptr);
++}
++
++// A well-formed normproto component must still parse.
++TEST_F(NormprotoTest, ReadsValidNormprotos) {
++ std::vector<char> bytes = MakeNormproto("a 0\n");
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ classifier_.NormProtos = classifier_.ReadNormProtos(&fp);
++ ASSERT_NE(classifier_.NormProtos, nullptr);
++ classifier_.FreeNormProtos();
++ EXPECT_EQ(classifier_.NormProtos, nullptr);
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index 756e780659..61cb1f7cad 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -14,6 +14,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-88048.patch \
file://CVE-2026-88049.patch \
file://CVE-2026-88050.patch \
+ file://CVE-2026-88047.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 21/24] tesseract: patch CVE-2026-88051
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (18 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 20/24] tesseract: patch CVE-2026-88047 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 22/24] tesseract: patch CVE-2026-88054 ankur.tyagi85
` (3 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88051
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88051.patch | 185 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 186 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88051.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88051.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88051.patch
new file mode 100644
index 0000000000..efc204dc04
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88051.patch
@@ -0,0 +1,185 @@
+From 0ad773414bcb9a4f41e7d86759353d9558ba8cbe Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Fri, 21 Aug 2026 20:29:37 +0200
+Subject: [PATCH] Validate vector counts in GenericVector::read
+
+The callback form of GenericVector::read read two independent int32
+fields from the file: reserved sized the allocation via reserve(),
+while size_used_ drove the element loop. Neither was capped and no
+size_used_ <= reserved invariant was checked, so a crafted
+.traineddata (e.g. the fontinfo table of a version >= 4 inttemp
+component) performed a heap out-of-bounds write during legacy
+engine initialization.
+
+Key changes:
+- genericvector.h: reject negative or over-limit reserved
+ (matching the 50000000 cap of the DeSerialize overloads) and
+ reject size_used_ < 0 or size_used_ > reserved before entering
+ the read loop. Legit files always satisfy size_used_ <= reserved,
+ as write() persists size_reserved_ first.
+- unittest: add genericvector_test covering size_used_ beyond
+ reserved (on unpatched code the ASan build dies on a
+ heap-buffer-overflow in the read loop), negative counts, and a
+ consistent vector that must still load.
+
+Reported-by: Zhixi "Jace" Sun <g.mygenie@gmail.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit 56e09ca12e751623fe796ce1554ce704bffd2ef0)
+
+CVE: CVE-2026-88051
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/56e09ca12e751623fe796ce1554ce704bffd2ef0]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 ++
+ src/ccutil/genericvector.h | 10 ++++
+ unittest/genericvector_test.cc | 91 ++++++++++++++++++++++++++++++++++
+ 3 files changed, 106 insertions(+)
+ create mode 100644 unittest/genericvector_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index 48e7dcbc..d2b503d4 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1188,6 +1188,7 @@ check_PROGRAMS += equationdetect_test
+ endif # !DISABLED_LEGACY_ENGINE
+ check_PROGRAMS += fileio_test
+ check_PROGRAMS += fullyconnected_test
++check_PROGRAMS += genericvector_test
+ check_PROGRAMS += heap_test
+ check_PROGRAMS += imagedata_test
+ if !DISABLED_LEGACY_ENGINE
+@@ -1327,6 +1328,10 @@ fullyconnected_test_SOURCES = unittest/fullyconnected_test.cc
+ fullyconnected_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ fullyconnected_test_LDADD = $(TESS_LIBS)
+
++genericvector_test_SOURCES = unittest/genericvector_test.cc
++genericvector_test_CPPFLAGS = $(unittest_CPPFLAGS)
++genericvector_test_LDADD = $(TESS_LIBS)
++
+ heap_test_SOURCES = unittest/heap_test.cc
+ heap_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ heap_test_LDADD = $(TESS_LIBS)
+diff --git a/src/ccutil/genericvector.h b/src/ccutil/genericvector.h
+index 4a5bbe12..cbe1e203 100644
+--- a/src/ccutil/genericvector.h
++++ b/src/ccutil/genericvector.h
+@@ -654,10 +654,20 @@ bool GenericVector<T>::read(TFile *f, const std::function<bool(TFile *, T *)> &c
+ if (f->FReadEndian(&reserved, sizeof(reserved), 1) != 1) {
+ return false;
+ }
++ // Arbitrarily limit the number of elements to protect against bad data.
++ const uint32_t limit = 50000000;
++ if (reserved < 0 || static_cast<uint32_t>(reserved) > limit) {
++ return false;
++ }
+ reserve(reserved);
+ if (f->FReadEndian(&size_used_, sizeof(size_used_), 1) != 1) {
+ return false;
+ }
++ // size_used_ is an independent file field; without this check the reads
++ // below land past the end of the buffer sized from reserved.
++ if (size_used_ < 0 || size_used_ > reserved) {
++ return false;
++ }
+ if (cb != nullptr) {
+ for (int i = 0; i < size_used_; ++i) {
+ if (!cb(f, data_ + i)) {
+diff --git a/unittest/genericvector_test.cc b/unittest/genericvector_test.cc
+new file mode 100644
+index 00000000..269b00f0
+--- /dev/null
++++ b/unittest/genericvector_test.cc
+@@ -0,0 +1,91 @@
++///////////////////////////////////////////////////////////////////////
++// File: genericvector_test.cc
++// Description: Tests that the callback form of GenericVector::read
++// rejects vectors whose size_used_ exceeds reserved (or
++// whose counts are negative). reserved sizes the buffer
++// while size_used_ is an independent file field driving
++// the element loop, so a crafted .traineddata (e.g. the
++// fontinfo table of a version >= 4 inttemp component)
++// performs a heap out-of-bounds write during legacy
++// engine initialization.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include "genericvector.h"
++#include "serialis.h" // for TFile
++
++#include <cstdint>
++#include <vector>
++
++namespace tesseract {
++namespace {
++
++// Appends raw little-endian values to a byte buffer.
++class ByteWriter {
++public:
++ void PutS32(int32_t v) {
++ uint32_t u = static_cast<uint32_t>(v);
++ for (int i = 0; i < 4; ++i) {
++ data_.push_back(static_cast<char>((u >> (8 * i)) & 0xFF));
++ }
++ }
++ const std::vector<char> &data() const { return data_; }
++
++private:
++ std::vector<char> data_;
++};
++
++// A serialized vector header (reserved, size_used_) followed by the
++// given number of int32 elements.
++std::vector<char> MakeVector(int32_t reserved, int32_t size_used, int32_t num_elements) {
++ ByteWriter w;
++ w.PutS32(reserved);
++ w.PutS32(size_used);
++ for (int32_t i = 0; i < num_elements; ++i) {
++ w.PutS32(i);
++ }
++ return w.data();
++}
++
++// reserved=4 but size_used_=0x10000: on unpatched code the callback
++// loop writes 65536 ints past the 4-int buffer (heap out-of-bounds
++// write).
++TEST(GenericVectorTest, RejectsSizeUsedBeyondReserved) {
++ std::vector<char> bytes = MakeVector(4, 0x10000, 0x10000);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ GenericVector<int> v;
++ EXPECT_FALSE(v.read(&fp, [](TFile *f, int *p) { return f->DeSerialize(p); }));
++}
++
++// Negative counts must be rejected; on unpatched code the read
++// "succeeds" and leaves size_used_ negative.
++TEST(GenericVectorTest, RejectsNegativeCounts) {
++ std::vector<char> bytes = MakeVector(-1, -1, 0);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ GenericVector<int> v;
++ EXPECT_FALSE(v.read(&fp, [](TFile *f, int *p) { return f->DeSerialize(p); }));
++}
++
++// A consistent vector must still be accepted.
++TEST(GenericVectorTest, AcceptsConsistentVector) {
++ std::vector<char> bytes = MakeVector(4, 2, 2);
++ TFile fp;
++ ASSERT_TRUE(fp.Open(bytes.data(), bytes.size()));
++ GenericVector<int> v;
++ ASSERT_TRUE(v.read(&fp, [](TFile *f, int *p) { return f->DeSerialize(p); }));
++ EXPECT_EQ(v.size(), 2);
++ EXPECT_EQ(v[0], 0);
++ EXPECT_EQ(v[1], 1);
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index 61cb1f7cad..60b50f16a5 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -15,6 +15,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-88049.patch \
file://CVE-2026-88050.patch \
file://CVE-2026-88047.patch \
+ file://CVE-2026-88051.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 22/24] tesseract: patch CVE-2026-88054
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (19 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 21/24] tesseract: patch CVE-2026-88051 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 23/24] valkey: upgrade 9.0.5 -> 9.0.6 ankur.tyagi85
` (2 subsequent siblings)
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-88054
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../tesseract/tesseract/CVE-2026-88054.patch | 275 ++++++++++++++++++
.../tesseract/tesseract_5.5.2.bb | 1 +
2 files changed, 276 insertions(+)
create mode 100644 meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88054.patch
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88054.patch b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88054.patch
new file mode 100644
index 0000000000..e89df4c477
--- /dev/null
+++ b/meta-oe/recipes-graphics/tesseract/tesseract/CVE-2026-88054.patch
@@ -0,0 +1,275 @@
+From 3e9dc6d17fbbba936ca0c18a785cc481e6539555 Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw@weilnetz.de>
+Date: Fri, 21 Aug 2026 14:38:55 +0200
+Subject: [PATCH] Reject empty network stacks in LSTM .traineddata
+ deserialization
+
+Plumbing::DeSerialize read the network stack size from the untrusted
+TESSDATA_LSTM component and only rejected size > 10000. A crafted
+.traineddata with a top-level Series/Parallel/Reversed layer with an
+empty stack survived load; LSTMRecognizer initialization then called
+network_->CacheXScaleFactor(network_->XScaleFactor()), which
+dereferences stack_[0] on the empty vector:
+- Series: Series::CacheXScaleFactor (series.cpp)
+- Parallel/Reversed: inherited Plumbing::XScaleFactor
+The virtual call through the wild pointer crashed the process at
+initialization (deterministic denial of service).
+
+Key changes:
+- plumbing.cpp: reject size == 0 for all plumbing types, and
+ size < 2 for NT_SERIES (Series::Forward requires two or more
+ networks and always aborts on one).
+- tessedit.cpp: fail the language load gracefully when the LSTM model
+ cannot be loaded, instead of aborting via ASSERT_HOST, so
+ TessBaseAPI::Init returns -1 on corrupt traineddata.
+- unittest: add plumbing_test, which builds a minimal traineddata
+ with empty/undersized LSTM plumbing stacks and expects a graceful
+ init failure. On unpatched code the tests die on the original
+ SEGV in Series::CacheXScaleFactor / Plumbing::XScaleFactor.
+
+Reported-by: Zhixi "Jace" Sun <g.mygenie@gmail.com>
+Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
+Signed-off-by: Stefan Weil <sw@weilnetz.de>
+(cherry picked from commit 552771236b0d80cbdb0c7dd856120fa21a4672e5)
+
+CVE: CVE-2026-88054
+Upstream-Status: Backport [https://github.com/tesseract-ocr/tesseract/commit/552771236b0d80cbdb0c7dd856120fa21a4672e5]
+
+Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
+---
+ Makefile.am | 5 ++
+ src/ccmain/tessedit.cpp | 7 +-
+ src/lstm/plumbing.cpp | 6 ++
+ unittest/plumbing_test.cc | 165 ++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 182 insertions(+), 1 deletion(-)
+ create mode 100644 unittest/plumbing_test.cc
+
+diff --git a/Makefile.am b/Makefile.am
+index d2b503d4..76978570 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1227,6 +1227,7 @@ if ENABLE_TRAINING
+ check_PROGRAMS += pango_font_info_test
+ endif # ENABLE_TRAINING
+ check_PROGRAMS += paragraphs_test
++check_PROGRAMS += plumbing_test
+ if !DISABLED_LEGACY_ENGINE
+ check_PROGRAMS += params_model_test
+ endif # !DISABLED_LEGACY_ENGINE
+@@ -1456,6 +1457,10 @@ paragraphs_test_SOURCES = unittest/paragraphs_test.cc
+ paragraphs_test_CPPFLAGS = $(unittest_CPPFLAGS)
+ paragraphs_test_LDADD = $(TESS_LIBS)
+
++plumbing_test_SOURCES = unittest/plumbing_test.cc
++plumbing_test_CPPFLAGS = $(unittest_CPPFLAGS)
++plumbing_test_LDADD = $(TESS_LIBS)
++
+ if !DISABLED_LEGACY_ENGINE
+ params_model_test_SOURCES = unittest/params_model_test.cc
+ params_model_test_CPPFLAGS = $(unittest_CPPFLAGS)
+diff --git a/src/ccmain/tessedit.cpp b/src/ccmain/tessedit.cpp
+index c7518883..fcbf5d9b 100644
+--- a/src/ccmain/tessedit.cpp
++++ b/src/ccmain/tessedit.cpp
+@@ -170,7 +170,12 @@ bool Tesseract::init_tesseract_lang_data(const std::string &arg0,
+ #endif // ndef DISABLED_LEGACY_ENGINE
+ if (mgr->IsComponentAvailable(TESSDATA_LSTM)) {
+ lstm_recognizer_ = new LSTMRecognizer(language_data_path_prefix.c_str());
+- ASSERT_HOST(lstm_recognizer_->Load(this->params(), lstm_use_matrix ? language : "", mgr));
++ if (!lstm_recognizer_->Load(this->params(), lstm_use_matrix ? language : "", mgr)) {
++ delete lstm_recognizer_;
++ lstm_recognizer_ = nullptr;
++ tprintf("Error: Failed to load the LSTM model from %s\n", tessdata_path.c_str());
++ return false;
++ }
+ } else {
+ tprintf("Error: LSTM requested, but not present!! Loading tesseract.\n");
+ tessedit_ocr_engine_mode.set_value(OEM_TESSERACT_ONLY);
+diff --git a/src/lstm/plumbing.cpp b/src/lstm/plumbing.cpp
+index f0133148..15cf3d62 100644
+--- a/src/lstm/plumbing.cpp
++++ b/src/lstm/plumbing.cpp
+@@ -226,6 +226,12 @@ bool Plumbing::DeSerialize(TFile *fp) {
+ if (size > 10000) {
+ return false;
+ }
++ // Reject empty stacks: XScaleFactor, CacheXScaleFactor and other methods
++ // unconditionally dereference stack_[0] during network initialization.
++ // A Series needs at least two networks (see Series::Forward).
++ if (size == 0 || (type() == NT_SERIES && size == 1)) {
++ return false;
++ }
+ for (uint32_t i = 0; i < size; ++i) {
+ Network *network = CreateFromFile(fp);
+ if (network == nullptr) {
+diff --git a/unittest/plumbing_test.cc b/unittest/plumbing_test.cc
+new file mode 100644
+index 00000000..27486f86
+--- /dev/null
++++ b/unittest/plumbing_test.cc
+@@ -0,0 +1,165 @@
++///////////////////////////////////////////////////////////////////////
++// File: plumbing_test.cc
++// Description: Tests that a corrupt TESSDATA_LSTM component in a
++// .traineddata file is rejected without crashing. A
++// plumbing layer (Series/Parallel/Reversed) with an
++// empty or undersized network stack would make
++// XScaleFactor/CacheXScaleFactor dereference stack_[0]
++// during engine initialization.
++//
++// Licensed under the Apache License, Version 2.0 (the "License");
++// you may not use this file except in compliance with the License.
++// You may obtain a copy of the License at
++// http://www.apache.org/licenses/LICENSE-2.0
++//
++///////////////////////////////////////////////////////////////////////
++
++#include "include_gunit.h"
++
++#include <tesseract/baseapi.h>
++
++#include "network.h" // for NetworkType
++#include "tessdatamanager.h" // for TessdataManager, TESSDATA_LSTM
++
++#include <cstdint>
++#include <cstdio>
++#include <cstdlib>
++#include <cstring>
++#include <string>
++#include <vector>
++
++namespace tesseract {
++namespace {
++
++// Minimal unicharset with the special codes (space, Joined, Broken) that
++// UNICHARSET::load_from_file expects, as embedded in the TESSDATA_LSTM
++// component by LSTMRecognizer::Serialize.
++const char kMinUnicharset[] =
++ "3\n"
++ "NULL 0 NULL 0\n"
++ "Joined 7 0,69,188,255,486,1218,0,30,486,1188 Latin 26 0 98 Joined\n"
++ "|Broken|0|1 f 0,69,186,255,892,2138,0,80,892,2058 Common 84 10 84 |Broken|0|1\n";
++
++// Appends raw little-endian values to a byte buffer.
++class ByteWriter {
++public:
++ void PutU8(uint32_t v) { data_.push_back(static_cast<char>(v & 0xFF)); }
++ void PutU32(uint32_t v) {
++ for (int i = 0; i < 4; ++i) {
++ data_.push_back(static_cast<char>((v >> (8 * i)) & 0xFF));
++ }
++ }
++ void PutS32(int32_t v) { PutU32(static_cast<uint32_t>(v)); }
++ void PutString(const char *s) {
++ PutU32(static_cast<uint32_t>(std::strlen(s)));
++ data_.insert(data_.end(), s, s + std::strlen(s));
++ }
++ void PutRaw(const char *s) { data_.insert(data_.end(), s, s + std::strlen(s)); }
++ const std::vector<char> &data() const { return data_; }
++
++private:
++ std::vector<char> data_;
++};
++
++// Serialized network header as written by Network::Serialize:
++// int8 type, int8 training, int8 needs_to_backprop, int32 network_flags,
++// int32 ni, int32 no, int32 num_weights, string name.
++void AppendNetworkHeader(ByteWriter *w, NetworkType type) {
++ w->PutU8(static_cast<uint32_t>(type));
++ w->PutU8(0); // training: TS_DISABLED
++ w->PutU8(0); // needs_to_backprop
++ w->PutU32(0); // network_flags
++ w->PutU32(0); // ni
++ w->PutU32(0); // no
++ w->PutU32(0); // num_weights
++ w->PutString(""); // name
++}
++
++// A minimal valid child network (NT_INPUT with a 1x1x1x1 shape).
++void AppendInputChild(ByteWriter *w) {
++ AppendNetworkHeader(w, NT_INPUT);
++ w->PutS32(1); // batch
++ w->PutS32(1); // height
++ w->PutS32(1); // width
++ w->PutS32(1); // depth
++ w->PutS32(0); // loss type
++}
++
++// Builds a TESSDATA_LSTM component whose top-level network is a plumbing
++// layer of the given type with the given (corrupt) stack size, followed by
++// the remaining fields of LSTMRecognizer::DeSerialize.
++std::vector<char> MakeLstmComponent(NetworkType type, uint32_t stack_size) {
++ ByteWriter w;
++ AppendNetworkHeader(&w, type);
++ w.PutU32(stack_size); // Plumbing::DeSerialize reads this as uint32
++ for (uint32_t i = 0; i < stack_size; ++i) {
++ AppendInputChild(&w);
++ }
++ w.PutRaw(kMinUnicharset); // unicharset (raw text, no recoder/unicharset components)
++ w.PutString(""); // network_str_
++ w.PutS32(0); // training_flags_
++ w.PutS32(0); // training_iteration_
++ w.PutS32(0); // sample_iteration_
++ w.PutS32(0); // null_char_
++ w.PutU32(0); // adam_beta_ (float 0.0)
++ w.PutU32(0); // learning_rate_ (float 0.0)
++ w.PutU32(0); // momentum_ (float 0.0)
++ return w.data();
++}
++
++// Writes a traineddata file with the given (corrupt) LSTM component to
++// dir/eng.traineddata.
++bool WriteCorruptTraineddata(const std::string &dir, const std::vector<char> &lstm) {
++ TessdataManager mgr;
++ mgr.OverwriteEntry(TESSDATA_LSTM, lstm.data(), static_cast<int>(lstm.size()));
++ return mgr.SaveFile((dir + "/eng.traineddata").c_str(), nullptr);
++}
++
++class PlumbingTest : public testing::Test {
++protected:
++ void SetUp() override {
++ tmpl_ = "/tmp/tess_plumbing_test_XXXXXX";
++ char *dir = mkdtemp(tmpl_.data());
++ ASSERT_NE(dir, nullptr);
++ dir_ = dir;
++ }
++ void TearDown() override {
++ std::remove((dir_ + "/eng.traineddata").c_str());
++ rmdir(dir_.c_str());
++ }
++ // Expects the LSTM engine to reject the corrupted traineddata
++ // gracefully (init failure) instead of crashing.
++ void ExpectInitFails(const std::vector<char> &lstm) {
++ ASSERT_TRUE(WriteCorruptTraineddata(dir_, lstm));
++ tesseract::TessBaseAPI api;
++ EXPECT_EQ(api.Init(dir_.c_str(), "eng", tesseract::OEM_LSTM_ONLY), -1);
++ }
++ std::string dir_;
++ std::string tmpl_;
++};
++
++// Empty NT_SERIES stack: Series::CacheXScaleFactor would dereference
++// stack_[0] on the empty vector during initialization.
++TEST_F(PlumbingTest, RejectsEmptySeriesStack) {
++ ExpectInitFails(MakeLstmComponent(NT_SERIES, 0));
++}
++
++// Empty NT_PARALLEL stack: Plumbing::XScaleFactor would dereference
++// stack_[0] on the empty vector during initialization.
++TEST_F(PlumbingTest, RejectsEmptyParallelStack) {
++ ExpectInitFails(MakeLstmComponent(NT_PARALLEL, 0));
++}
++
++// Empty NT_XREVERSED stack: same crash as the parallel case.
++TEST_F(PlumbingTest, RejectsEmptyReversedStack) {
++ ExpectInitFails(MakeLstmComponent(NT_XREVERSED, 0));
++}
++
++// A Series with a single network: Series::Forward requires at least two
++// networks, so such a model can never work.
++TEST_F(PlumbingTest, RejectsSingleNetworkSeries) {
++ ExpectInitFails(MakeLstmComponent(NT_SERIES, 1));
++}
++
++} // namespace
++} // namespace tesseract
diff --git a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
index 60b50f16a5..b537fe56bd 100644
--- a/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
+++ b/meta-oe/recipes-graphics/tesseract/tesseract_5.5.2.bb
@@ -16,6 +16,7 @@ SRC_URI = "git://github.com/${BPN}-ocr/${BPN}.git;branch=main;protocol=https;tag
file://CVE-2026-88050.patch \
file://CVE-2026-88047.patch \
file://CVE-2026-88051.patch \
+ file://CVE-2026-88054.patch \
"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 23/24] valkey: upgrade 9.0.5 -> 9.0.6
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (20 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 22/24] tesseract: patch CVE-2026-88054 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 24/24] valkey: mark CVE-2026-86227 fixed ankur.tyagi85
2026-10-06 4:19 ` [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 Anuj Mittal
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Changelog:
https://github.com/valkey-io/valkey/releases/tag/9.0.6
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
.../valkey/{valkey_9.0.5.bb => valkey_9.0.6.bb} | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
rename meta-oe/recipes-extended/valkey/{valkey_9.0.5.bb => valkey_9.0.6.bb} (98%)
diff --git a/meta-oe/recipes-extended/valkey/valkey_9.0.5.bb b/meta-oe/recipes-extended/valkey/valkey_9.0.6.bb
similarity index 98%
rename from meta-oe/recipes-extended/valkey/valkey_9.0.5.bb
rename to meta-oe/recipes-extended/valkey/valkey_9.0.6.bb
index d7ce19ce72..7b20612130 100644
--- a/meta-oe/recipes-extended/valkey/valkey_9.0.5.bb
+++ b/meta-oe/recipes-extended/valkey/valkey_9.0.6.bb
@@ -15,7 +15,7 @@ SRC_URI = "git://github.com/valkey-io/valkey.git;branch=9.0;protocol=https;tag=$
file://0001-src-Do-not-reset-FINAL_LIBS.patch \
file://GNU_SOURCE-7.patch \
"
-SRCREV = "a253513ac7ff5790ca119053f3c7fbca4fdaad44"
+SRCREV = "a100149d56208209c03f8af9840afe2efa7fb8d1"
RPROVIDES:${PN} = "virtual-redis"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [oe][meta-oe][wrynose][PATCH 24/24] valkey: mark CVE-2026-86227 fixed
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (21 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 23/24] valkey: upgrade 9.0.5 -> 9.0.6 ankur.tyagi85
@ 2026-09-24 4:33 ` ankur.tyagi85
2026-10-06 4:19 ` [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 Anuj Mittal
23 siblings, 0 replies; 28+ messages in thread
From: ankur.tyagi85 @ 2026-09-24 4:33 UTC (permalink / raw)
To: openembedded-devel; +Cc: Ankur Tyagi
From: Ankur Tyagi <ankur.tyagi85@gmail.com>
Fix[1] for the CVE is part of current upstream version.
Details:
https://nvd.nist.gov/vuln/detail/cve-2026-86227
[1]https://github.com/valkey-io/valkey/commit/b7c39406bbfac01068c1469df28b22ccf1ecc102
Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
---
meta-oe/recipes-extended/valkey/valkey_9.0.6.bb | 1 +
1 file changed, 1 insertion(+)
diff --git a/meta-oe/recipes-extended/valkey/valkey_9.0.6.bb b/meta-oe/recipes-extended/valkey/valkey_9.0.6.bb
index 7b20612130..d31a5dbfe5 100644
--- a/meta-oe/recipes-extended/valkey/valkey_9.0.6.bb
+++ b/meta-oe/recipes-extended/valkey/valkey_9.0.6.bb
@@ -76,3 +76,4 @@ SYSTEMD_SERVICE:${PN} = "valkey.service"
CVE_STATUS[CVE-2022-3734] = "not-applicable-platform: CVE only applies for Windows."
CVE_STATUS[CVE-2026-56684] = "fixed-version: fixed in v9.0.5"
CVE_STATUS[CVE-2026-63639] = "fixed-version: fixed in v9.0.5"
+CVE_STATUS[CVE-2026-86227] = "fixed-version: fixed in v9.0.6"
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130 ankur.tyagi85
@ 2026-10-05 9:49 ` Anuj Mittal
2026-10-06 20:25 ` Ankur Tyagi
0 siblings, 1 reply; 28+ messages in thread
From: Anuj Mittal @ 2026-10-05 9:49 UTC (permalink / raw)
To: ankur.tyagi85; +Cc: openembedded-devel
On Thu, Sep 24, 2026 at 12:34 PM Ankur Tyagi via
lists.openembedded.org
<ankur.tyagi85=gmail.com@lists.openembedded.org> wrote:
>
> From: Ankur Tyagi <ankur.tyagi85@gmail.com>
>
> Use patch[1] provided by strongSwan[2]
>
> Details:
> https://nvd.nist.gov/vuln/detail/cve-2026-78130
>
> [1]https://download.strongswan.org/security/CVE-2026-78130/strongswan-5.1.3-6.0.7_x509_ac_issuer_null.patch
> [2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78130).html
>
> Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
> ---
> .../strongswan/CVE-2026-78130.patch | 49 +++++++++++++++++++
> .../strongswan/strongswan_6.0.6.bb | 1 +
> 2 files changed, 50 insertions(+)
> create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
>
> diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
> new file mode 100644
> index 0000000000..36025c8093
> --- /dev/null
> +++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
> @@ -0,0 +1,49 @@
> +From 254d971bbe7479fe5fffc34cd1dd1e349a48e7aa Mon Sep 17 00:00:00 2001
> +From: Tobias Brunner <tobias@strongswan.org>
> +Date: Fri, 19 Jun 2026 11:57:48 +0200
> +Subject: [PATCH] x509: Avoid NULL-pointer dereference if issuerName is missing
> + in attribute certificate
> +
> +If neither authoritiyKeyIdentifier nor issuerName are encoded in an
> +attribute certificate, the validation in `acert_validator.c:verify()`
> +will cause a NULL-pointer dereference via `issued_by()` (the lookup
> +with NULL identity will enumerate all trusted certificates).
> +
> +Fixes: 26930a8c3e42 ("certificate factory can load certs from file")
> +Fixes: CVE-2026-78130
> +
> +CVE: CVE-2026-78130
> +Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/bee6ce27761e1f38958be36ebe6688ef963c3d22]
Some of the patches in this series had typo in URL. strongiswan ->
strongswan. I've fixed these locally, so no need to re-send.
Thanks,
Anuj
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
` (22 preceding siblings ...)
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 24/24] valkey: mark CVE-2026-86227 fixed ankur.tyagi85
@ 2026-10-06 4:19 ` Anuj Mittal
2026-10-06 20:27 ` Ankur Tyagi
23 siblings, 1 reply; 28+ messages in thread
From: Anuj Mittal @ 2026-10-06 4:19 UTC (permalink / raw)
To: ankur.tyagi85; +Cc: openembedded-devel
On Thu, Sep 24, 2026 at 12:33 PM Ankur Tyagi via
lists.openembedded.org
<ankur.tyagi85=gmail.com@lists.openembedded.org> wrote:
>
> From: Ankur Tyagi <ankur.tyagi85@gmail.com>
>
> Details:
> https://nvd.nist.gov/vuln/detail/cve-2026-44235
>
> Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
> ---
> .../rabbitmq-c/CVE-2026-44235.patch | 95 +++++++++++++++++++
> .../rabbitmq-c/rabbitmq-c_0.15.0.bb | 1 +
> 2 files changed, 96 insertions(+)
> create mode 100644 meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
>
> diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
> new file mode 100644
> index 0000000000..fcb0e1e1d1
> --- /dev/null
> +++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
> @@ -0,0 +1,95 @@
> +From 52f00ef57e55c783c2c436590296d9ff986b65d0 Mon Sep 17 00:00:00 2001
> +From: Claude <noreply@anthropic.com>
> +Date: Tue, 28 Apr 2026 00:30:47 +0000
> +Subject: [PATCH] amqp_connection: reject undersized frames in
> + amqp_handle_input
> +
> +A malicious AMQP server (or active network attacker on an unencrypted
> +connection) can send an AMQP frame whose stated frame body is shorter
> +than the per-frame-type header it claims to carry. amqp_handle_input()
> +then computed encoded.len as
> +
> + state->target_size - HEADER_SIZE - <fixed_header_bytes> - FOOTER_SIZE
> +
> +with no lower-bound check on target_size. Because encoded.len is a
> +size_t, the subtraction wrapped to a value near SIZE_MAX. The bogus
> +length was passed to amqp_decode_method() / amqp_decode_properties()
> +and through to the table decoder, whose internal bounds checks could
> +no longer constrain the parser. The result was an out-of-bounds read
> +and process crash on the client side, reachable during amqp_login.
> +
> +Validate target_size against the minimum required for each frame type
> +(METHOD: HEADER_SIZE+4+FOOTER_SIZE, HEADER: HEADER_SIZE+12+FOOTER_SIZE,
> +BODY: HEADER_SIZE+FOOTER_SIZE) and return AMQP_STATUS_BAD_AMQP_DATA
> +when the frame is too small, before computing encoded.len.
> +
> +Add the verified PoC bytes as a regression seed for the existing
> +fuzz_server harness.
> +
> +Refs: GHSA-9mmv-r8g3-qp46
> +(cherry picked from commit 1d3afbb056fee5cc9ea05680bf32288715d0d802)
> +
> +CVE: CVE-2026-44235
> +Upstream-Status: Backport [https://github.com/alanxz/rabbitmq-c/commit/1d3afbb056fee5cc9ea05680bf32288715d0d802]
> +Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
> +---
> + .../input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw | Bin 0 -> 113 bytes
This causes:
ERROR: rabbitmq-c-0.15.0-r0 do_patch: Applying patch
'/srv/pokybuild/yocto-worker/meta-oe/build/meta-openembedded/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch'
on target directory
'/srv/pokybuild/yocto-worker/meta-oe/build/build/tmp/work/x86-64-v3-poky-linux/rabbitmq-c/0.15.0/sources/rabbitmq-c-0.15.0'
CmdError('quilt --quiltrc
/srv/pokybuild/yocto-worker/meta-oe/build/build/tmp/work/x86-64-v3-poky-linux/rabbitmq-c/0.15.0/recipe-sysroot-native/etc/quiltrc
push', 0, 'stdout: Applying patch CVE-2026-44235.patch
File fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw: git binary diffs
are not supported.
patching file librabbitmq/amqp_connection.c
Patch CVE-2026-44235.patch does not apply (enforce with -f)
May be we should drop this hunk instead of working around.
> + librabbitmq/amqp_connection.c | 19 ++++++++++++++++++
> + 2 files changed, 19 insertions(+)
> + create mode 100644 fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw
> +
> +diff --git a/fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw b/fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw
> +new file mode 100644
> +index 0000000000000000000000000000000000000000..558e9f5bff6b24ad3104b8a3038ab5b271257dcc
> +GIT binary patch
> +literal 113
> +zcmZQ%0D&+DE+FItvaHO#6&U^l0azR#5qxj8*#?Ay5=J1KHNeNw(+|W*&5I8WKF0)>
> +L=Vq{ht2+k({(TL>
> +
> +literal 0
> +HcmV?d00001
> +
> +diff --git a/librabbitmq/amqp_connection.c b/librabbitmq/amqp_connection.c
> +index 56ab8a8..4326ef7 100644
> +--- a/librabbitmq/amqp_connection.c
> ++++ b/librabbitmq/amqp_connection.c
> +@@ -320,6 +320,13 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
> +
> + switch (decoded_frame->frame_type) {
> + case AMQP_FRAME_METHOD:
> ++ /* A METHOD frame body must contain at least the 4-byte method id.
> ++ * Reject undersized frames before subtracting from target_size to
> ++ * avoid an unsigned underflow that would yield a huge encoded.len
> ++ * and cause out-of-bounds reads in amqp_decode_method(). */
> ++ if (state->target_size < HEADER_SIZE + 4 + FOOTER_SIZE) {
> ++ return AMQP_STATUS_BAD_AMQP_DATA;
> ++ }
> + decoded_frame->payload.method.id =
> + amqp_d32(amqp_offset(raw_frame, HEADER_SIZE));
> + encoded.bytes = amqp_offset(raw_frame, HEADER_SIZE + 4);
> +@@ -335,6 +342,15 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
> + break;
> +
> + case AMQP_FRAME_HEADER:
> ++ /* A HEADER frame body must contain at least 12 bytes (class_id,
> ++ * weight, body_size). Reject undersized frames before subtracting
> ++ * from target_size to avoid an unsigned underflow that would yield
> ++ * a huge encoded.len and cause out-of-bounds reads in
> ++ * amqp_decode_properties() / the table decoder
> ++ * (CVE: GHSA-9mmv-r8g3-qp46). */
> ++ if (state->target_size < HEADER_SIZE + 12 + FOOTER_SIZE) {
> ++ return AMQP_STATUS_BAD_AMQP_DATA;
> ++ }
> + decoded_frame->payload.properties.class_id =
> + amqp_d16(amqp_offset(raw_frame, HEADER_SIZE));
> + /* unused 2-byte weight field goes here */
> +@@ -354,6 +370,9 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
> + break;
> +
> + case AMQP_FRAME_BODY:
> ++ if (state->target_size < HEADER_SIZE + FOOTER_SIZE) {
> ++ return AMQP_STATUS_BAD_AMQP_DATA;
> ++ }
> + decoded_frame->payload.body_fragment.len =
> + state->target_size - HEADER_SIZE - FOOTER_SIZE;
> + decoded_frame->payload.body_fragment.bytes =
> diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
> index 4fd6302f2c..642e1e443b 100644
> --- a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
> +++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
> @@ -4,6 +4,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7e12f6e40e662e039e2f02b4893011ec"
> LICENSE = "MIT"
>
> SRC_URI = "git://github.com/alanxz/rabbitmq-c.git;branch=master;protocol=https \
> + file://CVE-2026-44235.patch \
> "
> SRCREV = "84b81cd97a1b5515d3d4b304796680da24c666d8"
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#130249): https://lists.openembedded.org/g/openembedded-devel/message/130249
> Mute This Topic: https://lists.openembedded.org/mt/121405170/3616702
> Group Owner: openembedded-devel+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub [anuj.mittal@oss.qualcomm.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130
2026-10-05 9:49 ` Anuj Mittal
@ 2026-10-06 20:25 ` Ankur Tyagi
0 siblings, 0 replies; 28+ messages in thread
From: Ankur Tyagi @ 2026-10-06 20:25 UTC (permalink / raw)
To: Anuj Mittal; +Cc: openembedded-devel
On Mon, Oct 5, 2026 at 10:49 PM Anuj Mittal
<anuj.mittal@oss.qualcomm.com> wrote:
>
> On Thu, Sep 24, 2026 at 12:34 PM Ankur Tyagi via
> lists.openembedded.org
> <ankur.tyagi85=gmail.com@lists.openembedded.org> wrote:
> >
> > From: Ankur Tyagi <ankur.tyagi85@gmail.com>
> >
> > Use patch[1] provided by strongSwan[2]
> >
> > Details:
> > https://nvd.nist.gov/vuln/detail/cve-2026-78130
> >
> > [1]https://download.strongswan.org/security/CVE-2026-78130/strongswan-5.1.3-6.0.7_x509_ac_issuer_null.patch
> > [2]https://www.strongswan.org/blog/2026/09/07/strongswan-vulnerability-(cve-2026-78130).html
> >
> > Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
> > ---
> > .../strongswan/CVE-2026-78130.patch | 49 +++++++++++++++++++
> > .../strongswan/strongswan_6.0.6.bb | 1 +
> > 2 files changed, 50 insertions(+)
> > create mode 100644 meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
> >
> > diff --git a/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
> > new file mode 100644
> > index 0000000000..36025c8093
> > --- /dev/null
> > +++ b/meta-networking/recipes-support/strongswan/strongswan/CVE-2026-78130.patch
> > @@ -0,0 +1,49 @@
> > +From 254d971bbe7479fe5fffc34cd1dd1e349a48e7aa Mon Sep 17 00:00:00 2001
> > +From: Tobias Brunner <tobias@strongswan.org>
> > +Date: Fri, 19 Jun 2026 11:57:48 +0200
> > +Subject: [PATCH] x509: Avoid NULL-pointer dereference if issuerName is missing
> > + in attribute certificate
> > +
> > +If neither authoritiyKeyIdentifier nor issuerName are encoded in an
> > +attribute certificate, the validation in `acert_validator.c:verify()`
> > +will cause a NULL-pointer dereference via `issued_by()` (the lookup
> > +with NULL identity will enumerate all trusted certificates).
> > +
> > +Fixes: 26930a8c3e42 ("certificate factory can load certs from file")
> > +Fixes: CVE-2026-78130
> > +
> > +CVE: CVE-2026-78130
> > +Upstream-Status: Backport [https://github.com/strongiswan/strongswan/commit/bee6ce27761e1f38958be36ebe6688ef963c3d22]
>
> Some of the patches in this series had typo in URL. strongiswan ->
> strongswan. I've fixed these locally, so no need to re-send.
>
Thanks Anuj !
> Thanks,
>
> Anuj
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235
2026-10-06 4:19 ` [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 Anuj Mittal
@ 2026-10-06 20:27 ` Ankur Tyagi
0 siblings, 0 replies; 28+ messages in thread
From: Ankur Tyagi @ 2026-10-06 20:27 UTC (permalink / raw)
To: Anuj Mittal; +Cc: openembedded-devel
On Tue, Oct 6, 2026 at 5:19 PM Anuj Mittal <anuj.mittal@oss.qualcomm.com> wrote:
>
> On Thu, Sep 24, 2026 at 12:33 PM Ankur Tyagi via
> lists.openembedded.org
> <ankur.tyagi85=gmail.com@lists.openembedded.org> wrote:
> >
> > From: Ankur Tyagi <ankur.tyagi85@gmail.com>
> >
> > Details:
> > https://nvd.nist.gov/vuln/detail/cve-2026-44235
> >
> > Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
> > ---
> > .../rabbitmq-c/CVE-2026-44235.patch | 95 +++++++++++++++++++
> > .../rabbitmq-c/rabbitmq-c_0.15.0.bb | 1 +
> > 2 files changed, 96 insertions(+)
> > create mode 100644 meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
> >
> > diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
> > new file mode 100644
> > index 0000000000..fcb0e1e1d1
> > --- /dev/null
> > +++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch
> > @@ -0,0 +1,95 @@
> > +From 52f00ef57e55c783c2c436590296d9ff986b65d0 Mon Sep 17 00:00:00 2001
> > +From: Claude <noreply@anthropic.com>
> > +Date: Tue, 28 Apr 2026 00:30:47 +0000
> > +Subject: [PATCH] amqp_connection: reject undersized frames in
> > + amqp_handle_input
> > +
> > +A malicious AMQP server (or active network attacker on an unencrypted
> > +connection) can send an AMQP frame whose stated frame body is shorter
> > +than the per-frame-type header it claims to carry. amqp_handle_input()
> > +then computed encoded.len as
> > +
> > + state->target_size - HEADER_SIZE - <fixed_header_bytes> - FOOTER_SIZE
> > +
> > +with no lower-bound check on target_size. Because encoded.len is a
> > +size_t, the subtraction wrapped to a value near SIZE_MAX. The bogus
> > +length was passed to amqp_decode_method() / amqp_decode_properties()
> > +and through to the table decoder, whose internal bounds checks could
> > +no longer constrain the parser. The result was an out-of-bounds read
> > +and process crash on the client side, reachable during amqp_login.
> > +
> > +Validate target_size against the minimum required for each frame type
> > +(METHOD: HEADER_SIZE+4+FOOTER_SIZE, HEADER: HEADER_SIZE+12+FOOTER_SIZE,
> > +BODY: HEADER_SIZE+FOOTER_SIZE) and return AMQP_STATUS_BAD_AMQP_DATA
> > +when the frame is too small, before computing encoded.len.
> > +
> > +Add the verified PoC bytes as a regression seed for the existing
> > +fuzz_server harness.
> > +
> > +Refs: GHSA-9mmv-r8g3-qp46
> > +(cherry picked from commit 1d3afbb056fee5cc9ea05680bf32288715d0d802)
> > +
> > +CVE: CVE-2026-44235
> > +Upstream-Status: Backport [https://github.com/alanxz/rabbitmq-c/commit/1d3afbb056fee5cc9ea05680bf32288715d0d802]
> > +Signed-off-by: Ankur Tyagi <ankur.tyagi85@gmail.com>
> > +---
> > + .../input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw | Bin 0 -> 113 bytes
>
> This causes:
>
> ERROR: rabbitmq-c-0.15.0-r0 do_patch: Applying patch
> '/srv/pokybuild/yocto-worker/meta-oe/build/meta-openembedded/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c/CVE-2026-44235.patch'
> on target directory
> '/srv/pokybuild/yocto-worker/meta-oe/build/build/tmp/work/x86-64-v3-poky-linux/rabbitmq-c/0.15.0/sources/rabbitmq-c-0.15.0'
> CmdError('quilt --quiltrc
> /srv/pokybuild/yocto-worker/meta-oe/build/build/tmp/work/x86-64-v3-poky-linux/rabbitmq-c/0.15.0/recipe-sysroot-native/etc/quiltrc
> push', 0, 'stdout: Applying patch CVE-2026-44235.patch
> File fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw: git binary diffs
> are not supported.
> patching file librabbitmq/amqp_connection.c
> Patch CVE-2026-44235.patch does not apply (enforce with -f)
>
> May be we should drop this hunk instead of working around.
>
agree, will send v2 to fix this.
> > + librabbitmq/amqp_connection.c | 19 ++++++++++++++++++
> > + 2 files changed, 19 insertions(+)
> > + create mode 100644 fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw
> > +
> > +diff --git a/fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw b/fuzz/input/fuzz_server_ghsa-9mmv-r8g3-qp46.raw
> > +new file mode 100644
> > +index 0000000000000000000000000000000000000000..558e9f5bff6b24ad3104b8a3038ab5b271257dcc
> > +GIT binary patch
> > +literal 113
> > +zcmZQ%0D&+DE+FItvaHO#6&U^l0azR#5qxj8*#?Ay5=J1KHNeNw(+|W*&5I8WKF0)>
> > +L=Vq{ht2+k({(TL>
> > +
> > +literal 0
> > +HcmV?d00001
> > +
> > +diff --git a/librabbitmq/amqp_connection.c b/librabbitmq/amqp_connection.c
> > +index 56ab8a8..4326ef7 100644
> > +--- a/librabbitmq/amqp_connection.c
> > ++++ b/librabbitmq/amqp_connection.c
> > +@@ -320,6 +320,13 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
> > +
> > + switch (decoded_frame->frame_type) {
> > + case AMQP_FRAME_METHOD:
> > ++ /* A METHOD frame body must contain at least the 4-byte method id.
> > ++ * Reject undersized frames before subtracting from target_size to
> > ++ * avoid an unsigned underflow that would yield a huge encoded.len
> > ++ * and cause out-of-bounds reads in amqp_decode_method(). */
> > ++ if (state->target_size < HEADER_SIZE + 4 + FOOTER_SIZE) {
> > ++ return AMQP_STATUS_BAD_AMQP_DATA;
> > ++ }
> > + decoded_frame->payload.method.id =
> > + amqp_d32(amqp_offset(raw_frame, HEADER_SIZE));
> > + encoded.bytes = amqp_offset(raw_frame, HEADER_SIZE + 4);
> > +@@ -335,6 +342,15 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
> > + break;
> > +
> > + case AMQP_FRAME_HEADER:
> > ++ /* A HEADER frame body must contain at least 12 bytes (class_id,
> > ++ * weight, body_size). Reject undersized frames before subtracting
> > ++ * from target_size to avoid an unsigned underflow that would yield
> > ++ * a huge encoded.len and cause out-of-bounds reads in
> > ++ * amqp_decode_properties() / the table decoder
> > ++ * (CVE: GHSA-9mmv-r8g3-qp46). */
> > ++ if (state->target_size < HEADER_SIZE + 12 + FOOTER_SIZE) {
> > ++ return AMQP_STATUS_BAD_AMQP_DATA;
> > ++ }
> > + decoded_frame->payload.properties.class_id =
> > + amqp_d16(amqp_offset(raw_frame, HEADER_SIZE));
> > + /* unused 2-byte weight field goes here */
> > +@@ -354,6 +370,9 @@ int amqp_handle_input(amqp_connection_state_t state, amqp_bytes_t received_data,
> > + break;
> > +
> > + case AMQP_FRAME_BODY:
> > ++ if (state->target_size < HEADER_SIZE + FOOTER_SIZE) {
> > ++ return AMQP_STATUS_BAD_AMQP_DATA;
> > ++ }
> > + decoded_frame->payload.body_fragment.len =
> > + state->target_size - HEADER_SIZE - FOOTER_SIZE;
> > + decoded_frame->payload.body_fragment.bytes =
> > diff --git a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
> > index 4fd6302f2c..642e1e443b 100644
> > --- a/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
> > +++ b/meta-oe/recipes-connectivity/rabbitmq-c/rabbitmq-c_0.15.0.bb
> > @@ -4,6 +4,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=7e12f6e40e662e039e2f02b4893011ec"
> > LICENSE = "MIT"
> >
> > SRC_URI = "git://github.com/alanxz/rabbitmq-c.git;branch=master;protocol=https \
> > + file://CVE-2026-44235.patch \
> > "
> > SRCREV = "84b81cd97a1b5515d3d4b304796680da24c666d8"
> >
> >
> > -=-=-=-=-=-=-=-=-=-=-=-
> > Links: You receive all messages sent to this group.
> > View/Reply Online (#130249): https://lists.openembedded.org/g/openembedded-devel/message/130249
> > Mute This Topic: https://lists.openembedded.org/mt/121405170/3616702
> > Group Owner: openembedded-devel+owner@lists.openembedded.org
> > Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub [anuj.mittal@oss.qualcomm.com]
> > -=-=-=-=-=-=-=-=-=-=-=-
> >
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2026-10-06 20:28 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-24 4:32 [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 2/24] rabbitmq-c: patch CVE-2026-44236 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-oe][wrynose][PATCH 3/24] redis: patch CVE-2026-81934 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 4/24] sngrep: patch CVE-2026-90558 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 5/24] strongswan: patch CVE-2026-78123 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 6/24] strongswan: patch CVE-2026-78124 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 7/24] strongswan: patch CVE-2026-78126 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 8/24] strongswan: patch CVE-2026-78127 ankur.tyagi85
2026-09-24 4:32 ` [oe][meta-networking][wrynose][PATCH 9/24] strongswan: patch CVE-2026-78129 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 10/24] strongswan: patch CVE-2026-78133 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 11/24] strongswan: patch CVE-2026-78131 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 12/24] strongswan: patch CVE-2026-78130 ankur.tyagi85
2026-10-05 9:49 ` Anuj Mittal
2026-10-06 20:25 ` Ankur Tyagi
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 13/24] strongswan: patch CVE-2026-78132 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 14/24] strongswan: patch CVE-2026-78135 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-networking][wrynose][PATCH 15/24] strongswan: patch CVE-2026-78134 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 16/24] tesseract: patch CVE-2026-88052 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 17/24] tesseract: patch CVE-2026-88048 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 18/24] tesseract: patch CVE-2026-88049 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 19/24] tesseract: patch CVE-2026-88050 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 20/24] tesseract: patch CVE-2026-88047 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 21/24] tesseract: patch CVE-2026-88051 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 22/24] tesseract: patch CVE-2026-88054 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 23/24] valkey: upgrade 9.0.5 -> 9.0.6 ankur.tyagi85
2026-09-24 4:33 ` [oe][meta-oe][wrynose][PATCH 24/24] valkey: mark CVE-2026-86227 fixed ankur.tyagi85
2026-10-06 4:19 ` [oe][meta-oe][wrynose][PATCH 1/24] rabbitmq-c: patch CVE-2026-44235 Anuj Mittal
2026-10-06 20:27 ` Ankur Tyagi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.