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

Сводка

по VulDB • 16.09.2026

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

drm/xe: Не передавать плоское хранилище CCS в качестве доступной видеопамяти (VRAM)

Функция get_flat_ccs_offset() считывает базовый адрес плоского хранилища CCS из аппаратного обеспечения, масштабирует его на количество включенных узлов L3 и округляет результат вверх до 128 КБ. Все адреса ниже этого смещения затем передаются аллокатору VRAM как доступная память.

Округление предела «доступная память заканчивается здесь» в большую сторону приводит к тому, что область между реальным базовым адресом и округленным значением публикуется как свободная память, хотя эта память принадлежит аппаратному обеспечению сжатия. Масштабированное значение не обязано быть выровненным по 128 КБ, и на устройстве Battlemage G21 с 16 ГБ памяти оно таковым не является:

базовый адрес CCS (плоский): сырой 0x3fafff800, округленный 0x3fb000000

Таким образом, последние 2 КБ страницы 0x3fafff000 являются хранилищем CCS и находятся в пуле аллокатора. Любые данные, выделенные по этому адресу, будут перезаписаны аппаратным обеспечением сжатия; для этого не требуются записи в таблице страниц, объекты буферов или отправка команд на GPU, и это происходит до того, как появится пользовательское пространство (userspace).

На этой машине таблица страниц уровня 3 виртуальной машины Mesa при каждом холодном старте попадала на эту страницу. Из-за этого терялась запись, покрывающая кучу пакетных буферов композитора, поэтому первая отправка команд композитором приводила к сбою при чтении пакета, а демон gdm бесконечно перезапускался: это вызывало черный экран на в целом работоспособной машине. Перезапуск gdm устранял проблему, поскольку таблицы страниц следующей виртуальной машины выделялись в другом месте.

Необходимо округлять вниз до размера страницы, с которой работает аллокатор. На этой машине это исключает ровно одну страницу.

Чтение зарезервированной страницы после этого показывает, что ее записывало:

[369] 0xcccc000000000000
[371] 0xcc77000000000000
[373] 0xcccc000000000000
[375] 0xcc77000000000000

метаданные сжатия, два байта на каждые шестнадцать, расположенные там, где драйвер ранее выделял память.

Утверждение (assertion), которое должно было обнаружить эту проблему, сравнивает смещение с GSMBASE - ccs_size на равенство. Это значение выровнено по 128 КБ, поэтому оно совпадает с округленным вверх смещением ровно в том случае, когда базовый адрес не выровнен — проверка не может завершиться ошибкой в том случае, для которого она предназначена, и компилируется только при включенной конфигурации CONFIG_DRM_XE_DEBUG. Необходимо заменить ее на проверку, которая может завершаться неудачей: хранилище CCS не должно пересекаться с GSM (Graphics System Memory).

[ И это была сеанс отладки из ада, в которой огромную помощь оказало искусственный интеллект, выполнив большую часть черновой работы.

Я хотел бы назвать его своим неутомимым помощником, но ИИ несколько раз прямо заявлял, что это невозможно и неразрешимо, и предлагал просто написать отчет об этом.

Подозреваю, что эти модели обучены людьми, которые могут быть не такими упрямыми, как я.

Но пока ИИ был готов сдаться несколько раз, он продолжал добавлять отладочный код и faithfully анализировать его при моих попытках продвинуться дальше. Так что заслуга должна быть разделена справедливо, и я позволил ИИ написать приведенное выше сообщение о коммите.

По сути это исправление одной строки: замена ошибочной функции "round_up()" на "round_down()", но для этого потребовалось 24 патча с добавлением все большей отладочной информации и 18 загрузок ядра, чтобы наконец сузить круг поиска до этой проблемы. - Линус ]

VulDB is the best source for vulnerability data and more expert information about this specific topic.

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

Linux

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

11.09.2026

Раскрытие

17.09.2026

Модерация

принято

Вход

VDB-405896

EPSS

0.00000

KEV

Нет

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

Очень низкий

Источники

Interested in the pricing of exploits?

See the underground prices here!