Skip to content

Commit 341681f

Browse files
nandojvejhedberg
authored andcommitted
lib: updatehub: Improve probe security
Improve buffer overflow security on probe_cb. This ensures that socket buffer have fixed lenght and content received by COAP fills properly on metadata buffer. After that, ensures that metadata content is a valid string with length lower than metadata size. Signed-off-by: Gerson Fernando Budke <[email protected]>
1 parent 3f4221d commit 341681f

File tree

1 file changed

+27
-12
lines changed

1 file changed

+27
-12
lines changed

lib/updatehub/updatehub.c

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -587,22 +587,23 @@ static int report(enum updatehub_state state)
587587
return ret;
588588
}
589589

590-
static void probe_cb(char *metadata)
590+
static void probe_cb(char *metadata, size_t metadata_size)
591591
{
592592
struct coap_packet reply;
593-
char tmp[MAX_PAYLOAD_SIZE];
593+
char tmp[MAX_DOWNLOAD_DATA];
594+
size_t tmp_len;
594595
int rcvd = -1;
595596

596597
wait_fds();
597598

598-
rcvd = recv(ctx.sock, metadata, MAX_PAYLOAD_SIZE, MSG_DONTWAIT);
599+
rcvd = recv(ctx.sock, tmp, MAX_DOWNLOAD_DATA, MSG_DONTWAIT);
599600
if (rcvd <= 0) {
600601
LOG_ERR("Could not receive data");
601602
ctx.code_status = UPDATEHUB_NETWORKING_ERROR;
602603
return;
603604
}
604605

605-
if (coap_packet_parse(&reply, metadata, rcvd, NULL, 0) < 0) {
606+
if (coap_packet_parse(&reply, tmp, rcvd, NULL, 0) < 0) {
606607
LOG_ERR("Invalid data received");
607608
ctx.code_status = UPDATEHUB_DOWNLOAD_ERROR;
608609
return;
@@ -614,10 +615,25 @@ static void probe_cb(char *metadata)
614615
return;
615616
}
616617

617-
memset(&tmp, 0, MAX_PAYLOAD_SIZE);
618-
memcpy(tmp, reply.data + reply.offset, reply.max_len - reply.offset);
619-
memset(metadata, 0, MAX_PAYLOAD_SIZE);
620-
memcpy(metadata, tmp, strlen(tmp));
618+
/* check if we have buffer space to receive payload */
619+
if (metadata_size < (reply.max_len - reply.offset)) {
620+
LOG_ERR("There is no buffer available");
621+
ctx.code_status = UPDATEHUB_METADATA_ERROR;
622+
return;
623+
}
624+
625+
memcpy(metadata, reply.data + reply.offset,
626+
reply.max_len - reply.offset);
627+
628+
/* ensures payload have a valid string with size lower
629+
* than metadata_size
630+
*/
631+
tmp_len = strlen(metadata);
632+
if (tmp_len >= metadata_size) {
633+
LOG_ERR("Invalid metadata data received");
634+
ctx.code_status = UPDATEHUB_METADATA_ERROR;
635+
return;
636+
}
621637

622638
ctx.code_status = UPDATEHUB_OK;
623639

@@ -630,8 +646,8 @@ enum updatehub_response updatehub_probe(void)
630646
struct resp_probe_some_boards metadata_some_boards;
631647
struct resp_probe_any_boards metadata_any_boards;
632648

633-
char *metadata = k_malloc(MAX_PAYLOAD_SIZE);
634-
char *metadata_copy = k_malloc(MAX_PAYLOAD_SIZE);
649+
char *metadata = k_malloc(MAX_DOWNLOAD_DATA);
650+
char *metadata_copy = k_malloc(MAX_DOWNLOAD_DATA);
635651
char *device_id = k_malloc(DEVICE_ID_HEX_MAX_SIZE);
636652
char *firmware_version = k_malloc(BOOT_IMG_VER_STRLEN_MAX);
637653

@@ -686,8 +702,7 @@ enum updatehub_response updatehub_probe(void)
686702
goto cleanup;
687703
}
688704

689-
memset(metadata, 0, MAX_PAYLOAD_SIZE);
690-
probe_cb(metadata);
705+
probe_cb(metadata, MAX_DOWNLOAD_DATA);
691706

692707
if (ctx.code_status != UPDATEHUB_OK) {
693708
goto cleanup;

0 commit comments

Comments
 (0)