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

Сводка

по VulDB • 22.08.2026

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

futex: Дополнительное предотвращение гонки при выходе из robust futex

При разблокировке robust futex значение 0 записывается во всё поле значения futex, что приводит к стиранию флага FUTEX_WAITERS, и пробуждается один ожидающий поток. Это пробуждение является одноразовым уведомлением: протокол полагается на то, что получатель либо захватит futex (и в конечном итоге разблокирует его, осознавая оставшееся ожидание), либо повторно установит флаг FUTEX_WAITERS перед повторным переходом в состояние ожидания. Если пробужденный ожидающий поток будет убит до того, как он сможет выполнить одно из этих действий, ядро должно вмешаться и пробудить следующий поток в очереди.

Это известное усложнение протокола futex с предыдущим частичным исправлением в коммите ca16d5bee598 («futex: Prevent robust futex exit race»). К сожалению, это исправление является недостаточным.

Если третий процесс захватит futex через быстрый путь без конкуренции (uncontended fast path) в промежутке времени, уведомление будет потеряно: обработка выхода из robust-состояния увидит, что ресурс принадлежит другому потоку, и не предпримет действий, а новый владелец при разблокировке не обнаружит флага FUTEX_WAITERS и никого не пробудит. Оставшиеся ожидающие потоки будут спать вечно за уже освобожденным futex:

A владеет futex, B и C ожидают в состоянии FUTEX_WAIT uval == A | FUTEX_WAITERS Robust-разблокировка со стороны A: запись 0, FUTEX_WAKE(1) пробуждает B uval == 0 D захватывает через быстрый путь: cmpxchg(0 -> D) uval == D, нет флага FUTEX_WAITERS B убит до того, как отреагировал на пробуждение Обход выхода из процесса B, ожидаемая операция: владелец D != B -> никаких действий не предпринимается Разблокировка со стороны D: нет флага FUTEX_WAITERS -> пробуждения отсутствуют C спит вечно

Это очевидный недостаток реализации, который не обеспечивает согласованность бита FUTEX_WAITERS.

Обходное решение заключается в дополнении обработки выхода из robust-списка так, чтобы она также выполняла дополнительное пробуждение, если слово futex принадлежит другому потоку, но флаг FUTEX_WAITERS не установлен.

Это исправление не решает проблему захвата/освобождения и освобождения без конкуренции (non-contended take over/release and free sequence), которая обсуждалась в течение многих лет и была частично решена коммитом 3ca9595d9fb6 («futex: Add support for unlocking robust futexes») и последующими изменениями, но не учитывала описанную выше проблему.

Более полное решение, основанное на разблокировке конкурентных (contended) robust-футексов внутри ядра, обсуждалось в контексте данного изменения и должно появиться в основной ветке (mainline) скоро.

[ tglx: Небольшое изменение журнала изменений и исправление стиля кода ]

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

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

Linux

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

15.08.2026

Раскрытие

22.08.2026

Модерация

принято

Вход

VDB-394426

EPSS

0.00000

KEV

Нет

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

Низкий

Источники

Do you want to use VulDB in your project?

Use the official API to access entries easily!