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

leer en español

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

В Rust-версии Android Binder нашли баг, который портит указатели списка и приводит к крашу.

image

В ядре Linux закрыли уязвимость CVE-2025-68260 — первую CVE, официально назначенную коду на Rust в основной ветке ядра. О проблеме сообщил Грег Кроа-Хартман: она затрагивает драйвер Android Binder, который переписали на Rust, и в худшем случае способна приводить к падению системы.

Суть бага — в небезопасной операции внутри Rust Binder, где из связного списка удаляется элемент, и при этом есть риск, что другой поток параллельно трогает те же указатели prev/next. Разработчики исходили из предположения, что объект NodeDeath никогда не окажется в «чужом» списке, однако на практике возникала ситуация, когда элемент мог одновременно обрабатываться из разных контекстов.

К этому приводила логика Node::release: сначала брался лок, затем все элементы переносились во временный список на стеке, после чего лок отпускался и начинался обход этого локального списка. Если параллельно другой поток вызывал небезопасный remove на исходном списке, возникала гонка, которая портила prev/next, а дальше всё заканчивалось повреждением памяти и крахами. В сообщении приводится пример падения с ошибкой "Unable to handle kernel paging request" в модуле rust_binder.

Исправление свели к тому, чтобы переписать Node::release и извлекать элементы напрямую из исходного списка, не перенося их в локальный список на стеке. По данным команды Linux kernel CVE, проблема появилась в Linux 6.18 (коммит eafedbc7c050c44744fbdf80bdf3315e860b7513) и была исправлена в 6.18.1 (3428831264096d32f830a7fcfc7885dd263e511a), а также в 6.19-rc1 (3e0ae02ba831da2b707905f4e602e43f8507b8cc). Затронутый файл — drivers/android/binder/node.rs.

В качестве меры защиты команда CVE рекомендует обновляться до актуальной стабильной версии ядра: отдельные изменения не тестируются «поодиночке», и выборочное применение патчей в проекте официально не поддерживают. Если же обновление невозможно, необходимые правки можно найти по указанным коммитам в репозитории stable-ветки.