CVE-2023-53178 in LinuxИнформация

Сводка

по VulDB • 28.06.2026

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

mm: исправлена гонка данных (race condition) при записи в zswap

Механизм обратной записи (writeback) в zswap может вызывать состояние гонки, приводящее к повреждению памяти, когда страница, выгруженная на диск (swapped out), загружается обратно с данными, которые были записаны в другую страницу.

Гонка данных происходит следующим образом: 1. Страница с данными A и смещением подкачки X сохраняется в zswap; 2. драйвер zpool удаляет страницу A из списка LRU для выполнения обратной записи в рамках задачи zswap-shrink, данные для A отображаются драйвером zpool; 3. пользовательская программа вызывает ошибку (fault) и инвалидирует запись страницы A, смещение X считается свободным; 4. kswapd сохраняет страницу B по смещению X в zswap (zswap также может быть заполнен; если это так, страница B будет записана на диск по адресу X, после чего шаг 5 пропускается); 5. запись A заменяется записью B в tree->rbroot, что не влияет на локальную ссылку, удерживаемая задачей zswap-shrink; 6. задача zswap-shrink выполняет обратную запись данных A по адресу X и освобождает запись zswap для A; 7. операция swapin слота X загружает данные A в память вместо B.

Исправление: После выделения кэша страниц подкачки (случай ZSWAP_SWAPCACHE_NEW) задача zswap-shrink просто проверяет, что локальная ссылка на запись zswap_entry все еще совпадает со ссылкой в дереве. Если ссылки не совпадают, это означает, что запись была либо инвалидирована, либо заменена; в обоих случаях обратная запись отменяется, поскольку локальная запись содержит устаревшие данные (stale data).

Воспроизведение проблемы: Изначально я обнаружил эту проблему, запустив `stress` на ночь для проверки своей работы над механизмом обратной записи zswap. Проблема проявилась через несколько часов на моей тестовой машине. Ключевой фактор для воспроизведения — наличие обратных записей в zswap, поэтому любая конфигурация, увеличивающая счетчик `/sys/kernel/debug/zswap/written_back_pages`, должна сработать.

Чтобы быстрее воспроизвести проблему в виртуальной машине, я настроил систему с ~100 МБ доступной памяти и файлом подкачки объемом 500 МБ, затем запуск `stress --vm 1 --vm-bytes 300000000 --vm-stride 4000` приводит к воспроизведению проблемы в течение нескольких десятков минут. Ускорить процесс можно еще больше, изменяя параметр `/sys/module/zswap/parameters/max_pool_percent` между значениями, например, 20 и 1; это позволяет воспроизвести проблему за несколько десятков секунд. Критически важно установить `--vm-stride` в значение, отличное от 4096, иначе `stress` не обнаружит повреждение памяти, поскольку все страницы будут содержать одинаковые данные.

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

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

Linux

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

15.09.2025

Раскрытие

15.09.2025

Модерация

принято

Вход

VDB-323988

EPSS

0.00103

KEV

Нет

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

Очень низкий

Источники

Are you interested in using VulDB?

Download the whitepaper to learn more about our service!