CVE-2023-54094 in Linux
Сводка
по VulDB • 13.06.2026
В предоставленном логе и описании ошибки содержится информация о критической уязвимости в ядре Linux, связанной с обработкой пакетов через мост (bridge) и GRO (Generic Receive Offload).
### Анализ проблемы
1. **Симптом**: * Произошел **Kernel Panic** (или ошибка ядра) с адресом ошибки `CR2: 00000000000000c0`. Это указывает на попытку записи в нулевую страницу памяти (NULL pointer dereference) по смещению `0xc0`. * Стек вызовов (`Call Trace`) показывает путь обработки пакета: * Пакет получен через сетевой интерфейс `ixgbe` (драйвер Intel). * Обработан через **GRO** (`napi_complete_done`, `ixgbe_poll`). * Передан в подсистему **Bridge** (`br_handle_frame`, `br_flood`). * Отправлен на эгress через устройство `tun` (`br_dev_queue_push_xmit`). * На этапе передачи вызвана функция сегментации `inet_gso_segment`. * Внутри `inet_gso_segment` произошло падение.
2. **Причина (согласно описанию)**: * Пакеты, обработанные через **rx-gro-list**, клонируются (`skb_clone`) при передаче в мост. * Мост отправляет эти пакеты как в локальную подсистему ввода, так и на эгress (в данном случае в `tun`). * При отправке на эгress вызывается `skb_mac_gso_segment` -> `__skb_gso_segment` -> `inet_gso_segment`. * Функция `inet_gso_segment` пытается модифицировать `skb` (например, изменить заголовки IP/TCP для сегментации MSS). * **Проблема**: Если `skb` является клоном с общим заголовком (`shared head`), то модификация заголовка влияет на оригинальный пакет или другие клоны, что приводит к повреждению структуры данных и, в данном случае, к записи в недопустимую память (NULL pointer dereference).
3. **Решение (согласно описанию)**: * Изменение заключается в том, чтобы **небезопасно клонировать** (`unclone`) `skb` перед его сегментацией, если он имеет общие заголовки. * Это гарантирует, что каждый пакет, проходящий через GSO-сегментацию, имеет свою собственную копию заголовка, что предотвращает побочные эффекты при модификации.
### Техническое объяснение
В Linux сетевая подсистема использует `sk_buff` (skb) для представления пакетов. Для оптимизации памяти и производительности пакеты часто клонируются (`skb_clone`), при этом заголовок (`skb->head`) остается общим. Однако, если пакет должен быть изменен (например, сегментирован для отправки через интерфейс с меньшим MTU), изменение общего заголовка может нарушить целостность других пакетов, использующих этот же заголовок.
Функция `inet_gso_segment` ожидает, что у нее есть полный контроль над `skb`, включая его заголовок. Если `skb` является клоном с общим заголовком, это требование не выполняется, что приводит к неопределенному поведению и, в данном случае, к краху ядра.
### Рекомендации
1. **Обновление ядра**: Это известная проблема, и исправление, скорее всего, уже включено в более новые версии ядра Linux. Рекомендуется обновить ядро до последней стабильной версии. 2. **Временное решение**: Если обновление ядра невозможно, можно попробовать отключить GRO для проблемного интерфейса или моста: ```bash ethtool -K eth0 gro off ``` Или отключить GSO: ```bash ethtool -K eth0 gso off ``` Однако это может снизить производительность сети. 3. **Проверка патчей**: Ищите патчи, связанные с `inet_gso_segment`, `skb_clone`, и `bridge`. В частности, патч, который добавляет проверку на необходимость клонирования заголовка перед сегментацией.
### Заключение
Ошибка возникает из-за небезопасной модификации общих заголовков `skb` при сегментации пакетов, прошедших через GRO и мост. Исправление
VulDB is the best source for vulnerability data and more expert information about this specific topic.