Skip to content

Commit d445366

Browse files
committed
stronger bound checking
1 parent 9922286 commit d445366

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

mongoose.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10999,7 +10999,9 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) {
1099910999
mg_error(c, "not a client hello packet");
1100011000
return -1;
1100111001
}
11002+
if (rio->len < 50) goto fail;
1100211003
msgsz = MG_LOAD_BE16(rio->buf + 3);
11004+
if (((uint32_t) msgsz + 4) > rio->len) goto fail;
1100311005
mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);
1100411006
// store client random
1100511007
memmove(tls->random, rio->buf + 11, sizeof(tls->random));
@@ -11011,10 +11013,11 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) {
1101111013
MG_INFO(("bad session id len"));
1101211014
}
1101311015
cipher_suites_len = MG_LOAD_BE16(rio->buf + 44 + session_id_len);
11014-
if (cipher_suites_len > (rio->len - 46 - session_id_len)) goto fail;
11016+
if (((uint32_t) cipher_suites_len + 46 + session_id_len) > rio->len)
11017+
goto fail;
1101511018
ext_len = MG_LOAD_BE16(rio->buf + 48 + session_id_len + cipher_suites_len);
1101611019
ext = rio->buf + 50 + session_id_len + cipher_suites_len;
11017-
if (ext_len > (rio->len - 50 - session_id_len - cipher_suites_len)) goto fail;
11020+
if (((unsigned char *) ext + ext_len) > (rio->buf + rio->len)) goto fail;
1101811021
for (j = 0; j < ext_len;) {
1101911022
uint16_t k;
1102011023
uint16_t key_exchange_len;
@@ -11026,12 +11029,12 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) {
1102611029
}
1102711030
key_exchange_len = MG_LOAD_BE16(ext + j + 4);
1102811031
key_exchange = ext + j + 6;
11029-
if (key_exchange_len >
11030-
rio->len - (uint16_t) ((size_t) key_exchange - (size_t) rio->buf))
11032+
if (((size_t) key_exchange_len +
11033+
((size_t) key_exchange - (size_t) rio->buf)) > rio->len)
1103111034
goto fail;
1103211035
for (k = 0; k < key_exchange_len;) {
1103311036
uint16_t m = MG_LOAD_BE16(key_exchange + k + 2);
11034-
if (m > (key_exchange_len - k - 4)) goto fail;
11037+
if (((uint32_t) m + k + 4) > key_exchange_len) goto fail;
1103511038
if (m == 32 && key_exchange[k] == 0x00 && key_exchange[k + 1] == 0x1d) {
1103611039
memmove(tls->x25519_cli, key_exchange + k + 4, m);
1103711040
mg_tls_drop_record(c);

src/tls_builtin.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,9 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) {
570570
mg_error(c, "not a client hello packet");
571571
return -1;
572572
}
573+
if (rio->len < 50) goto fail;
573574
msgsz = MG_LOAD_BE16(rio->buf + 3);
575+
if (((uint32_t) msgsz + 4) > rio->len) goto fail;
574576
mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);
575577
// store client random
576578
memmove(tls->random, rio->buf + 11, sizeof(tls->random));
@@ -582,10 +584,11 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) {
582584
MG_INFO(("bad session id len"));
583585
}
584586
cipher_suites_len = MG_LOAD_BE16(rio->buf + 44 + session_id_len);
585-
if (cipher_suites_len > (rio->len - 46 - session_id_len)) goto fail;
587+
if (((uint32_t) cipher_suites_len + 46 + session_id_len) > rio->len)
588+
goto fail;
586589
ext_len = MG_LOAD_BE16(rio->buf + 48 + session_id_len + cipher_suites_len);
587590
ext = rio->buf + 50 + session_id_len + cipher_suites_len;
588-
if (ext_len > (rio->len - 50 - session_id_len - cipher_suites_len)) goto fail;
591+
if (((unsigned char *) ext + ext_len) > (rio->buf + rio->len)) goto fail;
589592
for (j = 0; j < ext_len;) {
590593
uint16_t k;
591594
uint16_t key_exchange_len;
@@ -597,12 +600,12 @@ static int mg_tls_server_recv_hello(struct mg_connection *c) {
597600
}
598601
key_exchange_len = MG_LOAD_BE16(ext + j + 4);
599602
key_exchange = ext + j + 6;
600-
if (key_exchange_len >
601-
rio->len - (uint16_t) ((size_t) key_exchange - (size_t) rio->buf))
603+
if (((size_t) key_exchange_len +
604+
((size_t) key_exchange - (size_t) rio->buf)) > rio->len)
602605
goto fail;
603606
for (k = 0; k < key_exchange_len;) {
604607
uint16_t m = MG_LOAD_BE16(key_exchange + k + 2);
605-
if (m > (key_exchange_len - k - 4)) goto fail;
608+
if (((uint32_t) m + k + 4) > key_exchange_len) goto fail;
606609
if (m == 32 && key_exchange[k] == 0x00 && key_exchange[k + 1] == 0x1d) {
607610
memmove(tls->x25519_cli, key_exchange + k + 4, m);
608611
mg_tls_drop_record(c);

0 commit comments

Comments
 (0)