Фреймворк для написання захищених драйверів для ядра Linux мовою Rust

Джош Тріплет (Josh Triplett), що працює в компанії Intel і входить до комітету, що займається розвитком Crates.io, у своєму виступі на конференції Open Source Technology Summit представив робочу групу, орієнтовану доведення мови Rust до паритету з мовою Сі у сфері системного програмування.

У робочій групі, яка перебуває у процесі створення, розробники Rust спільно з інженерами з компанії Intel підготують специфікації з визначенням функціональності, яку необхідно реалізувати Rust для системного програмування. Системне програмування часто потребує низькорівневих маніпуляцій, таких як виконання привілейованих процесорних інструкцій та отримання детальних відомостей про стан процесора. З подібних можливостей, що вже розвиваються для Rust, відзначається підтримка неіменованих структур, об'єднань (union), асемблерних вставок (макрос «asm!») і формату чисел з плаваючою комою BFLOAT16.

Джош вважає, що майбутнє системного програмування за Rust, а мова Сі у сучасних реаліях претендує на місце, яке у минулі роки посідав Асемблер. Rust
не тільки позбавляє розробників від властивих мові проблем, що виникають через низькорівневу роботу з пам'яттю, але й надає можливість застосування при розробці сучасних парадигм програмування.

В ході обговорення виступи
Джоша була висловлена ​​ідея додавання в ядро ​​Linux можливості розробки драйверів на мові Rust, що дозволить з мінімальними зусиллями створювати безпечні та якісніші драйвери, позбавлені таких проблем, як звернення до області пам'яті після її звільнення, розіменування нульових покажчиків та вихід за межі буфера.

Грег Кроа-Хартман (Greg Kroah-Hartman), що відповідає за підтримку стабільної гілки ядра Linux, висловив готовність додати в ядро ​​фреймворк для розробки драйверів на мові Rust, якщо він матиме реальні переваги в порівнянні з Сі, наприклад, надаватиме безпечні обв'язки над API ядра. Крім того, Грег розглядає даний фреймворк тільки як опцію, не активну за умовчанням, щоб не включати Rust до складальних залежностей до ядра.

Виявилося, що кілька команд уже працюють у цьому напрямку. Наприклад, розробники з компанії «Fish in a Barrel» підготували інструментарій для написання модулів, що завантажуються для ядра Linux на мові Rust, використовуючи для підвищення захисту набір абстрактних прошарків над інтерфейсами і структурами ядра. Прошароки автоматично генеруються на базі наявних заголовних файлів ядра за допомогою утиліти bindgen. Для складання прошарків використовується Clang. Збираються модулі крім прошарків використовують пакет staticlib.

паралельно розвивається ще один проект, зосереджений на розробці драйверів для вбудованих систем та пристроїв інтернету речей, який також використовує bindgen для генерації прошарків на основі заголовних файлів ядра. Фреймворк дозволяє досягти підвищення безпеки драйверів без внесення змін до ядра — замість створення в ядрі додаткових рівнів ізоляції для драйверів, пропонується блокувати проблеми на етапі компіляції, застосовуючи безпечнішу мову Rust. Передбачається, що подібний підхід може бути затребуваний виробниками обладнання, які розробляють пропрієтарні драйвери нашвидкуруч без проведення належного аудиту.

Не вся задумана функціональність поки що реалізована, але фреймворк вже цілком придатний для роботи та використаний для написання робочого драйвера для Ethernet-контролера LAN9512 USB, що поставляється в платі Raspberry Pi 3. Як еталонну реалізацію при написанні Rust-драйвера був використаний існуючий драйвер smsc95x мовою Сі. Зазначається, що розмір модуля та накладні витрати від runtime-компонентів при розробці драйвера на Rust незначні, що дозволяє застосовувати фреймворк для пристроїв з обмеженими ресурсами.

Джерело: opennet.ru

Додати коментар або відгук