Порт LINUXTCP FreeModbus содержит проверку границ на единицу в xMBPortTCPPool() (demo/LINUXTCP/port/porttcp.c). Проверка `if (usTCPFrameBytesLeft > MB_TCP_BUF_SIZE)` использует строгое сравнение «больше чем» вместо «больше или равно» с ограничением MB_TCP_BUF_SIZE в 263 байта. Кадр MBAP с полем длины, равным 264, делает usTCPFrameBytesLeft равным 263, что позволяет пройти проверку на наличие ошибок, а последующий вызов Recv() записывает до 263 байтов, начиная со смещения буфера 7, в 263-байтовый статический буфер aucTCPBuf, переполняя его на 7 байтов в соседнюю статическую переменную usTCPBufPos.
Одиночный созданный неаутентифицированный пакет Modbus TCP вызывает переполнение, поскольку Modbus не имеет встроенной аутентификации.
Показать оригинальное описание (EN)
The LINUXTCP port of FreeModbus contains an off-by-one bounds check in xMBPortTCPPool (demo/LINUXTCP/port/porttcp.c). The check uses a strict greater-than comparison instead of greater-than-or-equal against the 263-byte MB_TCP_BUF_SIZE limit.
Характеристики атаки
Последствия
Строка CVSS v3.1