Künstliche Intelligenz
Microsoft zieht Bilanz: Windows-Treiberentwicklung mit Rust
Microsoft integriert Rust schrittweise in den Windows-Kernel und stellt auch die Windows-Treiber-Entwicklung schrittweise um. Microsoft zieht eine Zwischenbilanz.
Aufgrund der Komplexität der Windows-Kernel-API wird es zwar noch einige Zeit in Anspruch nehmen, bis der gesamte Rust-Designprozess abgeschlossen ist, so Microsoft in einem Blogpost des Surface-Entwicklerteams, der den aktuellen Stand der Windows-Treiberprogrammierung mit Rust zusammenfasst. Dranbleiben will die Firma aber auf jeden Fall, denn für Microsoft stellen speichersichere Sprachen wie Rust die Zukunft der sicheren Softwareentwicklung dar. Auch deshalb, weil die Sicherheitslandschaft Zuverlässigkeit und Sicherheitsgarantien auf jeder Ebene erfordere.
Gegenwärtig können Rust-Programmiererinnen und -Programmierer, die das von Microsoft bereitgestellte GitHub-Repository des Rust-Projekts (windows-drivers-rs) importieren, dieselben Bibliotheken und Header im Windows Driver Kit (WDK) nutzen wie C-Entwickler. Außerdem haben sie damit Zugriff auf alle Device Driver Interfaces (DDI), die es zum Erstellen eines Windows-Treibers im User- und Kernel-Mode braucht. Mit dem Tool cargo-wdk soll beides nun komfortabler funktionieren.
Visual Studio als Vorbild: cargo-wdk für Rust
In Microsoft Visual Studio stehen verschiedene Vorlagen bereit, um Windows-Treiber in C zu schreiben. Um die Entwicklung mit Rust ähnlich einfach zu machen, hat Microsoft jetzt die Cargo-Erweiterung cargo-wdk vorgestellt. Mit ihr lassen sich leere Treiberprojekte anlegen, die bereits alle erforderlichen Verknüpfungen, Build-Schritte und Abhängigkeiten mitbringen. Zudem kann cargo-wdk – ähnlich wie bei der Erstellung eines Treibers in C in Visual Studio – WDK-Tools wie InfVerif aufrufen.
Die Cargo-Erweiterung cargo-wdk im Einsatz.
(Bild: Microsoft)
Wie cargo-wdk funktioniert, demonstriert Microsoft an einem Beispiel. Darin erstellen Entwicker mit cargo wdk new –kmdf
eine KMDF-Treibervorlage. Mit Eingabe von cargo wdk build
lässt cargo-wdk dann das InfVerif-Tool über die INF-Datei des Treibers laufen und zeigt dabei ähnlich wie in Visual Studio alle gefundenen Fehler an. Im Beispiel wird die INF-Datei schließlich korrigiert, cargo-wdk erneut ausgeführt und so sichergestellt, dass der Treiber mit den entsprechenden Zertifikaten versehen ist.
Mittelfristig will das Team cargo-wdk um Features wie automatische WDK-Installationen, die Unterstützung für NT_TARGET_VERSION, zusätzliche Treibervorlagen und eine volle ARM64-Unterstützung ergänzen. Langfristig plant Microsoft, Programmiererinnen und Programmierern in einer Cargo-Umgebung Zugriff auf dieselben Build-Tools und Konfigurationsoptionen zu bieten wie in Visual Studio.
Neben cargo-wdk enthält das Repo noch folgende Crates:
- wdk-build: Eine Bibliothek zum Konfigurieren eines Cargo-Build-Skripts, das Downstream-Linking des WDK durchführt und Rust-Bindings generiert.
- wdk-sys: Direkte FFI-Bindings zu APIs im WDK verfügbar sind.
- wdk: Sichere idiomatische Bindings zu APIs, die im WDK verfügbar sind.
- wdk-panic: Standardimplementierung von Panic-Handlern für mit dem WDK erstellte Programme
- wdk-alloc: Ein globaler Allocator für die Treiber.
- wdk-macros: Eine Sammlung von Makros, die die Interaktion mit den direkten Bindings von wdk-sys erleichtern.
Von unsicherem Rust zu sicherem Rust
Derzeit umfasst windows-drivers-rs zwar alle Bausteine, um Rust-Treiber für Windows zu programmieren, allerdings sind immer noch erhebliche Mengen an unsafe Rust-Code nötig. Auch unsicheres Rust bietet laut Blog Vorteile, wie starke eine Typprüfung, Zero Cost Abstractions und eine gute Kompatibilität durch das Foreign Function Interface (FFI). Auf lange Sicht soll es Entwicklern aber möglich sein, den Großteil eines Windows-Treibers sicher zu schreiben.
Dazu will Microsoft das Typsystem und den Borrow-Checker von Rust nutzen, um bestimmte Arten von Fehlern zu verhindern, die sich bisher nur durch zusätzliche statische Analysen erkennen lassen. Zudem soll der Umfang des Repositorys kontinuierlich weiter ausgebaut werden. Außerdem soll es sichere Abstraktionen für Kernel-Mode-Strukturen und DDIs geben, um die Anzahl der benötigten unsicheren Codeblöcke zu reduzieren und die Sicherheit schon während der Kompilierzeit zu erhöhen.
Neben dem Surface-Team sind auch andere Abteilungen bei Microsoft damit beschäftigt, sichere Strukturen und APIs zu entwickeln. Diese gehen über das Windows Driver Framework (WDF) hinaus und lassen sich sowohl in der Kernel-Entwicklung von Windows als auch von Drittanbietern in der Treiberentwicklung einsetzen. Einige dieser Arbeiten sind bereits heute im Windows-Kernel enthalten.
(who)