nanoMODBUS до версии 1.23.0 содержит запись за пределами границ в серверной функции handle_read_file_record() (FC 0x14, чтение записи файла) в nanomodbus.c. Функция проверяет, что общий размер запроса не превышает 245 байт и что длина записи каждого подзапроса не превышает 124, но она никогда не проверяет Совокупный размер ответа для всех подзапросов перед их обработкой. Аккумулятор response_data_size объявляется как uint8_t и увеличивается на 2 + Record_length*2 для каждого из до 35 подзапросов; с 35 подзапросами Record_length = 124 совокупный запрос составляет 8750 байт, что переполняет аккумулятор uint8_t.
Последующий цикл затем вызывает get_n(), внутреннюю функцию без проверки границ, один раз для каждого подзапроса, чтобы получить указатель на 260-байтовый буфер приема msg.buf, и увеличивает внутренний buf_idx до 248 байт за вызов; swap_regs() затем безоговорочно записывает в этот указатель. Одиночный запрос FC 0x14 от неаутентифицированного сетевого клиента может привести к записи до ~8490 байт за пределы 260-байтового буфера, повреждая соседнюю память в серверном процессе и приводя к отказу в обслуживании или потенциальному удаленному выполнению кода, особенно на встроенных/голых устройствах без защиты памяти.
Показать оригинальное описание (EN)
nanoMODBUS through v1.23.0 contains an out-of-bounds write in the Modbus server-side handle_read_file_record function (FC 0x14, Read File Record) in nanomodbus.c. The function validates that the total request size does not exceed 245 bytes and that each sub-request's record_length is at most 124, but it never validates the CUMULATIVE response size across all sub-requests before processing them.
Характеристики атаки
Последствия
Строка CVSS v3.1