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

Сводка

по VulDB • 23.10.2026

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

drm/xe: Исправление двойного вычета в учете shrinker при внешних pin-операциях с учетом вложенности (nested external pins)

Функции xe_bo_pin_external() и xe_bo_unpin_external() поддерживают вложенные pin-операции, поскольку базовые функции ttm_bo_pin()/ttm_bo_unpin() используют счетчик refcount (pin_count), а не булево значение. Однако вызовы учета shrinker — xe_ttm_tt_account_subtract() и xe_ttm_tt_account_add() — выполняются без условий при каждом вызове pin_external()/unpin_external(), вместо того чтобы выполняться только при переходе в состояние pinned и выходе из него.

Внешний BO (dma-buf) может быть зафиксирован (pinned) более одного раза, даже если он уже находится в состоянии pinned; например, когда у него есть несколько attachment/importer-ов, каждый из которых независимо вызывает xe_bo_pin_external(). Каждая такая вложенная pin-операция снова вычитает страницы BO из учета shrinker, хотя страницы BO были уже исключены из рассмотрения первой (внешней) фиксацией. Симметрично, каждая вложенная unpin-операция добавляет их обратно до того, как BO фактически будет разфиксирован (unpinned). Это приводит к десинхронизации счетчиков страниц и объектов shrinker с реальным положением дел; поскольку эти значения объявлены как signed long, но интерпретируются как unsigned long в функции xe_shrinker_count(), переполнение по отрицательному значению (underflow) может превратиться в огромное количество shrinkable/purgeable страниц, что вызывает чрезмерное invocation shrinker'а при давлении на память.

Необходимо защитить вызовы учета проверками перехода счетчика pin-операций, аналогичными тем, которые уже используются для защиты обслуживания списка pinned_link, чтобы учет обновлялся только при самой внешней (outermost) pin-операции и последней unpin-операции.

При централизации этой логики в функциях xe_bo_account_pin()/xe_bo_account_unpin() также устраняется вторая, связанная с этим проблема учета, затрагивающая импортированные dma-bufs. Для ttm_tt импортированного bo хук populate ядра Xe (xe_ttm_tt_populate()) выполняет ранний возврат без вызова xe_ttm_tt_account_add(), поскольку установлен флаг TTM_TT_FLAG_EXTERNAL, но не установлен TTM_TT_FLAG_EXTERNAL_MAPPABLE. Однако обертка ttm_tt_populate() из ядра TTM без условий помечает tt как populated при успешном выполнении хука драйвера, поэтому функция ttm_tt_is_populated() по-прежнему возвращает true для такого случая. Функции xe_bo_account_pin()/xe_bo_account_unpin() доверяли значению ttm_tt_is_populated() как индикатору того, что «страницы учтены shrinker'ом», и вычитали/добавляли страницы для такого tt, которые никогда не были добавлены изначально, что снова приводило к underflow счетчиков shrinker. Эта ситуация достижима сегодня через xe_bo_pin_external() и станет новой точкой входа по пути fb-pin после того, как данный патт маршрутизирует __xe_pin_fb_vma() через xe_bo_pin_account(), поэтому исправление необходимо внести здесь, а не в последующем патче, чтобы избежать коммита в этой серии, который вносит регрессию до ее устранения. Необходимо пропустить учет для импортированных BO, используя ту же проверку EXTERNAL && !EXTERNAL_MAPPABLE, которую используют xe_ttm_tt_populate()/xe_ttm_tt_unpopulate() для принятия решения о действиях, с помощью нового вспомогательного метода xe_ttm_bo_is_imported() (вынесенного из его единственного предыдущего места использования).

v2: - Исправлена критическая проблема, обнаруженная при обзоре Sashiko AI: проверка перехода счетчика pin-операций, введенная здесь, все еще могла быть обойдена путем fb-pin (__xe_pin_fb_vma()/__xe_unpin_fb_vma()), что могло оставить неактуальную запись pinned_link и постоянную утечку учета shrinker при выполнении последней истинной unpin-операции. Проблема решена в отдельном последующем патче этой серии, а не включена сюда, так как это отдельный баг с собственным тегом Fixes:. - Удалена ненужная локальная переменная "last_unpin" в xe_bo_unpin_external(), восстановлена оригинальная встроенная проверка bo->ttm.pin_count == 1; она была просто переименованием без функционала, не использовалась ни одним из новых вспомогательных методов учета и все равно будет удалена последующим патчем.

v3: - Исключены импортированные dma-bufs из учета shrinker для pin/unpin операций, что исправляет еще один underflow, обнаруженный при обзоре Sashiko AI. - Добавлен короткий комментарий к месту фиксации backup-object, указывающий на то, что страница уже заполнена/учтена во время pin-операции; это решает (как ложное срабатывание для уточнения, без необходимости исправления кода) отдельную проблему утечки учета средней серьезности, также обнаруженную Sashiko AI.

---truncated---

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

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

Linux

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

25.09.2026

Раскрытие

23.10.2026

Модерация

принято

Вход

VDB-425918

EPSS

0.00000

KEV

Нет

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

Очень низкий

Источники

Do you need the next level of professionalism?

Upgrade your account now!