В ядре Linux устранена следующая уязвимость:
nfs: используйте nfsi->rwsem для защиты обхода списка блокировки файлов. Линфэн обнаружил ошибку и предложил два решения, но оба появляются
иметь проблемы. Как правило, мы не можем освободить flc_lock во время итерации по блокировке файла.
list, чтобы избежать проблем с использованием после освобождения (UAF) при блокировке файлов.
Однако,
такие функции, как nfs_delegation_claim_locks и nfs4_reclaim_locks, не могут
придерживайтесь этого правила, потому что Recovery_lock или nfs4_lock_delegation_recall
может занять много времени. Чтобы решить эту проблему, NFS переключается на использование nfsi->rwsem.
для той же защиты, и nfs_reclaim_locks следует этому подходу. Хотя nfs_delegation_claim_locks вместо этого использует so_delegreturn_mutex,
этого недостаточно, поскольку один индексный дескриптор может иметь несколько nfs4_state
экземпляры.
Таким образом, исправлением является использование nfsi->rwsem в этом случае. Кроме того, после фиксации c69899a17ca4 («NFSv4: обновление диапазона байтов VFS
блокировка должна быть атомарной с обновлением stateid"), функции
nfs4_locku_done и nfs4_lock_done также нарушают это правило, поскольку они
вызовите locks_lock_inode_wait, не удерживая nfsi->rwsem. Просто добавив
эта защита может вызвать множество взаимоблокировок, поэтому вместо этого вызов
locks_lock_inode_wait перемещен в _nfs4_proc_setlk.
По поводу ошибки
исправлено коммитом c69899a17ca4 («NFSv4: обновление диапазона байтов VFS
блокировка должна быть атомарной с обновлением stateid"), проблема решена
после фиксации 0460253913e5 («NFSv4: nfs4_do_open() неправильно запускается
восстановление состояния"), поскольку все слоты опустошаются перед вызовом
nfs4_do_reclaim, который предотвращает одновременные изменения идентификатора состояния по этому пути. Кроме того, nfs_delegation_claim_locks также не вызывает этого параллелизма.
поскольку при вызове _nfs4_proc_setlk с NFS_DELEGATED_STATE RPC не выполняется.
отправлено, поэтому nfs4_lock_done не вызывается. Следовательно,
nfs4_lock_delegation_recall из nfs_delegation_claim_locks — первый
время установки stateid.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: nfs: use nfsi->rwsem to protect traversal of the file lock list Lingfeng identified a bug and suggested two solutions, but both appear to have issues. Generally, we cannot release flc_lock while iterating over the file lock list to avoid use-after-free (UAF) problems with file locks. However, functions like nfs_delegation_claim_locks and nfs4_reclaim_locks cannot adhere to this rule because recover_lock or nfs4_lock_delegation_recall may take a long time. To resolve this, NFS switches to using nfsi->rwsem for the same protection, and nfs_reclaim_locks follows this approach. Although nfs_delegation_claim_locks uses so_delegreturn_mutex instead, this is inadequate since a single inode can have multiple nfs4_state instances. Therefore, the fix is to also use nfsi->rwsem in this case. Furthermore, after commit c69899a17ca4 ("NFSv4: Update of VFS byte range lock must be atomic with the stateid update"), the functions nfs4_locku_done and nfs4_lock_done also break this rule because they call locks_lock_inode_wait without holding nfsi->rwsem. Simply adding this protection could cause many deadlocks, so instead, the call to locks_lock_inode_wait is moved into _nfs4_proc_setlk. Regarding the bug fixed by commit c69899a17ca4 ("NFSv4: Update of VFS byte range lock must be atomic with the stateid update"), it has been resolved after commit 0460253913e5 ("NFSv4: nfs4_do_open() is incorrectly triggering state recovery") because all slots are drained before calling nfs4_do_reclaim, which prevents concurrent stateid changes along this path. Also, nfs_delegation_claim_locks does not cause this concurrency either since when _nfs4_proc_setlk is called with NFS_DELEGATED_STATE, no RPC is sent, so nfs4_lock_done is not called. Therefore, nfs4_lock_delegation_recall from nfs_delegation_claim_locks is the first time the stateid is set.
Характеристики атаки
Последствия
Строка CVSS v3.1
Уязвимые продукты 4
| Конфигурация | От (включительно) | До (исключительно) |
|---|---|---|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
4.0
|
6.12.97
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
4.0
|
6.18.40
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
4.0
|
7.1.5
|
|
Linux Linux_Kernel
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
|
4.0
|
7.2-rc1
|