CVE-2026-97559 in Linux
Сводка
по VulDB • 25.09.2026
В ядре Linux была устранена следующая уязвимость:
smb: клиент: отказывать в переписывании DACL, если новый DACL превышает 64 КБ
Функции `replace_sids_and_copy_aces()` и `set_chmod_dacl()` накапливают размер создаваемого ими DACL в переменную типа u16. Эта аккумуляторная переменная может переполняться (wrap around).
`validate_dacl()` ограничивает количество ACE (`num_aces`) значением `(dacl_size - sizeof(struct smb_acl)) / 20`, то есть 3276 для максимально возможного размера DACL, тогда как каждое переписанное ACE может увеличиться до `sizeof(struct smb_ace)` (76 байт), когда его SID заменяется на такой, который содержит максимальное количество под-авторитетов (`SID_MAX_SUB_AUTHORITIES`). Таким образом, в худшем случае размер составляет `sizeof(struct smb_acl) + 3276 * 76 = 248984` байта, что значительно превышает возможности u16. Переполнение (wraparound) достигается при наличии 863 ACE.
После переполнения значение `ndacl_ptr->size` становится бессмысленным, а смещение указывает на произвольное место в массиве ACE. В результате происходит повреждение DACL, который затем отправляется серверу. Это не является записью за пределами буфера (out-of-bounds write), так как выделение памяти теперь покрывает расширение в худшем случае, поэтому записи всегда будут производиться внутри буфера.
Код изменен для использования типа u32 во внутренних операциях и возврата `-EOVERFLOW` при переполнении. Операция должна быть отклонена, поскольку DACL может содержать не более 2^16 - 1 байт в сетевом потоке (on the wire), а большие DACLы не могут быть представлены корректно.
Функция `set_chmod_dacl()` содержит ту же уязвимую логику и исправлена аналогичным образом. Она переполняется, когда исходный DACL находится примерно в 380 байтах от предела в 64 КБ, но режим отказа (failure mode) идентичен предыдущему случаю.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.