uwb(hal): Fix security vulnarability reported in uwb hal
changes are mainly to resolve OOB, arrayIndex out of box security
issues
Bug: 269746228,268485040,268192935,267311318
Test: Android Security Assessment
Change-Id: Id3f43b048ded859ee7b14b6dba40d9b6a1ea54af
diff --git a/halimpl/hal/phNxpUciHal.cc b/halimpl/hal/phNxpUciHal.cc
index 9479236..5fccbcf 100644
--- a/halimpl/hal/phNxpUciHal.cc
+++ b/halimpl/hal/phNxpUciHal.cc
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2019, 2022 NXP
+ * Copyright 2012-2019, 2022-2023 NXP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -79,6 +79,7 @@
*******************************************************************************/
bool get_input_map(const uint8_t* i_data, uint16_t iData_len) {
vector<uint16_t> input_vec;
+ bool ret = true;
uint16_t i = 0, j = 0, tag = 0, len = 0;
i = UCI_PKT_HDR_LEN + UCI_PKT_PAYLOAD_STATUS_LEN + UCI_PKT_NUM_CAPS_LEN;
if (i_data == NULL) {
@@ -86,20 +87,36 @@
return false;
}
while (i < iData_len) {
+ if (i + 1 >= iData_len) {
+ ret = false;
+ break;
+ }
tag = i_data[i++];
// Tag IDs from 0xE0 to 0xE2 are extended tag IDs with 2 bytes length.
if((tag >= 0xE0) && (tag <= 0xE2)) {
+ if (i + 1 >= iData_len) {
+ ret = false;
+ break;
+ }
tag = (tag << 8) | i_data[i++];
}
+ if (i + 1 >= iData_len) {
+ ret = false;
+ break;
+ }
len = i_data[i++];
input_vec.insert(input_vec.begin(), len);
+ if (i + len > iData_len) {
+ ret = false;
+ break;
+ }
for (j = 1; j <= len; j++) {
input_vec.insert(input_vec.begin() + j, i_data[i++]);
}
input_map[tag] = input_vec;
input_vec.clear();
}
- return true;
+ return ret;
}
/*******************************************************************************
@@ -113,26 +130,43 @@
*******************************************************************************/
bool get_conf_map(uint8_t* c_data, uint16_t cData_len) {
vector<uint16_t> conf_vec;
+ bool ret = true;
uint16_t i = 0, j = 0, tag = 0, len = 0;
if (c_data == NULL) {
NXPLOG_UCIHAL_D("Country code conf map creation failed, c_data is NULL" );
return false;
}
while (i < cData_len) {
+ if (i + 1 >= cData_len) {
+ ret = false;
+ break;
+ }
tag = c_data[i++];
// Tag IDs from 0xE0 to 0xE2 are extended tag IDs with 2 bytes length.
if ((tag >= 0xE0) && (tag <= 0xE2)) {
+ if (i + 1 >= cData_len) {
+ ret = false;
+ break;
+ }
tag = (tag<<8) | c_data[i++];
}
+ if (i + 1 >= cData_len) {
+ ret = false;
+ break;
+ }
len = c_data[i++];
conf_vec.insert(conf_vec.begin(),len);
+ if (i + len > cData_len) {
+ ret = false;
+ break;
+ }
for (j = 1; j <= len; j++) {
conf_vec.insert(conf_vec.begin() + j, c_data[i++]);
}
conf_map[tag] = conf_vec;
conf_vec.clear();
}
- return true;
+ return ret;
}
/******************************************************************************
@@ -642,8 +676,8 @@
goto clean_and_return;
}
- if(data_len > UCI_MAX_DATA_LEN){
- NXPLOG_UCIHAL_E("data_lensize exceeds the UCI_MAX_DATA_LEN");
+ if ((data_len > UCI_MAX_DATA_LEN) || (data_len < UCI_PKT_HDR_LEN)) {
+ NXPLOG_UCIHAL_E("Invalid data_len");
data_len = 0;
goto clean_and_return;
}
diff --git a/halimpl/hal/phNxpUciHal_ext.cc b/halimpl/hal/phNxpUciHal_ext.cc
index 3dfd1a3..4c47a91 100644
--- a/halimpl/hal/phNxpUciHal_ext.cc
+++ b/halimpl/hal/phNxpUciHal_ext.cc
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2020,2022 NXP
+ * Copyright 2012-2019, 2022-2023 NXP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -167,6 +167,10 @@
tHAL_UWB_STATUS phNxpUciHal_send_ext_cmd(uint16_t cmd_len, const uint8_t* p_cmd) {
tHAL_UWB_STATUS status;
+ if (cmd_len >= UCI_MAX_DATA_LEN) {
+ status = UWBSTATUS_FAILED;
+ return status;
+ }
HAL_ENABLE_EXT();
nxpucihal_ctrl.cmd_len = cmd_len;
memcpy(nxpucihal_ctrl.p_cmd_data, p_cmd, cmd_len);