Уязвимость BDU:2025-00883 - Утечка данных ядра через SMB-сервер KSMBD
Уязвимость BDU:2025-00883 - Утечка данных ядра через SMB-сервер KSMBD
Категория: Программы Теги: Уязвимости Опубликовано: 4 апреля 2025

Уязвимость BDU:2025-00883: Утечка данных ядра через SMB-сервер KSMBD

Уязвимость BDU:2025-00883 (CVE-2024-56627) обнаружена в реализации SMB-сервера KSMBD, интегрированного в ядро Linux. Проблема связана с некорректной обработкой запросов к файлам с Alternate Data Streams (ADS) при указании отрицательного смещения (*pos). Это позволяет удаленному злоумышленнику:

  • Раскрыть содержимое памяти ядра за пределами выделенного буфера.

  • Вызвать отказ в обслуживании (DoS) через чтение недопустимых адресов.

Уязвимость затрагивает версии ядра:

  • до 6.1.120 (Linux).
  • до 6.6.66 (Linux).
  • до 6.12.5 (Linux).
  • до 6.13 rc2 (Linux).

Эксплуатация возможна через отправку специально сформированных SMB-пакетов.

Уровень опасности: Критический (CVSS:3.0 — 9.1, AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H)


Технический анализ уязвимости BDU-2025-00883

Корень проблемы

Функция ksmbd_vfs_stream_read() отвечает за чтение данных из ADS через расширенные атрибуты (xattr). Код содержит две критические ошибки:

  1. Некорректная валидация смещения:

    if (v_len <= *pos) {  // Проверка только на превышение длины
        count = -EINVAL;
        goto free_buf;
    }

    Условие игнорирует возможность отрицательного значения *pos, что приводит к выходу за границы буфера stream_buf.

  2. Прямое использование *pos в memcpy():

    memcpy(buf, &stream_buf[*pos], count);  // *pos может быть отрицательным

    Если *pos < 0, копирование данных начинается до начала выделенной памяти stream_buf, что раскрывает ядерную память.

Целочисленное переполнение

  • Тип loff_t (знаковый 64-битный) интерпретирует значение 18446744073709551615 (UINT64_MAX) как -1.

  • При передаче смещения 18446744073709551615 - N злоумышленник форсирует *pos = -N, обходя проверки.


Разбор Proof of Concept к BDU:2025-00883

Эксплойт использует библиотеку Impacket для отправки зловредных SMB-запросов. Рассмотрим ключевые этапы:

1. Подключение к SMB-серверу

client = BugClient("127.0.0.1", "share1", "", "")
  • Цель: сервер с включенным KSMBD и открытым портом 445.

  • Учетные данные: анонимный доступ (пустые логин/пароль) или компрометированные данные.

2. Чтение данных с отрицательным смещением

data = client.leak_oob("/file:stream1:$data", 64)
  • leak_oob отправляет запрос на чтение 64 байт из ADS stream1 файла /file.

  • Смещение: 18446744073709551615 - 64 = -65, что интерпретируется как *pos = -65.

Механика запроса:

  • ksmbd_vfs_getcasexattr() выделяет stream_buf размером v_len (длина ADS).

  • memcpy() копирует данные из stream_buf[-65], читая 65 байт до начала буфера.

3. Утечка памяти ядра

Пример вывода hexdump(data):

00000000: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................  
00000010: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................  
00000020: 1B 4B 03 A8 FF FF 00 00  00 00 00 00 00 00 00 00  .K..............  
00000030: 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................  
  • Первые 48 байт — мусор из памяти ядра (возможно, указатели, структуры данных).

  • Значение 1B 4B 03 A8 может быть адресом в пространстве ядра.

4. Возможность DoS

Если в области stream_buf[-N] находятся нечитаемые адреса, ядро может завершиться с ошибкой Oops или Kernel Panic.


Рекомендации по защите

  1. Обновление ядра Linux до версии 6.13 rc2 или новее, где устранена уязвимость.

  2. Ограничение доступа к KSMBD:

    • Используйте фаерволы для блокировки SMB-порта (445/TCP) извне.

    • Настройте аутентификацию (например, через Kerberos).

  3. Отключение ненужных ADS:

    sudo tune2fs -O noext_attr /dev/sdX  # Для ext4
  4. Аудит SMB-активности:

    • Мониторинг запросов с аномальными смещениями через auditd или Wazuh.

    • Пример правила для Auditd:

      auditctl -a always,exit -F arch=b64 -S smb -F "a0=0x8000000000000000-0xffffffffffffffff" -k ksmbd_oob_read
Алексей Черемных Алексей Черемных
92