Skip to content

Commit db2914c

Browse files
committed
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 fbaca5c commit db2914c

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
@@ -566,22 +566,23 @@ static int report(enum updatehub_state state)
566566
return ret;
567567
}
568568

569-
static void probe_cb(char *metadata)
569+
static void probe_cb(char *metadata, size_t metadata_size)
570570
{
571571
struct coap_packet reply;
572-
char tmp[MAX_PAYLOAD_SIZE];
572+
char tmp[MAX_DOWNLOAD_DATA];
573+
size_t tmp_len;
573574
int rcvd = -1;
574575

575576
wait_fds();
576577

577-
rcvd = recv(ctx.sock, metadata, MAX_PAYLOAD_SIZE, MSG_DONTWAIT);
578+
rcvd = recv(ctx.sock, tmp, MAX_DOWNLOAD_DATA, MSG_DONTWAIT);
578579
if (rcvd <= 0) {
579580
LOG_ERR("Could not receive data");
580581
ctx.code_status = UPDATEHUB_NETWORKING_ERROR;
581582
return;
582583
}
583584

584-
if (coap_packet_parse(&reply, metadata, rcvd, NULL, 0) < 0) {
585+
if (coap_packet_parse(&reply, tmp, rcvd, NULL, 0) < 0) {
585586
LOG_ERR("Invalid data received");
586587
ctx.code_status = UPDATEHUB_DOWNLOAD_ERROR;
587588
return;
@@ -593,10 +594,25 @@ static void probe_cb(char *metadata)
593594
return;
594595
}
595596

596-
memset(&tmp, 0, MAX_PAYLOAD_SIZE);
597-
memcpy(tmp, reply.data + reply.offset, reply.max_len - reply.offset);
598-
memset(metadata, 0, MAX_PAYLOAD_SIZE);
599-
memcpy(metadata, tmp, strlen(tmp));
597+
/* check if we have buffer space to receive payload */
598+
if (metadata_size < (reply.max_len - reply.offset)) {
599+
LOG_ERR("There is no buffer available");
600+
ctx.code_status = UPDATEHUB_METADATA_ERROR;
601+
return;
602+
}
603+
604+
memcpy(metadata, reply.data + reply.offset,
605+
reply.max_len - reply.offset);
606+
607+
/* ensures payload have a valid string with size lower
608+
* than metadata_size
609+
*/
610+
tmp_len = strlen(metadata);
611+
if (tmp_len >= metadata_size) {
612+
LOG_ERR("Invalid metadata data received");
613+
ctx.code_status = UPDATEHUB_METADATA_ERROR;
614+
return;
615+
}
600616

601617
ctx.code_status = UPDATEHUB_OK;
602618

@@ -609,8 +625,8 @@ enum updatehub_response updatehub_probe(void)
609625
struct resp_probe_some_boards metadata_some_boards;
610626
struct resp_probe_any_boards metadata_any_boards;
611627

612-
char *metadata = k_malloc(MAX_PAYLOAD_SIZE);
613-
char *metadata_copy = k_malloc(MAX_PAYLOAD_SIZE);
628+
char *metadata = k_malloc(MAX_DOWNLOAD_DATA);
629+
char *metadata_copy = k_malloc(MAX_DOWNLOAD_DATA);
614630
char *device_id = k_malloc(DEVICE_ID_HEX_MAX_SIZE);
615631
char *firmware_version = k_malloc(BOOT_IMG_VER_STRLEN_MAX);
616632

@@ -665,8 +681,7 @@ enum updatehub_response updatehub_probe(void)
665681
goto cleanup;
666682
}
667683

668-
memset(metadata, 0, MAX_PAYLOAD_SIZE);
669-
probe_cb(metadata);
684+
probe_cb(metadata, MAX_DOWNLOAD_DATA);
670685

671686
if (ctx.code_status != UPDATEHUB_OK) {
672687
goto cleanup;

0 commit comments

Comments
 (0)