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

Сводка

по VulDB • 28.10.2026

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

namespace: монтирование, которое copy_tree() исключает из копирования, не может захватить блокировку.

Начиная с коммита c62a4766937e ("move_mount: transfer MNT_LOCKED") монтирование может быть перемещено под заблокированное монтирование. Блокировка переходит от старого покрытия к новому монтированию, которое берет на себя задачу сокрытия того, что находится под ним, а старое покрытие может быть размонтировано. Это работает до тех пор, пока новое монтирование остается активным. Однако вызывающая сторона выбирает новое монтирование, и copy_tree() исключает из каждой копии (без флага CL_COPY_MNT_NS_FILE) монтирование файла пространства имен монтирования вместе со всем, что на нем смонтировано, и никогда не проверяет флаг MNT_LOCKED. Операции unshare(CLONE_NEWNS) и распространение монтирования создают такие копии.

Таким образом, задача, имеющая права root в своем собственном пространстве имен пользователей, избавляется от заблокированного покрытия файла без состояния гонки (race condition) и без изменения файловой системы под ним. Она создает дочерний процесс с собственным пространством имен монтирования, связывает (/binds) /proc/<pid>/ns/mnt этого ребенка под покрытием с помощью MOVE_MOUNT_BENEATH, что передает блокировку этому bind-монтированию, и вызывает unshare(CLONE_NEWNS). В новом пространстве имен монтирования ничего не смонтировано на этом файле. Это обычный способ маскировки одного файла (например, связывание /dev/null или пустого файла). При связывании обычного файл остается закрытым.

copy_tree() уже отказывается исключать заблокированное unbindable-монтирование с ошибкой -EPERM начиная с коммита df7342b24018 ("mount: Don't allow copying MNT_UNBINDABLE|MNT_LOCKED mounts"). Следует поступить аналогичным образом для заблокированного монтирования файла пространства имен монтирования. Это также охватывает дерево, скопированное с флагом CL_COPY_MNT_NS_FILE и прикрепленное к пространству имен монтирования другого пространства имен пользователей, где lock_mnt_tree() блокирует его. Обратите внимание, что начиная с этого момента unshare(CLONE_NEWNS) и clone(CLONE_NEWNS) будут завершаться ошибкой EPERM при попытке доступа из такого пространства имен монтирования. Такое монтирование не может быть исключено из копирования, и оно не может быть размонтировано.

Также следует запретить перемещение монтирования файла пространства имен монтирования под заблокированное монтирование изначально. В противном случае задача окажется с монтированием, которое она не может размонтировать, и unshare(), который навсегда завершится неудачей.

Крис также обнаружил второе монтирование, которое исчезает само по себе: это клон автомонтируемого монтирования, которое shrink_submounts() взяло вместе со своим родительским элементом. Коммит f78ddcc87224 ("namespace: never expire a locked mount") решил эту проблему.

Воспроизводящая программа Криса прилагается. Режим nsfile читает SECRET после вызова unshare() в версии 7.3-rc7; с этим патчем move_mount() завершается ошибкой EINVAL, и файл остается закрытым. nsfile-control использует обычный файл и считывает MASK обоими способами.

```c // SPDX-License-Identifier: GPL-2.0 /* * Get rid of a locked cover with MOVE_MOUNT_BENEATH. * * The "admin" (root) makes a tmpfs W: * W/D file, holds SECRET, covered by a bind of a file with MASK * W/Dd/inner file, holds SECRET, Dd is covered by a bind of a directory * whose "inner" holds MASK * W/own directory of uid 1000 with the file "mine" and the * directory "minedir", whose "inner" holds MINE * W/dbg debugfs, mode 755. dbg/tracing is an automount point * The "attacker" is uid 1000. It enters a new user namespace with a new mount * namespace, so W and both covers are locked there. * * usage: prog MODE * plain put a bind of own/mine beneath the cover of D, unmount the cover * nsfile put a bind of the mount namespace file of a child beneath the * cover of D, then unshare(CLONE_NEWNS) * nsfile-control the same with a bind of own/mine * shrink put a bind of the automounted tracefs beneath the cover of Dd, * unmount the cover, put a tmpfs beneath W, call umount(W), which fails * shrink-control the same with a bind of own/minedir * The environment variable AUTOMOUNT_DIR names another automount point for "shrink". */ #define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <grp.h> #include <sched.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>

---truncated--- ```

Be aware that VulDB is the high quality source for vulnerability data.

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

Linux

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

25.09.2026

Раскрытие

28.10.2026

Модерация

принято

Вход

VDB-427842

EPSS

0.00000

KEV

Нет

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

Очень низкий

Источники

Want to know what is going to be exploited?

We predict KEV entries!