В ядре Linux устранена следующая уязвимость:
nfsd: освободить ссылки на путь при ошибке Follow_down()
nfsd_cross_mnt() инициализирует путь к локальной структуре с помощью mntget() и
dget() перед вызовом Follow_down(). При отрицательном возврате ошибка
рука выпрыгивает наружу, не отпуская эти ссылки:
ошибка = Follow_down(&path, Follow_flags);
если (ошибка < 0)
выйти;
Follow_down() никогда не удаляет ссылки времени входа вызывающего абонента при любой ошибке
подслучай; например, сбой перед пересечением d_manage() оставляет путь
нетронутым, поэтому вызов mntget()/dget(), выполняемый при входе, сохраняется при вызове. Каждая вторая рука раннего выхода в nfsd_cross_mnt() (other-namespace
return, IS_ERR(exp2) и хвост успеха после замены) уже
вызывает path_put(&path); плечо err < 0 является единственным упущением.
утечка увеличивает mnt_count и d_count при каждом неудачном перекрестном монтировании,
блокирует размонтирование и прижимает зубные ряды к усадочному устройству, и
доступен любому аутентифицированному клиенту NFS через nfsd_lookup_dentry
или путь кодирования NFSv4 READDIR.
Исправьте, вызвав path_put(&path) перед переходом в случае ошибки < 0. Arm, чтобы ссылки времени входа освобождались при всех ошибках Follow_down()
возвращается.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: nfsd: release path refs on follow_down() error nfsd_cross_mnt() initializes a local struct path with mntget() and dget() before calling follow_down(). On a negative return the error arm jumps to out without releasing those references: err = follow_down(&path, follow_flags); if (err < 0) goto out; follow_down() never drops the caller's entry-time refs on any error sub-case; for example a pre-cross d_manage() failure leaves path untouched, so the mntget()/dget() taken on entry survive the call. Every other early-exit arm in nfsd_cross_mnt() (other-namespace return, IS_ERR(exp2), and the success tail after the swap) already calls path_put(&path); the err < 0 arm is the lone omission. The leak inflates mnt_count and d_count on each failed cross-mount, blocking umount and pinning dentries against the shrinker, and is reachable by any authenticated NFS client through nfsd_lookup_dentry or the NFSv4 READDIR encode path. Fix by calling path_put(&path) before the goto out in the err < 0 arm so the entry-time refs are released on all follow_down() error returns.
Характеристики атаки
Последствия
Строка CVSS v3.1