Служба транспорта фрагментированных блоков данных LoRaWAN (subsys/lorawan/services/frag_transport.c) не проверяет счетчик фрагментов в полученной команде DATA_FRAGMENT перед пересылкой ее в настроенный декодер. В frag_transport_package_callback() значение frag_counter = hdr->frag_index_n & 0x3FFF берется непосредственно из полезной нагрузки нисходящей линии связи и передается в декодер, который получает индекс массива и смещение флэш-памяти как frag_counter - 1. Фрагменты DataFragment индексируются с 1, поэтому значение frag_counter, равное 0, не соответствует этой арифметике.
При использовании декодера узла Semtech/LoRaMAC по умолчанию это достигает FragDecoder.FragNbMissingIndex[fragCounter - 1] = 0; в FragDecoderProcess(), где fragCounter - 1 оценивается как -1 и записывает ноль uint16_t за пределы, непосредственно перед массивом и в соседнее состояние матрицы восстановления MatrixM2B статического объекта декодера (CWE-787). Сопутствующая запись получает смещение wild flash, но этот путь отклоняется проверкой границ flash_area_write(). Декодер с нехваткой памяти в дереве (frag_dec()) не поврежден: его доступ к битовому массиву и флэш-памяти за пределами допустимого диапазона фиксируется проверками границ sys_bitarray_ и flash_area_.
Обработчик — это зарегистрированный обратный вызов нисходящей линии связи для транспортного порта фрагментации, доступный всякий раз, когда существует активный сеанс фрагментации, поэтому триггерный байт является входными данными сети LoRaWAN/FUOTA, на которые может повлиять злоумышленник. Для его запуска требуются аутентифицированные нисходящие каналы (сеансовые ключи MAC LoRaWAN или вредоносная/скомпрометированная сеть или сервер FUOTA) и активный сеанс фрагментации. Воздействие ограничивается: повреждением состояния декодера и отказом в сеансе обновления прошивки (FUOTA), а не контролируемым повреждением памяти или выполнением кода.
Исправление добавляет проверку транспортного уровня, которая отклоняет frag_counter == 0, закрывая дефект для обоих серверов декодера.
Показать оригинальное описание (EN)
The LoRaWAN Fragmented Data Block Transport service (subsys/lorawan/services/frag_transport.c) does not validate the fragment counter in a received DATA_FRAGMENT command before forwarding it to the configured decoder. In frag_transport_package_callback() the value frag_counter = hdr->frag_index_n & 0x3FFF is taken directly from the downlink payload and passed to the decoder, which derives an array index and flash offset as frag_counter - 1. DataFragment fragments are 1-indexed, so a frag_counter of 0 underflows that arithmetic. With the default Semtech/LoRaMAC-node decoder, this reaches FragDecoder.FragNbMissingIndex[fragCounter - 1] = 0; in FragDecoderProcess(), where fragCounter - 1 evaluates to -1 and writes a uint16_t zero out of bounds, just before the array and into the adjacent MatrixM2B recovery-matrix state of the static decoder object (CWE-787). A companion write derives a wild flash offset, but that path is rejected by the flash_area_write() bounds check. The in-tree low-memory decoder (frag_dec()) is not corrupted: its out-of-range bit-array and flash accesses are caught by sys_bitarray_ and flash_area_ bounds checks. The handler is the registered downlink callback for the fragmentation transport port, reachable whenever an active fragmentation session exists, so the triggering byte is attacker-influenceable LoRaWAN/FUOTA network input. Triggering it requires authenticated downlinks (LoRaWAN MAC session keys or a malicious/compromised network or FUOTA server) and an active fragmentation session. The impact is contained: corruption of decoder state and denial of the firmware-update (FUOTA) session rather than controllable memory corruption or code execution. The fix adds a transport-layer check that rejects frag_counter == 0, closing the defect for both decoder backends.
Характеристики атаки
Последствия
Строка CVSS v3.1