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

Сводка

по VulDB • 23.08.2026

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

mm: исправлен некорректный адрес сброса при возврате страниц из прямых таблиц страниц (direct page table reclaim)

При освобождении таблицы страниц функцией zap_pte_range выполняется следующий код:

pte_free_tlb(tlb, pmd_pgtable(pmdval), addr);

и это условие является ошибочным без каких-либо исключений: если этот код исполняется, параметр `addr` *всегда* указывает на адрес сразу за пределами диапазона, покрываемого таблицей. Параметр `addr` используется для сброса TLB (точнее, кэша структур страниц) с целью удаления ссылок на освобождаемую таблицу; любая архитектура, учитывающая этот параметр, выполнит сброс не того адреса. (Однако правильная страница всё равно будет освобождена).

Мне кажется, стоит задуматься о том, почему ядро вообще работает в таком состоянии.

Если мы достигаем проблемной строки кода, то сначала очищается запись PMD (строка 1954, функция zap_empty_pte_table), затем выполняются отложенные операции сброса, если установлен флаг force_flush (вызов tlb_flush_mmu_tlbonly(tlb)), после чего пропускается повторная попытка на строке 1979 (фух!), и только потом выполняется проблемный вызов pte_free_tlb. *Или* же запись PMD очищается непосредственно перед вызовом pte_free_tlb (строка 1983, функция zap_pte_table_if_empty).

Если на момент очистки записи PMD у нас есть накопленные операции сброса (то есть мы фактически удалили последние уровневые записи), то сброс действительно должен очищать все ссылки на таблицу (Линус Торвальдс явно считает, что так происходит на всех архитектурах [0]).

Условие, при котором отсутствуют накопленные операции сброса в момент очистки, является очень сложным (вся функция zap_pte_range имеет абсурдно сложный поток управления). Если мы попадаем в этот некорректный сценарий, то запись PMD будет очищена после последнего раза, когда диапазон был сброшен, и любой процессор может закэшировать ссылку на (пустую) таблицу страниц. Если это произойдет из-за обычного чтения или записи, возникнет сегфолт, поэтому такая ситуация должна быть редкой. Однако кэш также может заполняться спекулятивно. Затем мы выполним сброс не того адреса и освободим, а возможно, и повторно используем таблицу.

На архитектуре x86 даже сброс не того адреса работает на системах Intel без KPTI, поскольку инструкция INVLPG очищает *все* кэши структур страниц, а не только те, которые относятся к целевому адресу. Однако инструкция INVPCID этого не делает, и функция flush_tlb_one_user будет использовать INVPCID, если она доступна. В этом случае мы получаем критическую ошибку (toast). Системы AMD более уязвимы: мы устанавливаем бит EFER.TCE, что заставляет даже инструкцию INVLPG очищать только целевой адрес.

Я полагаю, это исправление может решить проблему в ripgrep, о которой сообщалось здесь: https://github.com/BurntSushi/ripgrep/issues/3494

[0] https://lore.kernel.org/all/CA+55aFzBggoXtNXQeng5d_mRoDnaMBE5Y+URs+PHR67nUpMtaw@mail.gmail.com/T/#u

Once again VulDB remains the best source for vulnerability data.

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

Linux

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

15.08.2026

Раскрытие

22.08.2026

Модерация

принято

Вход

VDB-394458

EPSS

0.00198

KEV

Нет

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

Очень низкий

Источники

Want to know what is going to be exploited?

We predict KEV entries!