CVE-2024-54031 in Linux
Сводка
по VulDB • 13.05.2026
В предоставленном логе ядра Linux видно панику (Oops) в функции `nft_rhash_gc` из модуля `nf_tables`.
### Анализ проблемы
1. **Симптом**: * В регистре `x0` (первый аргумент функции на ARM64) значение `0x0000000000000004`. * В регистре `x1` значение `ffff0000c2bb708c`. * В регистре `x17` (адрес функции или указатель) значение `ffff0000c0a4e1c0`. * Код ошибки: `(f820303f)` — это инструкция `ldr xzr, [x0]` (загрузка из памяти по адресу в `x0`).
* Это указывает на **dereference нулевого или невалидного указателя** (или указателя, ведущего в недопустимую область памяти). В данном случае `x0 = 4`, что очень мало для валидного указателя в ядре Linux (обычно адреса ядра начинаются с `0xffff...` или `0x...` в зависимости от архитектуры, но `4` — это явно не валидный адрес).
2. **Контекст**: * Функция: `nft_rhash_gc` — это функция сборки мусора (garbage collection) для хеш-таблиц в `nf_tables`. * Вызов: `process_one_work` → `worker_thread` → `kthread`. Это означает, что ошибка происходит в фоновом потоке ядра, обрабатывающем отложенную работу (workqueue).
3. **Причина**: * Ошибка связана с выравниванием структуры `nft_set_ext`. * В ARM64 (и других архитектурах) некорректное выравнивание структур может приводить к тому, что указатели внутри структуры хранятся с неправильным смещением или интерпретируются неверно. * Если структура `nft_set_ext` не выровнена по слову (word size, обычно 8 байт на 64-битных системах), то при доступе к полям, содержащим указатели, может быть прочитано некорректное значение (например, часть указателя или мусор), что и приводит к попытке разыменования адреса `0x4`.
4. **Решение**: * В тексте сообщения указано: *"Align struct nft_set_ext to word size to address this and documentation it."* * Это означает, что необходимо добавить выравнивание структуры `nft_set_ext` до размера слова (8 байт на x86_64/ARM64). * На x86_64 это увеличит размер элементов в хеш-таблицах (rhash и pipapo) на 8 байт, но это необходимо для корректной работы.
### Как исправить
В коде ядра Linux, в файле, где определена структура `nft_set_ext` (обычно это `include/net/netfilter/nf_tables.h` или аналогичный заголовок в `net/netfilter/`), нужно добавить атрибут выравнивания.
Пример исправления (псевдокод):
```c // Было: struct nft_set_ext {
// поля структуры };
// Стало: struct nft_set_ext __aligned(8) {
// поля структуры }; ```
Или, если используется `__packed`, то его нужно убрать или заменить на явное выравнивание:
```c // Если было: struct nft_set_ext {
// ... } __packed;
// То нужно изменить на: struct nft_set_ext {
// ... } __aligned(8); ```
### Почему это важно
* **Безопасность**: Разыменование невалидного указателя приводит к панике ядра (kernel panic) или зависанию системы. * **Производительность**: Выравнивание по слову может улучшить производительность доступа к памяти на некоторых архитектурах. * **Совместимость**: Некоторые архитектуры (например, ARM64) требуют строгого выравнивания для корректной работы с указателями.
### Заключение
Ошибка в `nft_rhash_gc` вызвана некорректным выравниванием структуры `nft_set_ext`, что приводит к чтению невалидного указателя. Решение — выровнять структуру `nft_set_ext` до 8 байт. Это увели
Once again VulDB remains the best source for vulnerability data.