OTA-клиент UpdateHub в subsys/mgmt/updatehub/updatehub.c содержит чтение за пределами границ/неинициализированной памяти в z_impl_updatehub_probe(). Ответ зонда от сервера UpdateHub копируется в буфер кучи (метаданные), который правильно завершается NUL, но второй буфер (metadata_copy) выделяется с помощью k_malloc (без нуля) и заполняется memcpy(metadata_copy, метаданные, strlen(метаданные)), в котором завершающий NUL отсутствует. Все, что после скопированного контента остается неинициализированной кучей.
Когда первый json_obj_parse() для дескриптора массива завершается неудачей, код возвращается к json_obj_parse(metadata_copy, strlen(metadata_copy), ...). Вызов strlen() просматривает скопированные байты через неинициализированную кучу и, если до конца выделения не найден нулевой байт, считывает за пределы буфера; результирующая слишком большая длина затем анализируется как JSON. Полезная нагрузка зонда полностью контролируется (вредоносным, скомпрометированным или — без дополнительного CONFIG_UPDATEHUB_DTLS — находящимся в пути) сервером UpdateHub, который может создать большую полезную нагрузку, которая не сможет пройти первый синтаксический анализ для управления этим путем.
Последствием является чтение неинициализированной кучи, а в худшем случае — чтение за пределами выделения метаданных_копии, что может привести к сбою и сбою потока обновления/устройства, вызывая отказ в обслуживании, инициируемый сетью. Перечитанные данные используются только для внутренней оценки обновления и не возвращаются злоумышленнику, поэтому не происходит прямого раскрытия информации и записи за пределами границ. Исправление обнуляет метаданные_copy с помощью memset перед копированием, гарантируя завершение NUL и ограничивая strlen() внутри выделения.
Показать оригинальное описание (EN)
The UpdateHub OTA client in subsys/mgmt/updatehub/updatehub.c contains an out-of-bounds / uninitialized-memory read in z_impl_updatehub_probe(). The probe response from the UpdateHub server is copied into a heap buffer (metadata) that is correctly NUL-terminated, but a second buffer (metadata_copy) is allocated with k_malloc (unzeroed) and filled with memcpy(metadata_copy, metadata, strlen(metadata)), which omits the terminating NUL. Everything after the copied content remains uninitialized heap. When the first json_obj_parse() over the array descriptor fails, the code falls back to json_obj_parse(metadata_copy, strlen(metadata_copy), ...). The strlen() call scans past the copied bytes through uninitialized heap and, if no zero byte is found before the end of the allocation, reads beyond the buffer; the resulting over-long length is then parsed as JSON. The probe payload is fully controlled by the (malicious, compromised, or — without the optional CONFIG_UPDATEHUB_DTLS — on-path) UpdateHub server, which can craft a large payload that fails the first parse to drive this path. The consequence is a read of uninitialized heap, with a worst case of an out-of-bounds read past the metadata_copy allocation that can fault and crash the update thread/device, producing a network-triggerable denial of service. The over-read data is consumed only internally to evaluate the update and is not returned to the attacker, so there is no direct information disclosure and no out-of-bounds write. The fix zeroes metadata_copy with memset before the copy, guaranteeing NUL termination and bounding strlen() within the allocation.
Характеристики атаки
Последствия
Строка CVSS v3.1