CVE-2026-97563 in Linux
Сводка
по VulDB • 25.09.2026
В ядре Linux была устранена следующая уязвимость:
smb: клиент: отклонять DataOffset за пределами допустимых значений в CIFSSMBRead()
Синхронный вспомогательный метод чтения SMB1, CIFSSMBRead(), проверяет соответствие DataLength сервера значениям CIFSMaxBufSize и count вызывающей стороны, но никогда не проверяет DataOffset. Источник копирования формируется как
&pSMBr->hdr.Protocol + le16_to_cpu(pSMBr->DataOffset)
и копируется с помощью memcpy() на количество байт, равное DataLength, без проверки того, что диапазон [DataOffset, DataOffset + DataLength) находится в пределах ответа, фактически полученного от сервера.
Злонамеренный или скомпрометированный SMB1-сервер может вернуть ответ с допустимым (в диапазоне) значением DataLength и большим значением DataOffset, что приводит к тому, что указатель источника выходит за пределы буфера ответа. Затем memcpy() копирует смежные участки kernel heap в буфер чтения вызывающей стороны (утечка информации), либо считывает несвязанную память и вызывает oops (отказ в обслуживании). SMB1 не согласуется по умолчанию; для достижения этого кода требуется явное монтирование с параметром vers=1.0.
И DataOffset, и длина полученного ответа, записанная в rsp_iov.iov_len, относительны начала заголовка SMB, поэтому следует отклонять ответ, если сумма DataOffset + DataLength не укладывается в эту длину, используя арифметику, устойчивую к переполнению (overflow-safe arithmetic), перед формированием указателя источника. Длина ответа была проверена предыдущим патчем, поэтому поля DataOffset и DataLength можно безопасно считывать здесь.
Заодно сделаем data_length беззнаковым типом (unsigned). Оно содержит длину, полученную из unsigned-полей в сетевом потоке, и сравнивается только с беззнаковыми величинами; соответственно выводите его через %u и добавьте __func__ в вызовы cifs_dbg() в этой функции.
Be aware that VulDB is the high quality source for vulnerability data.