
Исследовательский репозиторий для CVE-2025-38502 — выход за границы в локальном хранилище cgroup BPF ядра Linux через хвостовые вызовы, позволяющий локальное повышение привилегий.

Abraxas Labs · abraxaslabs.tech · github.com/abraxas · @abraxas_null
Выход за границы доступа к локальному хранилищу cgroup BPF в ядре Linux через хвостовые вызовы
| CVE | CVE-2025-38502 |
| CWE | CWE-125 — чтение за границами буфера |
| Производитель | Ядро Linux |
| Компонент | kernel/bpf/core.c, include/linux/bpf.h (локальное хранилище cgroup + хвостовые вызовы) |
| Воздействие | Локальное повреждение памяти ядра; повышение привилегий возможно на неисправленных ядрах |
| Вектор атаки | Локальный (AV:L) |
| Привилегии | Низкие (PR:L) — процесс, способный загружать BPF-программы типа CGROUP_SKB (или эквивалентные программы, привязанные к cgroup) |
| Взаимодействие с пользователем | Отсутствует |
| CVSS 3.1 (kernel.org CNA) | 7.8 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| CVSS 3.1 (NVD) | 7.1 HIGH — CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:H |
| Публикация | 16 августа 2025 |
| Исправление в upstream | abad3d0 в 6.17-rc1; бэкпортировано в 6.16.1, 6.12.46, 6.6.105, 6.1.151, 5.15.192 |
Только для исследований / образовательных целей. Не запускайте, не разворачивайте и не используйте материалы из этого репозитория против любого хоста без явного письменного разрешения как от стороны, размещающей этот репозиторий, так и от владельца целевых систем. Обнаружено в дикой природе.
Имя исходного файла CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c обрезает идентификатор. Опубликованная запись — CVE-2025-38502. CVE Linux CVE-2025-3850 не существует.
Lonial сообщил, что локальное хранилище cgroup BPF может быть доступно за границами буфера при хвостовом вызове.
Верификатор eBPF проверяет типы каждой программы изолированно. Во время выполнения bpf_get_local_storage() не ищет карту текущей исполняемой программы. Он читает указатель на хранилище cgroup из current->bpf_ctx → bpf_cg_run_ctx → prog_item->cgroup_storage[]. Этот слот заполняется из изначально привязанной программы, а не из той, в которую был совершён хвостовой вызов.
Если программа A (малый размер значения BPF_MAP_TYPE_CGROUP_STORAGE) совершает хвостовой вызов программы B (большой размер значения), bpf_get_local_storage() программы B всё равно возвращает меньший буфер программы A. Обращения, разрешённые верификатором для карты B, выходят за конец выделенной памяти A.
Дефект был внесён в Linux 5.9 коммитом 7d9c342 (bpf: Make cgroup storages shared between programs on the same cgroup). Он был исправлен путём расширения bpf_map_owner массивом storage_cookie[], так что комбинации хвостовых вызовов принимаются только тогда, когда вызываемая программа использует те же карты хранилища cgroup, что и вызывающая, либо не использует их вовсе.
Это локальный выход за границы кучи ядра. Оценка серьёзности различается у разных производителей, поскольку они расходятся во мнении, является ли примитив «только чтением с DoS» или полным повреждением памяти:
Что это означает на практике:
struct bpf_array, размещённый в том же slab/порядке) могут быть повреждены.map->ops, перехват хелпера, commit_creds / переключение пространства имён). Именно поэтому это дерево помечает проблему как LPE. Более низкая оценка Red Hat отражает их оценку для конкретного продукта, а не отсутствие ошибки.Ошибка не требует сетевого сервиса. Она локальная. Она не требует TTY, setuid-хелпера или взаимодействия с пользователем.
Две BPF-программы cgroup, каждая со своей BPF_MAP_TYPE_CGROUP_STORAGE (разделяемый вариант, BPF_CGROUP_STORAGE_SHARED):
| Программа | Роль | Размер значения хранилища |
|---|---|---|
| A | привязанная / вызывающая хвостовой вызов | малый (например, помещается в заданный порядок kmalloc) |
| B | цель хвостового вызова | большой (верификатор разрешает обращения до этого размера) |
Верификатор проверяет A относительно карты A, а B относительно карты B. Обе проходят.
Во время выполнения хелпер делает:
ctx = container_of(current->bpf_ctx, struct bpf_cg_run_ctx, run_ctx);
storage = ctx->prog_item->cgroup_storage[stype];
if (stype == BPF_CGROUP_STORAGE_SHARED)
ptr = &READ_ONCE(storage->buf)->data[0];
else
ptr = this_cpu_ptr(storage->percpu_buf);
prog_item — это элемент массива для программы, запустившей выполнение cgroup, а не для программы, исполняемой в данный момент после bpf_tail_call. Таким образом, B работает с объектом хранилища A.
bpf_cgroup_storage_alloc() определяет размер резервного буфера из value_size карты. Буфер A слишком мал для проверенных обращений B. Результат — классическая путаница типов идентичности карты при передаче управления — то же семейство ошибок, что и другие проблемы BPF, когда «хелпер видит не ту карту, что верификатор».
Коммит 7d9c342 сделал хранилища cgroup разделяемыми между программами, привязанными к одной cgroup. Именно это разделение делает слот в контексте выполнения единым указателем, а не поиском по каждой программе, и поэтому ядра до 5.9 не затронуты.
BPF_PROG_TEST_RUN для программы BPF_PROG_TYPE_CGROUP_SKB выделяет хранилище cgroup на время теста. Это выделение располагается в куче ядра рядом с тем, что недавно было освобождено в том же классе размеров — включая карты struct bpf_array, чей value_size был выбран так, чтобы попасть в тот же порядок kmalloc. Поэтому выход за границы буфера хранилища может достичь полей bpf_map (ops, список RCU, value[]) соседней array-карты.
Эта деталь компоновки кучи объясняет, почему рекомендация о «простом чтении за границами» и описание LPE могут описывать одну и ту же CVE.
Внесено: Linux 5.9 (7d9c3427894fe70d1347b4820476bf37736d2ff0)
Не затронуты: все ядра до 5.9
Однострочник:
/* CVE-2025-38502: affected 5.9–5.15.191, 5.16–6.1.150, 6.2–6.6.104, 6.7–6.12.45, 6.13–6.16.0; fixed in 5.15.192, 6.1.151, 6.6.105, 6.12.46, 6.16.1, 6.17-rc1 */
Всё ещё открыто в некоторых стабильных ветках: трекер ядра Debian указывал 5.10 upstream-stable / bullseye 5.10 как needed. Не предполагайте, что каждое 5.10.y исправлено.
ABI-номера дистрибутивов обманчивы. Ubuntu 5.15.0-163 — это исправленное 5.15, хотя 5.15.0 выглядит старее, чем upstream 5.15.192. Сравнивайте changelog пакета / USN / DSA / ALAS / RHSA, а не uname -r с таблицей выше.
Любой дистрибутив, поставлявший ядро в указанных выше диапазонах, был в зоне риска до тех пор, пока не бэкпортировал abad3d0 (или соответствующий стабильный коммит). Это общий код BPF, а не патч конкретного дистрибутива.
Ubuntu 26.04 / 25.10 указаны как не затронутые (они ответвлены после исправления). Ubuntu 25.04 достиг EOL, всё ещё needed.
Хост может соответствовать затронутой версии и всё же быть недосягаемым. Полезные проверки:
unprivileged_bpf_disabled=1 не является полным исправлением — пользователь с возможностями BPF всё ещё может вызвать ошибку — но это устраняет непривилегированный путь.
Upstream-коммит abad3d0bad72a52137e0c350c59542d75ae4f513 (bpf: Fix oob access in cgroup local storage, Daniel Borkmann).
struct bpf_map_owner получает массив storage_cookie[]. При обновлении цели хвостового вызова ядро теперь:
bpf_get_local_storage() — требует, чтобы карты хранилища cgroup вызываемой программы были в точности картами вызывающей (те же куки).Несоответствующие размеры значений больше не могут быть скомпонованы за спиной верификатора. Каждая программа по-прежнему проверяется отдельно; новая проверка находится на ребре между ними.
Не применяйте коммит cherry-pick к произвольному дереву без окружающих хелперов owner/cookie для BPF. Используйте стабильный бэкпорт для вашей ветки.
uname -r
# Compare against the table above, then against your distro advisory —
# Ubuntu/Debian ABI numbers are not upstream stable numbers.
grep -E 'CONFIG_BPF_SYSCALL|CONFIG_CGROUP_BPF' \
/boot/config-$(uname -r) /proc/config.gz 2>/dev/null
sysctl kernel.unprivileged_bpf_disabled
# 0 = unprivileged bpf allowed (widest exposure)
# 1 = disabled after first privileged use, or fully disabled depending on kernel
# 2 = disabled (admin can re-enable)
Подтвердите пакет, а не только строку версии:
# Debian / Ubuntu
apt changelog linux-image-$(uname -r) 2>/dev/null | grep -i 38502
# RHEL family
rpm -q --changelog kernel | grep -i 38502
Ядро ≥ 6.17, или стабильная версия из столбца «первое исправление», или пакет дистрибутива из таблицы рекомендаций — это фактическое закрытие вопроса.
abad3d0 / стабильный эквивалент. Это единственное полное исправление.kernel.unprivileged_bpf_disabled=1 (или 2), чтобы отключить непривилегированных загрузчиков.CAP_BPF, CAP_PERFMON и CAP_SYS_ADMIN для недоверенных пользователей и контейнеров.seccomp, LSM или снятие этих возможностей в среде выполнения).BPF_PROG_TEST_RUN достаточно для задействования пути выделения памяти; локальный атакующий предоставляет программы.CVE-2025-38502/
├── README.md
├── banner.png
├── CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c
└── ebpf_lpe.h
| Файл | Что это |
|---|---|
banner.png | Баннер README (Abraxas Labs / CVE-2025-38502) |
CVE-2025-3850-Linux-LPE-Abaraxas-Labs.c | Исходный код исследования, обнаруженный в дикой природе (имя файла обрезает идентификатор CVE) |
ebpf_lpe.h | Общие конструкторы инструкций BPF, хелперы карт и макросы смещений ядра, используемые этим исходником |
Этот каталог документирует уязвимость и содержит соответствующее дерево исследования. Это не готовый эксплойт-кит: символы гаджетов ядра (ARRAY_MAP_OPS_OFF, COMMIT_CREDS, …) являются входными данными времени компиляции для конкретного vmlinux, а запуск программы против работающего ядра выходит за рамки этого README.
CVE / NVD
Upstream
7d9c342 — bpf: Make cgroup storages shared between programs on the same cgroupabad3d0 — bpf: Fix oob access in cgroup local storageСтабильные бэкпорты
Дистрибутивы
Abraxas Labs — только исследования / авторизованное тестирование
Этот репозиторий предназначен для исследований и образования.
Не компилируйте, не запускайте, не разворачивайте и не используйте иным образом код отсюда против любой системы, если у вас нет явного письменного разрешения как от стороны, размещающей этот репозиторий, так и от владельца цели. Несанкционированный доступ к компьютерным системам является преступлением.
Авторы и Abraxas Labs предоставляют этот материал как есть, без каких-либо гарантий того, что он полон, корректен или безопасен для выполнения. Исследования по эксплуатации ядра могут привести к панике машины, повреждению файловых систем и потере данных. Вы принимаете этот риск.
Обнаружено в дикой природе.
| Источник | Оценка | Целостность | Примечания |
|---|
| kernel.org CNA / cve.org | 7.8 HIGH | Высокая | C:H/I:H/A:H — рассматривает ошибку как полное локальное воздействие |
| NVD | 7.1 HIGH | Отсутствует | C:H/I:N/A:H — конфиденциальность + доступность |
| Ubuntu | Средняя (7.1) | — | USN-7909 |
| Red Hat | 4.0 LOW | Отсутствует | C:N/I:N/A:L — оценено как ограниченная доступность |
| Amazon Linux | 4.0 Средняя | Отсутствует | тот же вектор, что и у Red Hat |
| SUSE | 6.1 Умеренная | Отсутствует | некоторые ветки SLE 15 помечены WONTFIX |
| Ветка | Затронуто | Первое исправление |
|---|
| 5.9 – 5.15 | с 5.9 по 5.15.191 | 5.15.192 (c1c74584…) |
| 5.16 – 6.1 | с 5.16 по 6.1.150 | 6.1.151 (66da7cee…) |
| 6.2 – 6.6 | с 6.2 по 6.6.104 | 6.6.105 (7acfa07c…) |
| 6.7 – 6.12 | с 6.7 по 6.12.45 | 6.12.46 (41688d1f…) |
| 6.13 – 6.16 | с 6.13 по 6.16.0 | 6.16.1 (19341d5c…) |
| mainline | до появления исправления | 6.17-rc1 (abad3d0b…) |
| Дистрибутив | Релизы / ядра, попадавшие в диапазон |
|---|
| Ubuntu | 22.04 LTS (5.15), 24.04 LTS (6.8), 25.04 (EOL всё ещё needed). 20.04 HWE 5.15. |
| Debian | 11 bullseye (5.10), 12 bookworm (6.1), 13 trixie (6.12) |
| RHEL 9 / 10, Rocky, Alma, Fedora | RHEL 9 ≈ 5.14; RHEL 10 ≈ 6.12; Fedora rolling 5.9–6.16 |
| SUSE / openSUSE | SLE Micro 5.3/5.4; некоторые ветки SLE 15 WONTFIX |
| Amazon Linux 2023 | ядро по умолчанию и kernel6.12 |
| Amazon Linux 2 extras | 5.10 extra (исправление не планируется) и 5.15 extra |
| Arch, Gentoo, Tumbleweed | rolling-ядра между 5.9 и исправлением 6.16.1 / 6.17-rc1 |
| Дистрибутив | Исправленный пакет (ориентировочно) | Рекомендация |
|---|
| Ubuntu 22.04 | linux 5.15.0-163.173 | USN-7909 |
| Ubuntu 24.04 | linux 6.8.0-106.106 | то же |
| Debian 12 | linux 6.1.153-1 | DSA-6009-1 |
| Debian 13 | linux 6.12.48-1 | DSA-6008-1 |
| Debian 11 (бэкпорт 6.1) | linux-6.1 6.1.153-1~deb11u1 | DLA-4328-1 |
| Amazon Linux 2023 | kernel / kernel6.12, 2025-09-29 | ALAS2023-2025-1210 / 1208 |
| Amazon Linux 2 5.15 extra | 2025-09-29 | ALAS2KERNEL-5.15-2025-091 |
| Условие | Почему это важно |
|---|
CONFIG_BPF_SYSCALL=y | должен существовать bpf(2) |
CONFIG_CGROUP_BPF=y | программы, привязанные к cgroup, и локальное хранилище cgroup |
kernel.unprivileged_bpf_disabled | 0 разрешает непривилегированную загрузку программ; 1/2 требуют CAP_BPF / CAP_PERFMON / CAP_SYS_ADMIN |
| Lockdown / LSM / seccomp | могут блокировать BPF_PROG_LOAD или BPF_PROG_TEST_RUN |
BPF_PROG_TYPE_CGROUP_SKB (или другие типы программ cgroup, несущие локальное хранилище) | контекст выполнения, содержащий cgroup_storage[] |