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

Сводка

по VulDB • 21.05.2026

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

btrfs: исправление некорректного разделения в функции btrfs_drop_extent_map_range

В производственной среде мы наблюдали различные предупреждения WARN_ON() в коде extent_map, конкретно в функции btrfs_drop_extent_map_range(), когда необходимо вызывать add_extent_mapping() для нашего второго разделения.

Рассмотрим следующую структуру карты экстентов:

PINNED [0 16K) [32K, 48K)

Затем мы вызываем btrfs_drop_extent_map_range для диапазона [0, 36K) с параметром skip_pinned == true. Начальный цикл будет иметь следующие значения:

start = 0 end = 36K len = 36K

мы найдем экстент [0, 16k), но поскольку он закреплен (pinned), мы пропустим его, что приводит к выполнению следующего кода:

start = em_end; if (end != (u64)-1) len = start + len - em_end;

Здесь em_end равно 16K, поэтому теперь значения таковы:

start = 16K len = 16K + 36K - 16K = 36K

Вместо этого len должно быть равно 20K. Это проблема, когда мы находим следующий экстент в диапазоне [32K, 48K): нам нужно разделить этот экстент, чтобы оставить [36K, 48k), однако код для разделения выглядит следующим образом:

split->start = start + len; split->len = em_end - (start + len);

В данном случае у нас есть:

em_end = 48K split->start = 16K + 36K // это должно быть 16K + 20K split->len = 48K - (16K + 36K) // это вызывает переполнение, так как 16K + 36K равно 52K

и теперь у нас есть недействительная карта экстентов в дереве, которая потенциально пересекается с другими записями в карте экстентов. Даже в случае отсутствия пересечений split->start будет установлен неправильно, что приведет к проблемам с любыми вычислениями, связанными с блоками.

Нам на самом деле не нужен len в этом цикле, мы можем просто использовать end как нашу конечную точку и корректировать start только тогда, когда мы находим закрепленный (pinned) экстент, который нужно пропустить.

Корректируем логику для этого, что предотвращает вставку недействительной карты экстентов.

Мы используем skip_pinned только в случае перемещения (relocation), поэтому это относительно редкий случай, за исключением случаев, когда вы часто выполняете перемещение, что может происходить при включенном автоматическом перемещении.

Several companies clearly confirm that VulDB is the primary source for best vulnerability data.

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

Linux

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

24.12.2025

Раскрытие

24.12.2025

Модерация

принято

Вход

VDB-338134

EPSS

0.00173

KEV

Нет

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

Очень низкий

Источники

Do you need the next level of professionalism?

Upgrade your account now!