Identifying Linux Kernel Instability Due to Poor RCU Synchronization
Sullivan, Flanagan, Connell
Read-Copy-Update (RCU) is widely used in the Linux kernel to manage concurrent access to shared data structures.However, improper synchronization when removing RCU protected hash table entries can lead to stale pointers, inconsistent lookups, and critical use after free (UAF) vulnerabilities. This paper investigates a driver-level synchronization issue arising from the omission of explicit synchronize_rcu() calls during hash table updates, using a discovered weakness in the Intel ICE network drivers Virtual Function (VF) management. Previous kernel vulnerabilities, such as a bug in the Reliable Datagram Sockets (RDS) subsystem, show how improper RCU synchronization can directly cause kernel crashes. Experimental results demonstrate that removing VF entries without proper synchronization leaves transient stale entries, delays memory reclamation, and results in significant memory fragmentation under rapid insert/delete workloads. RCU hash tables are widely deployed in Linux kernel subsystems such as networking, virtualization, and file systems; improper synchronization can cause memory fragmentation, kernel instability, and out-of-memory (OOM) conditions. Mitigations are proposed, recommending explicit insertion of synchronize_rcu() calls to ensure timely and safe memory reclamation. These findings reinforce established best practices for RCU synchronization, highlighting their importance for maintaining kernel stability and memory safety.
Keywords: RCU, kernel synchronization, hash tables, ICE driver, memory fragmentation, use-after-free
academic
Выявление нестабильности ядра Linux из-за неправильной синхронизации RCU
В данной работе исследуются проблемы синхронизации механизма Read-Copy-Update (RCU), широко используемого в ядре Linux для управления параллельными структурами данных. Исследование выявило, что при удалении записей из защищённой RCU хеш-таблицы без явного вызова synchronize_rcu() возникают устаревшие указатели, несогласованные поиски и серьёзные уязвимости типа use-after-free (UAF). Авторы на примере слабых мест, обнаруженных в управлении виртуальными функциями (VF) сетевого драйвера Intel ICE, экспериментально доказали, что неправильная синхронизация RCU при быстрых операциях вставки/удаления приводит к временным устаревшим записям, задержанному освобождению памяти и серьёзной фрагментации памяти, что в конечном итоге вызывает исчерпание памяти (OOM) и крах системы. Статья предлагает решение по смягчению последствий путём явного добавления вызовов synchronize_rcu(), подчёркивая критическую важность правильной синхронизации RCU для поддержания стабильности ядра и безопасности памяти.
Механизм RCU в ядре Linux широко используется для реализации безблокирующего доступа к структурам данных, позволяя читателям получать доступ к данным без блокировок, в то время как писатели откладывают освобождение данных до завершения всех читателей. Однако при удалении записей из защищённой RCU хеш-таблицы без надлежащего механизма синхронизации (такого как synchronize_rcu() или call_rcu()) могут возникнуть следующие проблемы:
Проблема устаревших указателей: другие ядра процессора могут по-прежнему содержать ссылки на удалённые объекты
Уязвимость Use-After-Free: память освобождается преждевременно, но всё ещё используется
Фрагментация памяти: быстрые циклы выделения/освобождения препятствуют эффективному восстановлению памяти
Нестабильность системы: в конечном итоге приводит к OOM и краху ядра
Авторы выбрали сетевой драйвер Intel ICE в качестве практического тестового случая, который использует защищённую RCU хеш-таблицу в управлении виртуальными функциями SR-IOV. Исследование выявило, что при удалении VF используется hash_del_rcu(), но не вызывается synchronize_rcu(), что предоставляет идеальную экспериментальную платформу для систематического изучения влияния отсутствия синхронизации RCU.
Обнаружение уязвимостей и анализ случаев: выявлены и подробно проанализированы проблемы отсутствия синхронизации RCU в управлении VF драйвера Intel ICE, предоставлены реальные примеры уязвимостей на уровне драйверов ядра
Систематическая экспериментальная оценка: разработаны и реализованы комплексные методы стресс-тестирования, включая:
Тестирование быстрых циклов создания/удаления VF
Мониторинг использования памяти и OOM
Анализ синхронизации периода покоя RCU
Количественная оценка фрагментации памяти
Эмпирические доказательства: экспериментально доказаны три ключевых последствия отсутствия synchronize_rcu():
Временное наличие устаревших записей
Значительная задержка восстановления памяти
Условия OOM при быстрых операциях (даже при наличии 120 МБ свободной памяти)
Решения по смягчению последствий и лучшие практики: предложены чёткие рекомендации по исправлению (явный вызов synchronize_rcu()) и альтернативные стратегии (call_rcu(), ограничение скорости), усиливающие лучшие практики синхронизации RCU
Универсальная методология: предоставленные методы тестирования могут быть расширены на другие подсистемы ядра, обеспечивая парадигму для систематического обнаружения проблем синхронизации RCU
В отличие от теоретического анализа, данное исследование основано на реальном коде драйвера производственного уровня, предоставляя практически воспроизводимый случай проблемы.
Данная работа представляет собой солидное исследование в области безопасности систем, успешно связывающее теоретические лучшие практики RCU с реальными уязвимостями в коде драйвера ядра. На конкретном примере драйвера Intel ICE авторы систематически демонстрируют серьёзные последствия отсутствия вызова synchronize_rcu(): от устаревших указателей к фрагментации памяти и краху системы.
Наибольшее достоинство работы заключается в её практической ориентации и воспроизводимости. В отличие от чисто теоретического анализа, работа предоставляет подробную экспериментальную установку, исполняемые тестовые скрипты и чёткие количественные данные. Парадоксальное открытие о срабатывании OOM при наличии 120 МБ доступной памяти ярко иллюстрирует опасность фрагментации памяти.
Основная ценность проявляется на трёх уровнях: (1) предоставление действенных рекомендаций по исправлению для Intel и других разработчиков драйверов; (2) предоставление предупреждающего примера для сообщества разработчиков ядра; (3) предоставление расширяемой методологии тестирования для исследователей.
Пространство для улучшения в основном касается ширины и глубины экспериментов: тестирование на большем количестве аппаратных платформ, более глубокий анализ внутренних механизмов ядра, более полная оценка компромиссов производительности, а также более убедительные доказательства возможности эксплуатации UAF — всё это усилило бы убедительность работы.
В целом, это отличная работа, вносящая практический вклад в сообщество разработки ядра и системной безопасности, с выводами и методологией, имеющими долгосрочную ценность.