
Уязвимость BDU:2024-10523: разыменование нулевого указателя в clk-mt2701 ядра Linux
BDU:2024-10523 (CVE-2023-52875) - это уязвимость типа разыменование нулевого указателя (NULL Pointer Dereference) в компоненте clk-mt2701
ядра Linux. Она затрагивает версии ядра от 4.10 до 6.6.1 включительно и может быть использована локальным злоумышленником для вызова отказа в обслуживании (DoS).
CVSS 3.0 (AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H), что указывает на необходимость локального доступа, низкую сложность эксплуатации и критическое влияние на доступность системы.
Технический анализ
1. Компонент clk-mt2701
clk-mt2701
— это драйвер ядра Linux, управляющий тактовыми сигналами для систем на чипе (SoC) MediaTek MT2701. Он отвечает за настройку и распределение частот для различных компонентов устройства (например, CPU, GPU, периферии). Ошибка возникает при обработке запросов, связанных с инициализацией или управлением тактовыми сигналами.
Чип MediaTek MT2701 в основном используется в планшетах и смартфонах. В обычных компьютерах (десктопах или ноутбуках) этот чип встречается крайне редко. MediaTek в основном специализируется на мобильных устройствах и встроенных системах.
2. Механизм уязвимости
Уязвимость вызвана отсутствием проверки валидности указателя перед его использованием. В коде драйвера присутствует код, который в определенных условиях обращается к памяти по адресу 0x00000000
(NULL-указатель). Это происходит, например:
-
При неудачной попытке выделения памяти (
kmalloc
возвращает NULL). -
При неправильной инициализации структур данных драйвера во время загрузки (функция
probe()
). -
При обработке специально сформированных запросов от пользовательского пространства.
Пример упрощенного кода с уязвимостью:
struct clk_hw *hw = clk_hw_register(...);
// Если clk_hw_register возвращает NULL из-за ошибки...
clk_prepare_enable(hw->clk); // ...здесь происходит разыменование NULL-указателя
3. Последствия
При эксплуатации уязвимости возникает kernel panic, приводящий к:
-
Аварийной перезагрузке системы.
-
Зависанию операционной системы.
-
Потере несохраненных данных и простою сервисов.
Для атаки достаточно выполнения вредоносного кода с правами обычного пользователя. Удаленная эксплуатация невозможна.
Подверженные системы
Уязвимость затрагивает:
-
Ядро Linux версий 4.10–6.6.1 (включительно).
-
Дистрибутивы:
-
Ubuntu (18.04 LTS, 20.04 LTS, 22.04 LTS).
-
Debian GNU/Linux (10, 11, 12).
-
РЕД ОС 7.3.
-
Другие ОС, использующие уязвимые версии ядра.
-
Методы защиты
1. Установка обновлений
Основной способ устранения — обновление ядра до версий, содержащих патч:
-
Для Debian/Ubuntu: установить пакеты
linux-image
, выпущенные после исправления (например, версии ядра >= 6.1.63, 6.5.12, 6.6.2 в зависимости от ветки). -
Для РЕД ОС: использовать обновления от вендора.
-
Для самостоятельной сборки ядра: интегрировать коммит, устраняющий проверку указателя в
clk-mt2701
.
2. Временные меры
-
Отключение модуля clk-mt2701, если он не используется (через
modprobe -r clk-mt2701
). Важно: это возможно только на системах без SoC MediaTek MT2701. -
Ограничение локального доступа: минимизация числа пользователей с правами на выполнение кода.
3. Мониторинг
-
Отслеживание сообщений о kernel panic в логах (
dmesg
,journalctl
). -
Использование инструментов вроде
kernelshark
для анализа активности драйверов.
4. Рекомендации для разработчиков
-
Всегда проверять возвращаемые значения функций выделения памяти (
kmalloc
,devm_kzalloc
). -
Использовать макросы
WARN_ON
иBUG_ON
для критических проверок в драйверах. -
Применять статический анализ кода (например,
Coverity
,KLEE
) для выявления потенциальных NULL-разыменований.
