В ядре Linux устранена следующая уязвимость:
nfsd: восстановить четность rq_status_counter на всех путях выхода nfsd_dispatch()
nfsd_dispatch() устанавливает для rq_status_counter нечетное значение после выполнения запроса.
был декодирован и вернулся к четному значению после полной обработки,
формирование протокола, подобного seq-lock, с беззамковым считывателем в
nfsd_nl_rpc_status_get_dumpit(). Только полностью успешный путь восстановил счётчик до четности. Попадание в кэш
(RC_REPLY), удаление (RC_DROPIT / RQ_DROPME) и пути ошибок кодирования возвращаются.
после сохранения нечетных значений, даже не возвращая счетчик в четное состояние.
Как только один из этих путей выбран, rq_status_counter остается нечетным: следующий
декодирование запроса в 1 (все еще нечетно) и только последующий успешный
кодирование восстанавливает даже. Пока он застрял в странном состоянии, программа чтения дампа обрабатывает rqstp
поля как стабильные, а проверка повторной попытки сравнивается с такими же неизменными
нечетное значение, поэтому он никогда не обнаруживает одновременную мутацию. Это активно выявляет
изменяющие поля (например, args->ops / args->opcnt во время составного декодирования и
Release) в устройство чтения без блокировки, которое может читать после конца
8-элементный встроенный массив операций.
Добавьте помощник, который переводит счетчик на следующее четное значение, и вызовите его на каждом пути возврата, который следует за хранилищем с нечетными значениями. Ошибка декодирования путь остается нетронутым, поскольку он достигается до того, как счетчик станет нечетным.
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: nfsd: restore rq_status_counter to even on all nfsd_dispatch() exit paths nfsd_dispatch() sets rq_status_counter to an odd value once a request has been decoded, and back to an even value once it has been fully processed, forming a seq-lock like protocol with the lockless reader in nfsd_nl_rpc_status_get_dumpit(). Only the fully successful path restored the counter to even. The cache-hit (RC_REPLY), drop (RC_DROPIT / RQ_DROPME) and encode-error paths all return after the odd-valued store without ever bringing the counter back to even. Once one of those paths is taken, rq_status_counter is left odd: the next request's decode ORs in 1 (still odd) and only a subsequent successful encode restores even. While stuck odd, the dumpit reader treats the rqstp fields as stable and its retry check compares against the same unchanging odd value, so it never detects concurrent mutation. This exposes actively mutating fields (e.g. args->ops / args->opcnt during compound decode and release) to the lockless reader, which can read past the end of the 8-element inline ops array. Add a helper that advances the counter to the next even value and call it on every return path that follows the odd-valued store. The decode-error path is left untouched as it is reached before the counter is set odd.
Характеристики атаки
Последствия
Строка CVSS v3.1