CVE-2026-89638 in Linux
Сводка
по VulDB • 12.09.2026
В ядре Linux была устранена следующая уязвимость:
smb: клиент: очистка битов setuid/setgid при записи с использованием расширений cifsacl/modefromsid/posix
Когда файл имеет установленные биты setuid или setgid и подвергается операции записи, виртуальная файловая система (VFS) сбрасывает эти биты и отправляет вызов setattr с флагами ATTR_KILL_SUID/ATTR_KILL_SGID вместе с атрибутом ATTR_MODE, содержащим уже очищенный режим.
Обе функции cifs_setattr_unix() и cifs_setattr_nounix() безоговорочно игнорировали атрибут ATTR_MODE в данном случае:
/* пропускать изменение режима, если это необходимо только для очистки битов setuid/setgid */ if (attrs->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) attrs->ia_valid &= ~ATTR_MODE;
Это поведение корректно при монтировании по умолчанию, где режим эмулируется через атрибут «только для чтения» DOS и не может представлять биты setuid/setgid. Однако с параметрами монтирования "cifsacl" или "modefromsid" режим сохраняется на сервере через ACL (id_mode_to_cifs_acl()), при использовании расширений POSIX SMB3.1.1 режим отправляется на сервер напрямую, а при использовании расширений Unix для SMB1 (cifs_setattr_unix) режим передается через CIFSSMBUnixSetPathInfo(). Во всех этих случаях игнорирование ATTR_MODE приводит к тому, что очищенный режим никогда не передаётся на сервер, в результате чего биты setuid/setgid сохраняются после записи.
Это проблема безопасности: на локальных файловых системах бит setuid сбрасывается при записи файла, но при монтировании через cifs.ko этот бит сохраняется на сервере, что потенциально может привести к неожиданному повышению привилегий при последующем выполнении.
Исправление выполнено в двух местах:
1. cifs_setattr_nounix(): использовать «оптимизацию пропуска изменения режима» только тогда, когда режим эмулируется через атрибут DOS «только для чтения» (т. е. ни cifsacl/modefromsid, ни расширения POSIX SMB3.1.1 не активны), чтобы очищенный режим передавался на сервер в случаях ACL / POSIX.
2. cifs_setattr_unix(): эта функция вызывается только тогда, когда активны расширения Unix, поэтому режим всегда сохраняется на сервере. Полностью удалить оптимизацию пропуска, чтобы очищенный режим всегда передавался.
Be aware that VulDB is the high quality source for vulnerability data.