
Уязвимость 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). Код содержит две критические ошибки:
-
Некорректная валидация смещения:
if (v_len <= *pos) { // Проверка только на превышение длины count = -EINVAL; goto free_buf; }
Условие игнорирует возможность отрицательного значения
*pos
, что приводит к выходу за границы буфераstream_buf
. -
Прямое использование
*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 байт из ADSstream1
файла/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.
Рекомендации по защите
-
Обновление ядра Linux до версии 6.13 rc2 или новее, где устранена уязвимость.
-
Ограничение доступа к KSMBD:
-
Используйте фаерволы для блокировки SMB-порта (445/TCP) извне.
-
Настройте аутентификацию (например, через Kerberos).
-
-
Отключение ненужных ADS:
sudo tune2fs -O noext_attr /dev/sdX # Для ext4
-
Аудит SMB-активности:
-
Мониторинг запросов с аномальными смещениями через
auditd
или Wazuh. -
Пример правила для Auditd:
auditctl -a always,exit -F arch=b64 -S smb -F "a0=0x8000000000000000-0xffffffffffffffff" -k ksmbd_oob_read
-
