Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11
Перетяжка, Премия ТПрогер, 13.11

В Rust-коде ядра Linux нашли опасный баг, приводивший к kernel panic

Новости

Получается, Rust — не панацея?

86 открытий522 показов
В Rust-коде ядра Linux нашли опасный баг, приводивший к kernel panic

В стабильной ветке ядра Linux выявили серьезную ошибку в коде, написанном на Rust.

Баг находился в Rust-реализации Binder — ключевого механизма межпроцессного взаимодействия в Android. Ошибка могла приводить к повреждению памяти и, как следствие, к kernel panic.

Исправление уже принято в стабильное дерево Linux и распространяется через обновления.

Что пошло не так

Проблема возникла в логике работы со списком death_list, который используется для отслеживания завершенных объектов Binder.

В коде применялся небезопасный вызов remove, который предполагал, что элемент либо присутствует в списке, либо не используется параллельно.

На практике это допущение оказалось неверным. В момент, когда один поток извлекал элементы списка и переносил их во временный локальный список, другой поток мог одновременно обращаться к тем же структурам данных.

Это создавало гонку данных и приводило к повреждению указателей prev/next в связанном списке.

В результате происходило обращение к невалидным адресам памяти внутри ядра. В логах такие ситуации проявлялись как ошибки обработки страничных запросов и завершались kernel panic.

В Rust-коде ядра Linux нашли опасный баг, приводивший к kernel panic 1

Почему это особенно важно

Binder — один из базовых компонентов Android. Любые ошибки в его реализации потенциально затрагивают миллионы устройств.

При этом баг находился именно в Rust-коде, что делает ситуацию особенно чувствительной на фоне дискуссий о безопасности Rust в ядре Linux.

Напомним, что Rust активно продвигается как язык, снижающий риск ошибок работы с памятью. Однако этот случай показывает важную деталь: использование unsafe снимает часть гарантий языка и ошибки проектирования многопоточности никуда не исчезают.

Как баг исправили

Разработчики изменили логику очистки death_list. Вместо извлечения элементов во временный список и последующей обработки вне блокировки, код теперь:

  • работает напрямую с оригинальным списком;
  • извлекает элементы по одному под защитой блокировки;
  • исключает параллельный доступ к структурам данных.

Таким образом, опасный сценарий с одновременной модификацией списка стал невозможен.

Что это значит для Rust в ядре

Этот инцидент не отменяет преимуществ Rust, но служит напоминанием: безопасность — это не только язык, но и архитектура кода.

Даже в Rust ошибки синхронизации и неверные предположения о владении данными могут приводить к критическим сбоям.

Для ядра Linux это еще один аргумент в пользу осторожного и постепенного расширения Rust-кода — с тщательным аудитом, ревью и минимизацией unsafe-участков.

Следите за новыми постами
Следите за новыми постами по любимым темам
86 открытий522 показов