From 22a94c09060c5b95dfc95eab2d1e4556a72f62a2 Mon Sep 17 00:00:00 2001 From: "Sergio R. Caprile" Date: Mon, 19 Oct 2026 10:05:03 -0300 Subject: [PATCH] fix checks --- mongoose.c | 10 +++++++--- src/tls_builtin.c | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/mongoose.c b/mongoose.c index 3b0f1d13..7fd5b544 100644 --- a/mongoose.c +++ b/mongoose.c @@ -17801,7 +17801,7 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) { if (!is_retry || rio->buf[0] != MG_TLS_CHANGE_CIPHER) break; mg_tls_drop_record(c); // compatibility mode CCS before 2nd ClientHello } - if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_CLIENT_HELLO) { + if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->len < 6 || rio->buf[5] != MG_TLS_CLIENT_HELLO) { mg_error(c, "not a client hello packet"); return -1; } @@ -17831,17 +17831,21 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) { uint16_t k; uint16_t key_exchange_len; uint8_t *key_exchange; - uint16_t n = MG_LOAD_BE16(ext + j + 2); + uint16_t n; + if ((ext_len - j) < 4) goto fail; + n = MG_LOAD_BE16(ext + j + 2); if (((uint32_t) n + j + 4) > ext_len) goto fail; if (MG_LOAD_BE16(ext + j) != 0x0033) { // not a key share extension, ignore j += (uint16_t) (n + 4); continue; } + if (n < 2) goto fail; key_exchange_len = MG_LOAD_BE16(ext + j + 4); key_exchange = ext + j + 6; - if ((key_exchange + key_exchange_len) > ((uint8_t *) rio->buf + rio->len)) + if (key_exchange_len > n - 2) goto fail; for (k = 0; k < key_exchange_len;) { + if ((key_exchange_len - k) < 4) goto fail; uint16_t m = MG_LOAD_BE16(key_exchange + k + 2); uint16_t group = MG_LOAD_BE16(key_exchange + k); if (((uint32_t) m + k + 4) > key_exchange_len) goto fail; diff --git a/src/tls_builtin.c b/src/tls_builtin.c index e66fec16..f71c46f1 100644 --- a/src/tls_builtin.c +++ b/src/tls_builtin.c @@ -681,7 +681,7 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) { if (!is_retry || rio->buf[0] != MG_TLS_CHANGE_CIPHER) break; mg_tls_drop_record(c); // compatibility mode CCS before 2nd ClientHello } - if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_CLIENT_HELLO) { + if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->len < 6 || rio->buf[5] != MG_TLS_CLIENT_HELLO) { mg_error(c, "not a client hello packet"); return -1; } @@ -711,17 +711,21 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) { uint16_t k; uint16_t key_exchange_len; uint8_t *key_exchange; - uint16_t n = MG_LOAD_BE16(ext + j + 2); + uint16_t n; + if ((ext_len - j) < 4) goto fail; + n = MG_LOAD_BE16(ext + j + 2); if (((uint32_t) n + j + 4) > ext_len) goto fail; if (MG_LOAD_BE16(ext + j) != 0x0033) { // not a key share extension, ignore j += (uint16_t) (n + 4); continue; } + if (n < 2) goto fail; key_exchange_len = MG_LOAD_BE16(ext + j + 4); key_exchange = ext + j + 6; - if ((key_exchange + key_exchange_len) > ((uint8_t *) rio->buf + rio->len)) + if (key_exchange_len > n - 2) goto fail; for (k = 0; k < key_exchange_len;) { + if ((key_exchange_len - k) < 4) goto fail; uint16_t m = MG_LOAD_BE16(key_exchange + k + 2); uint16_t group = MG_LOAD_BE16(key_exchange + k); if (((uint32_t) m + k + 4) > key_exchange_len) goto fail;