
Уязвимость BDU:2025-04373 (CVE-2025-21756) в ядре Linux
Уязвимость BDU:2025-04373 (CVE-2025-21756) возникает в модуле net/vmw_vsock/af_vsock.c
ядра Linux и связана с некорректным управлением счетчиком ссылок (reference counter) при переназначении транспорта для сокетов AF_VSOCK. Ошибка приводит к преждевременному освобождению объекта vsock_sock
, что создает условие Use-After-Free (UAF). Это позволяет злоумышленнику перезаписать освобожденную память и выполнить произвольный код в режиме ядра, получая права root.
Анализ уязвимости
Уровень опасности: 7.8 (Высокий)
Вектор атаки: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
-
AV:L (Вектор атаки: Локальный) – Требуется физический/локальный доступ к системе.
-
AC:L (Сложность атаки: Низкая) – Простая эксплуатация уязвимости.
-
PR:L (Привилегии: Низкие) – Нужны базовые права доступа.
-
UI:N (Взаимодействие: Нет) – Участие пользователя не требуется.
-
S:U (Область: Неизменная) – Влияет только на уязвимый компонент.
-
C:H (Конфиденциальность: Высокое) – Полная утечка данных.
-
I:H (Целостность: Высокое) – Критическое изменение данных/системы.
-
A:H (Доступность: Высокое) – Серьёзное нарушение работоспособности.
Интерпретация: Уязвимость высокой опасности (7.8) требует локального доступа и базовых прав, но позволяет легко нарушить конфиденциальность, целостность и доступность системы. Риск обусловлен низкой сложностью эксплуатации и максимальным воздействием на ключевые аспекты безопасности.
Технические детали
-
Некорректное уменьшение счетчика ссылок:
Функцияvsock_remove_bound()
ошибочно уменьшает счетчик ссылок для сокета, даже если он не был привязан (unbound). Это приводит к ситуации, когда объектvsock_sock
освобождается, но продолжает использоваться в связанных структурах (например, вvsock_bind_table
). -
Эксплуатационный путь:
-
Злоумышленник создает сокет AF_VSOCK и манипулирует его состоянием через
connect()
иbind()
. -
После триггера UAF освобожденная память перезаписывается контролируемыми данными (например, через
pipe
илиmsg_msg
). -
Обход защиты kASLR осуществляется через функцию
vsock_diag_dump()
, которая позволяет получить адресskc_net
путем брутфорса 210.
-
Анализ эксплоита
Код эксплоита из общего доступа к уязвимости BDU:2025-04373 (CVE-2025-21756) демонстрирует полный путь от UAF до выполнения ROP-цепи. Для понимания работы вектора атаки с использованием этой уязвимости рассмотрим ключевые этапы:
-
Подготовка окружения:
-
Создание множества сокетов для заполнения кэшей ядра:
int junk[FLUSH]; for (int i = 0; i < FLUSH; i++) junk[i] = socket(AF_VSOCK, SOCK_SEQPACKET, 0);
-
Привязка сокетов к определенным портам для манипуляции таблицей
vsock_bind_table
.
-
-
Триггер UAF:
-
Последовательные вызовы
connect()
с некорректными параметрами приводят к ошибкам и преждевременному освобождению объекта:if (!connect(s, (struct sockaddr *)&addr, alen)) { ... }
-
-
Перезапись памяти:
-
Использование
pipe
для заполнения освобожденной памяти контролируемыми данными:int pipes[NUM_PIPES][2]; write(pipes[i][1], page, PAGE_SIZE);
-
-
Обход kASLR:
-
Брутфорс адреса
skc_net
черезvsock_diag_dump()
, который возвращает разные длины ответов в зависимости от валидности указателя:int query_vsock_diag() { ... recv(sock, buffer, sizeof(buffer), 0); }
-
-
Выполнение ROP-цепи:
-
Перехват управления через
sk->sk_prot->close
и вызовcommit_creds(init_cred)
:long commit_creds = kern_base + 0x1fcc40; write(pipes[i][1], &commit_creds, 8);
-
Условия эксплуатации
-
Локальный доступ: Эксплуатация требует наличия локальной учетной записи на целевой системе.
-
Версии ядра: Уязвимы версии Linux 5.5–6.6.78, 6.7–6.12.15, 6.13–6.13.3.
-
Наличие vsock: Функционал vsock должен быть активен (часто используется в виртуализированных средах).
Защитные меры
-
Обновление ядра: Патчи включены в версии 6.14, 6.12.16, 6.6.79 и других.
-
Отключение vsock: Если функционал не требуется:
sudo modprobe -r vmw_vsock_virtio_transport vmw_vsock_vmci_transport
-
Настройка LSM: Активация AppArmor/SELinux для ограничения операций с сокетами.
-
Мониторинг: Отслеживание подозрительных вызовов
vsock_bind()
иvsock_connect()
.
Пример использования vsock в приложениях
-
Docker и Kubernetes: Используют vsock для коммуникации между контейнерами и хостами.
-
QEMU/KVM: Виртуальные машины взаимодействуют с хостом через vsock.
