Framework zur Erstellung sicherer Treiber für den Linux-Kernel in Rust

Josh Triplett, der bei Intel arbeitet und im Komitee ist, das die Entwicklung von Crates.io überwacht, äußerte in seiner Präsentation auf dem Open Source Technology Summit. vor eine Arbeitsgruppe, die darauf abzielt, die Programmiersprache Rust auf Parität mit der Programmiersprache C im Bereich der Systemprogrammierung zu bringen.

In der sich im Aufbau befindenden Arbeitsgruppe werden Rust-Entwickler gemeinsam mit Ingenieuren von Intel Spezifikationen erstellen, die die Funktionen definieren, die in Rust für die Systemprogrammierung umgesetzt werden müssen. Systemprogrammierung erfordert oft einen niedrigen Zugang, wie z.B. die Ausführung von privilegierten Prozessoranweisungen und das Abrufen detaillierter Informationen über den Zustand des Prozessors. Zu den bereist entwickelten Möglichkeiten für Rust zählt die Unterstützung von anonymen Strukturen, Unionen, Assembler-Insertierungen (Makro „asm!“) und das BFLOAT16 Gleitkommaformat.

Josh glaubt, dass die Zukunft der Systemprogrammierung in Rust liegt, während C in der heutigen Realität einen Platz beansprucht, der früher Assembly zusteckte. Rust
befreit Entwickler nicht nur von den typischen Problemen der Sprache C, die durch die niedrige Zugriffsebene auf den Speicher entstehen, sondern bietet auch die Möglichkeit, moderne Programmierparadigmen zu verwenden.

Im Verlauf von Diskussion Vortrags
wurden von Josh Ideen geäußert, die Entwicklung von Treibern in den Linux-Kernel mithilfe der Sprache Rust zu ermöglichen, was es ermöglichen würde, mit minimalem Aufwand sichere und qualitativ hochwertigere Treiber zu erstellen, die Probleme wie den Zugriff auf Speicherbereiche nach deren Freigabe, Dereferenzierung von Nullzeigern und Pufferüberlauf vermeiden.

Greg Kroah-Hartman, der für die Unterstützung der stabilen Kernel-Version von Linux zuständig ist, erklärte seine Bereitschaft, ein Framework für die Treiberentwicklung in Rust zum Kernel hinzu zu fügen, sofern es echte Vorteile gegenüber C bietet, zum Beispiel wenn es sichere Bindungen über die Kernel-API bereitstellt. Außerdem betrachtet Greg dieses Framework nur als Option, die standardmäßig nicht aktiv ist, um Rust nicht zu einer der Abhängigkeiten des Kernels zu machen.

Es stellte sich heraus, dass mehrere Teams bereits in diese Richtung arbeiten. Zum Beispiel die Entwickler von 'Fish in a Barrel' haben vorbereitet ein Werkzeug zur Erstellung von Ladbaren Modulen für den Linux-Kernel in Rust, indem ein Satz abstrakter Schichten über den Schnittstellen und Strukturen des Kernels verwendet wird, um die Sicherheit zu erhöhen. Die Schichten werden automatisch auf der Grundlage vorhandener Kernel-Header-Dateien mit dem Tool bindgengeneriert. Für den Bau der Schichten wird Clang verwendet. Die gebauten Module nutzen neben den Schichten das Paket staticlib.

Gleichzeitig entwickelt sich Ein weiteres Projekt, das sich auf die Entwicklung von Treibern für eingebettete Systeme und das Internet der Dinge konzentriert, das ebenfalls bindgen verwendet, um Schichten basierend auf den Header-Dateien des Kernels zu generieren. Das Framework ermöglicht eine Erhöhung der Sicherheit der Treiber, ohne Änderungen am Kernel vorzunehmen – anstatt zusätzliche Isolationsebenen für Treiber im Kernel zu schaffen, wird vorgeschlagen, Probleme bereits während des Kompilierungsprozesses zu blockieren, indem eine sicherere Sprache wie Rust angewendet wird. Es wird angenommen, dass dieser Ansatz von Hardwareherstellern nachgefragt werden könnte, die proprietäre Treiber hastig ohne angemessenen Audit entwickeln.

Nicht alle geplanten Funktionen sind bisher umgesetzt, aber das Framework ist bereits vollständig einsatzbereit und wurde zur Erstellung eines funktionierenden Treibers für den Ethernet-Controller LAN9512 USB, der auf der Raspberry Pi 3-Platine verbaut ist, verwendet. Bei der Entwicklung des Rust-Treibers wurde der vorhandene Treiber smsc95xx, der in C geschrieben ist, als Referenzimplementierung verwendet. Es wird festgestellt, dass die Modulgröße und die Overheadkosten der Runtime-Komponenten bei der Entwicklung eines Treibers in Rust gering sind, was es ermöglicht, das Framework für ressourcenbeschränkte Geräte zu verwenden.

Quelle: opennet.ru

60GB SSD 8Gb DDR4