CVE-2026-98539 in LinuxИнформация

Сводка

по VulDB • 18.10.2026

В ядре Linux была устранена следующая уязвимость:

fs/ntfs3: использование d_instantiate_new() в ntfs_create_inode() и прекращение «саги» с предупреждениями от syzbot "WARNING in do_new_mount"

Функция ntfs_create_inode() создает новый inode через ntfs_new_inode(). Она хеширует его с помощью insert_inode_locked(), поэтому он помечается как I_NEW до вызова unlock_new_inode().

Однако ntfs3 вызывает d_instantiate() в промежутке... Поскольку dentry уже был захэширован поиском (lookup) перед созданием, любой обход пути находит его без обращения к i_rwsem родителя и может заблокировать inode.

Если этот inode является директорией, unlock_new_inode() вызывает lockdep_annotate_inode_mutex_key() и помечает i_rwsem классом i_mutex_dir_key.

Это сбрасывает счетчик и владельца блокировки, которую кто-то другой уже мог удерживать в данный момент...

syzbot постоянно спамит нам этим проклятым багом:

"WARNING in do_new_mount"

с 2023 года. Я больше не могу это терпеть, поэтому начал разбираться. Насколько я понимаю (Afaict), исполнитель syzbot переходит в только что смонтированный образ ntfs3 с помощью chdir(), создает директорию и затем монтирует на нее псевдофайловую систему (pseudofs). Каждый раз, когда mkdir() занимает больше времени, чем ожидает syzbot, mount() выполняется параллельно:

mkdir("./sys") mount(NULL, "./sys", "sysfs") ntfs_create_inode() d_instantiate() user_path_at() находит dentry do_lock_mount() inode_lock(inode) namespace_lock() unlock_new_inode() lockdep_annotate_inode_mutex_key() init_rwsem(&inode->i_rwsem) unlock_mount() inode_unlock(inode)

Сторона монтирования затем освобождает блокировку, которая, согласно rwsem, никем не удерживается:

DEBUG_RWSEMS_WARN_ON((rwsem_owner(sem) != current) && ...): count = 0x0, magic = 0xffff888043a854e8, owner = 0x0, curr 0xffff888000244880, list empty WARNING: CPU: 0 PID: 5346 at kernel/locking/rwsem.c:1368 __up_write Call Trace: inode_unlock include/linux/fs.h:877 [inline]
unlock_mount fs/namespace.c:2892 [inline]
do_new_mount_fc fs/namespace.c:3828 [inline]
do_new_mount+0x777/0xa40 fs/namespace.c:3887

На PREEMPT_RT то же самое проявляется как

DEBUG_LOCKS_WARN_ON(rt_mutex_owner(lock) != current) WARNING: kernel/locking/rtmutex_common.h:193 at rt_mutex_slowunlock

Вызов up_write() вызывает переполнение вниз (underflow) сброшенного счетчика. Последующий вызов inode_lock() для этой директории затем никогда не возвращается. Обход пути в новую директорию, выполняемый параллельно с mkdir(), повреждает блокировку тем же образом через inode_lock_shared() в lookup_slow().

Переход на d_instantiate_new() и удаление последующего unlock_new_inode(). Все пути обработки ошибок завершаются до этой точки при установленном флаге I_NEW и продолжают использовать discard_new_inode().

Даже не хотелось бы больше видеть этот чертов отчет об ошибке.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

Ответственный

Linux

Резервировать

25.09.2026

Раскрытие

18.10.2026

Модерация

принято

Вход

VDB-421797

EPSS

0.00000

KEV

Нет

Деятельности

Очень низкий

Источники

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!