Разыменование нулевого указателя в clk-mt2701 ядра Linux
Разыменование нулевого указателя в clk-mt2701 ядра Linux
Категория: Программы Теги: Уязвимости Опубликовано: 8 апреля 2025

Уязвимость 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 в логах (dmesgjournalctl).

  • Использование инструментов вроде kernelshark для анализа активности драйверов.

4. Рекомендации для разработчиков

  • Всегда проверять возвращаемые значения функций выделения памяти (kmallocdevm_kzalloc).

  • Использовать макросы WARN_ON и BUG_ON для критических проверок в драйверах.

  • Применять статический анализ кода (например, CoverityKLEE) для выявления потенциальных NULL-разыменований.

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