В Rust-коде ядра Linux нашли опасный баг, приводивший к kernel panic
Новости
Получается, Rust — не панацея?
86 открытий522 показов
В стабильной ветке ядра Linux выявили серьезную ошибку в коде, написанном на Rust.
Баг находился в Rust-реализации Binder — ключевого механизма межпроцессного взаимодействия в Android. Ошибка могла приводить к повреждению памяти и, как следствие, к kernel panic.
Исправление уже принято в стабильное дерево Linux и распространяется через обновления.
Что пошло не так
Проблема возникла в логике работы со списком death_list, который используется для отслеживания завершенных объектов Binder.
В коде применялся небезопасный вызов remove, который предполагал, что элемент либо присутствует в списке, либо не используется параллельно.
На практике это допущение оказалось неверным. В момент, когда один поток извлекал элементы списка и переносил их во временный локальный список, другой поток мог одновременно обращаться к тем же структурам данных.
Это создавало гонку данных и приводило к повреждению указателей prev/next в связанном списке.
В результате происходило обращение к невалидным адресам памяти внутри ядра. В логах такие ситуации проявлялись как ошибки обработки страничных запросов и завершались kernel panic.
Почему это особенно важно
Binder — один из базовых компонентов Android. Любые ошибки в его реализации потенциально затрагивают миллионы устройств.
При этом баг находился именно в Rust-коде, что делает ситуацию особенно чувствительной на фоне дискуссий о безопасности Rust в ядре Linux.
Напомним, что Rust активно продвигается как язык, снижающий риск ошибок работы с памятью. Однако этот случай показывает важную деталь: использование unsafe снимает часть гарантий языка и ошибки проектирования многопоточности никуда не исчезают.
Как баг исправили
Разработчики изменили логику очистки death_list. Вместо извлечения элементов во временный список и последующей обработки вне блокировки, код теперь:
- работает напрямую с оригинальным списком;
- извлекает элементы по одному под защитой блокировки;
- исключает параллельный доступ к структурам данных.
Таким образом, опасный сценарий с одновременной модификацией списка стал невозможен.
Что это значит для Rust в ядре
Этот инцидент не отменяет преимуществ Rust, но служит напоминанием: безопасность — это не только язык, но и архитектура кода.
Даже в Rust ошибки синхронизации и неверные предположения о владении данными могут приводить к критическим сбоям.
Для ядра Linux это еще один аргумент в пользу осторожного и постепенного расширения Rust-кода — с тщательным аудитом, ревью и минимизацией unsafe-участков.
86 открытий522 показов




