Уязвимость функции vsock_remove_sock() модуля net/vmw_vsock/af_vsock.c
Уязвимость функции vsock_remove_sock() модуля net/vmw_vsock/af_vsock.c
Категория: Программы Теги: Уязвимости Опубликовано: 19 мая 2025

Уязвимость 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

  1. AV:L (Вектор атаки: Локальный) – Требуется физический/локальный доступ к системе.

  2. AC:L (Сложность атаки: Низкая) – Простая эксплуатация уязвимости.

  3. PR:L (Привилегии: Низкие) – Нужны базовые права доступа.

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не требуется.

  5. S:U (Область: Неизменная) – Влияет только на уязвимый компонент.

  6. C:H (Конфиденциальность: Высокое) – Полная утечка данных.

  7. I:H (Целостность: Высокое) – Критическое изменение данных/системы.

  8. A:H (Доступность: Высокое) – Серьёзное нарушение работоспособности.

Интерпретация: Уязвимость высокой опасности (7.8) требует локального доступа и базовых прав, но позволяет легко нарушить конфиденциальность, целостность и доступность системы. Риск обусловлен низкой сложностью эксплуатации и максимальным воздействием на ключевые аспекты безопасности.

Технические детали

  1. Некорректное уменьшение счетчика ссылок:
    Функция vsock_remove_bound() ошибочно уменьшает счетчик ссылок для сокета, даже если он не был привязан (unbound). Это приводит к ситуации, когда объект vsock_sock освобождается, но продолжает использоваться в связанных структурах (например, в vsock_bind_table).

  2. Эксплуатационный путь:

    • Злоумышленник создает сокет AF_VSOCK и манипулирует его состоянием через connect() и bind().

    • После триггера UAF освобожденная память перезаписывается контролируемыми данными (например, через pipe или msg_msg).

    • Обход защиты kASLR осуществляется через функцию vsock_diag_dump(), которая позволяет получить адрес skc_net путем брутфорса 210.

Анализ эксплоита

Код эксплоита из общего доступа к уязвимости BDU:2025-04373 (CVE-2025-21756) демонстрирует полный путь от UAF до выполнения ROP-цепи. Для понимания работы вектора атаки с использованием этой уязвимости рассмотрим ключевые этапы:

  1. Подготовка окружения:

    • Создание множества сокетов для заполнения кэшей ядра:

      int junk[FLUSH];
      for (int i = 0; i < FLUSH; i++)
          junk[i] = socket(AF_VSOCK, SOCK_SEQPACKET, 0);
    • Привязка сокетов к определенным портам для манипуляции таблицей vsock_bind_table.

  2. Триггер UAF:

    • Последовательные вызовы connect() с некорректными параметрами приводят к ошибкам и преждевременному освобождению объекта:

      if (!connect(s, (struct sockaddr *)&addr, alen)) { ... }
  3. Перезапись памяти:

    • Использование pipe для заполнения освобожденной памяти контролируемыми данными:

      int pipes[NUM_PIPES][2];
      write(pipes[i][1], page, PAGE_SIZE);
  4. Обход kASLR:

    • Брутфорс адреса skc_net через vsock_diag_dump(), который возвращает разные длины ответов в зависимости от валидности указателя:

      int query_vsock_diag() { ... recv(sock, buffer, sizeof(buffer), 0); }
  5. Выполнение 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 должен быть активен (часто используется в виртуализированных средах).

Защитные меры

  1. Обновление ядра: Патчи включены в версии 6.14, 6.12.16, 6.6.79 и других.

  2. Отключение vsock: Если функционал не требуется:

    sudo modprobe -r vmw_vsock_virtio_transport vmw_vsock_vmci_transport
  3. Настройка LSM: Активация AppArmor/SELinux для ограничения операций с сокетами.

  4. Мониторинг: Отслеживание подозрительных вызовов vsock_bind() и vsock_connect().

Пример использования vsock в приложениях

  • Docker и Kubernetes: Используют vsock для коммуникации между контейнерами и хостами.

  • QEMU/KVM: Виртуальные машины взаимодействуют с хостом через vsock.

Алексей Черемных Алексей Черемных
458