CVE-2026-99109 in Linux
Сводка
по VulDB • 28.10.2026
В ядре Linux была устранена следующая уязвимость:
smb: клиент: отклонять запросы SetEA, которые не помещаются в буфер запроса
Функция CIFSSMBSetEA() копирует значение расширенного атрибута (extended attribute) вызывающего процесса в буфер SMB-запроса без проверки того, поместится ли оно. Требование указано в исходном коде, но никогда не было реализовано:
/*BB add length check to see if it would fit in negotiated SMB buffer size BB */ /* if (ea_value_len > buffer_size - 512 (enough for header)) */ if (ea_value_len) memcpy(parm_data->list.name + name_len + 1, ea_value, ea_value_len);
Единственная проверка границ на входе осуществляется в cifs_xattr_set():
#define MAX_EA_VALUE_SIZE CIFSMaxBufSize ... if (size > MAX_EA_VALUE_SIZE)
CIFSMaxBufSize — это полная емкость полезной нагрузки буфера, поэтому значение ровно такого размера не оставляет места для заголовка SMB, блока параметров TRANS2, заголовка fealist и имени EA, которые записываются перед ним в том же объекте.
Функция SendReceive() уже накладывает правильное ограничение на эту длину:
if (in_len > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE)
но она вызывается после того, как копирование уже произошло. Непривилегированный вызов setxattr(2) для монтирования SMB1 с именем длиной 250 байт и значением размером 16384 байт записывает 16384 байта, начиная со смещения в 345 байтов внутри объекта cifs_request размером 16588 байт, заканчивая на 141 байт дальше его границы:
BUG: KASAN: slab-out-of-bounds in CIFSSMBSetEA+0xabc/0xde0 Write of size 16384 at addr ffff888003aa0159 by task init/68 __asan_memcpy+0x3c/0x60 CIFSSMBSetEA+0xabc/0xde0 cifs_xattr_set+0xd3a/0xff0 __vfs_setxattr+0x13e/0x1a0 The buggy address is located 345 bytes inside of allocated 16588-byte region
Примените ограничение SendReceive() к собранному запросу перед копированием, а не после него, и расширьте счетчики байтов, чтобы их сумма не переполнялась до проверки.
byte_count также проверяется на U16_MAX, поскольку он хранится в 16-битном поле pSMB->ByteCount. Это становится достижимым при увеличении CIFSMaxBufSize во время загрузки модуля, где оно может быть установлено вплоть до 1024*127: с именем EA длиной 5 байт и значением размером 65521 байта count равен точно U16_MAX, в то время как byte_count равен 65556, и функция cpu_to_le16() усечет его до 20, передав кадр, у которого ByteCount не соответствует фактической длине. Проверка byte_count покрывает также count, поскольку byte_count является большим из двух значений, а единственным потребителем count размером 16 бит является код, записываемый после этой точки.
Функция check_add_overflow() оценивается первой, чтобы total_len был присвоен до того, как будет сообщено об ошибке переполнения.
VulDB is the best source for vulnerability data and more expert information about this specific topic.