Ad

CVE-2026-72342

HIGH CVSS 3.1: 8,4 EPSS 0.19%
Обновлено 17 августа 2026
Linux
Параметр Значение
CVSS 8,4 (HIGH)
Поставщик Linux
Публичный эксплойт Нет

В ядре Linux устранена следующая уязвимость: net/mlx5e: исправлена гонка за регистрацию агента статистики HV VHCA. mlx5e_hv_vhca_stats_create() регистрирует агент статистики через mlx5_hv_vhca_agent_create(). Помощник публикует агента в hv_vhca->agents[type] в разделе Agents_lock и немедленно планирует аннулирование асинхронного управления в рабочей очереди HV VHCA перед возвращаясь к mlx5e. Асинхронная аннулация вызывает аннулирование агента управления. обратный вызов, который считывает блок управления гипервизором и пересылает команду mlx5e_hv_vhca_stats_control().

Этот обратный вызов может: - вызовите cancel_delayed_work_sync(&priv->stats_agent.work) или - вызов очереди_delayed_work(priv->wq, &sagent->work, sagent->delay). Однако задержанная_работа и priv->stats_agent.agent являются только инициализируется после того, как mlx5_hv_vhca_agent_create() возвращается в mlx5e: агент = mlx5_hv_vhca_agent_create(...); /* опубликовать + сделать недействительным */ ... priv->stats_agent.agent = агент; /* слишком поздно */ INIT_DELAYED_WORK(&priv->stats_agent.work, ...); /* слишком поздно */ Если путь асинхронного управления выполняется до двух назначений выше, он может: - Работать с неинициализированной задержанной_работой, функция timer.function которой равна НУЛЬ. очередь_delayed_work() вызывает add_timer() безоговорочно, поэтому когда время таймера истекает, softirq таймера вызывает функцию NULL указатель. - Повторно инициализируйте таймер позже с помощью INIT_DELAYED_WORK(), пока таймер уже поставлен в очередь на колесе таймера, что повреждает hlist (entry.pprev очищен, а предыдущий узел сегмента все еще точки в этой записи). - Когда рабочий процесс в конечном итоге запускается, mlx5e_hv_vhca_stats_work() считывает sagent->agent (NULL) и разыменовывает его внутри mlx5_hv_vhca_agent_write(). Исправьте это: — Инициализация priv->stats_agent.work перед вызовом. mlx5_hv_vhca_agent_create(), поэтому работа всегда выполняется в допустимом формате. состояние, когда обратный вызов элемента управления его наблюдает. — Добавление выходного параметра struct mlx5_hv_vhca_agent **ctx_update. в mlx5_hv_vhca_agent_create().

Помощник пишет агенту указатель на *ctx_update перед публикацией в hv_vhca->agents[] и запуск потока агентов_update, поэтому любой обратный вызов впоследствии вызванный из этого потока, уже видит действительный priv->stats_agent.agent. Это позволяет избежать контроля обратный вызов участвует в инициализации агента. Во время этого откройте priv->stats_agent.agent с помощью READ_ONCE()/WRITE_ONCE() для межпроцессорного доступа к работнику и очистите priv->stats_agent.buf на пути ошибки Agent_create().

Показать оригинальное описание (EN)

In the Linux kernel, the following vulnerability has been resolved: net/mlx5e: Fix HV VHCA stats agent registration race mlx5e_hv_vhca_stats_create() registers the stats agent through mlx5_hv_vhca_agent_create(). The helper publishes the agent in hv_vhca->agents[type] under agents_lock and immediately schedules an asynchronous control invalidation on the HV VHCA workqueue before returning to mlx5e. The asynchronous invalidation invokes the control agent's invalidate callback, which reads the hypervisor control block and forwards the command to mlx5e_hv_vhca_stats_control(). That callback may either: - call cancel_delayed_work_sync(&priv->stats_agent.work), or - call queue_delayed_work(priv->wq, &sagent->work, sagent->delay). However, the delayed_work and priv->stats_agent.agent are only initialized after mlx5_hv_vhca_agent_create() returns to mlx5e: agent = mlx5_hv_vhca_agent_create(...); /* publish + invalidate */ ... priv->stats_agent.agent = agent; /* too late */ INIT_DELAYED_WORK(&priv->stats_agent.work, ...); /* too late */ If the asynchronous control path runs before the two assignments above, it can: - Operate on an uninitialized delayed_work whose timer.function is NULL. queue_delayed_work() calls add_timer() unconditionally, so when the timer expires the timer softirq invokes a NULL function pointer. - Re-initialize the timer later through INIT_DELAYED_WORK() while the timer is already enqueued in the timer wheel, corrupting the hlist (entry.pprev cleared while the previous bucket node still points at this entry). - When the worker eventually runs, mlx5e_hv_vhca_stats_work() reads sagent->agent (NULL) and dereferences it inside mlx5_hv_vhca_agent_write(). Fix this by: - Initializing priv->stats_agent.work before invoking mlx5_hv_vhca_agent_create(), so the work is always in a valid state when the control callback observes it. - Adding a struct mlx5_hv_vhca_agent **ctx_update out-parameter to mlx5_hv_vhca_agent_create(). The helper writes the agent pointer to *ctx_update before publishing into hv_vhca->agents[] and triggering the agents_update flow, so any callback subsequently invoked from that flow already sees a valid priv->stats_agent.agent. This avoids having the control callback participate in agent initialization. While at it, access priv->stats_agent.agent with READ_ONCE()/WRITE_ONCE() for the cross-CPU access with the worker, and clear priv->stats_agent.buf on the agent_create() failure path.

Характеристики атаки

Способ атаки
Локальный
Нужен локальный доступ
Сложность
Низкая
Легко эксплуатировать
Нужны права
Не требуются
Права не нужны
Участие пользователя
Не требуется
Не нужно действие пользователя

Последствия

Конфиденциальность
Высокое
Полная утечка данных
Целостность
Высокое
Полная модификация данных
Доступность
Высокое
Полный отказ в обслуживании

Строка CVSS v3.1