Vorgeschichte
Die Programmiersprache C ist seit fast einem halben Jahrhundert die bevorzugte Sprache für die Entwicklung von Betriebssystemen, da sie das Mass an Kontrolle und vorhersehbarer Leistung bietet, das für eine so wichtige Komponente erforderlich ist.
Das Problem: C und auch C++ erlauben fast beliebige Manipulation von Speicher und Pointern, was sehr schnell gefährlich werden kann. Beispielsweise wird bei der Veränderung eines Pointers (Variable, die eine Speicheradresse einer anderen Variablen speichert), keine Prüfung vorgenommen, ob diese gültig oder überhaupt noch in Verwendung ist. Wenn das Programm in jedem Fall von einer gültigen Adresse ausgeht, kann dies zu unvorhersehbarem Fehlverhalten führen. Die Programmiersprachen C und C++ sind aus diesem Grund potenziell speicherunsicher.
Und so überrascht es nicht ganz, dass Microsoft im Jahr 2019 zugegeben hat, dass 70 % ihrer CVE’s (Common Vulnerabilities and Exposures) durch Fehler von Entwicklern bei der Speicherverwendung in ihrem C- und C++-Code verursacht wurden.
Die neuere Programmiersprache Rust, welche ab 2006 durch Graydon Hoare bei Mozilla entwickelt wurde, verunmöglicht viele dieser Fehler indem bei der Kompilierung eines Rust-Programms die Einhaltung diverser Regeln geprüft wird. Werden diese Regeln nicht eingehalten, erzeugt der Rust-Compiler (rustc) eine detaillierte Fehlermeldung. Durch diese strikte Prüfung des Compilers können viele Probleme, welche in Programmiersprachen wie C und C++ normalerweise erst bei Laufzeit auftreten, bereits bei der Kompilierung abgefangen und korrigiert werden. Ein weiterer Vorteil von Rust ist seine Geschwindigkeit. Diese ist nur minimal schlechter als C und quasi gleichauf mit C++.
Rust im Windows Kernel
Die Vorzüge von Rust liegen auf der Hand und auch das Linux-Team um Linus Torvalds sah bereits länger grosses Potenzial in Rust, denn seit Ende 2022 mit Linux Version 6.1 unterstützt der Linux-Kernel offiziell Rust.
Auch Microsoft ist wenig später auf den Geschmack gekommen und hat Rust ausgiebig getestet und zwei Windows-Komponenten in Rust umgeschrieben. Unter anderem «dwrite», ein font-parser, der für seine Vielzahl an Sicherheitslücken schon fast einen gewissen Bekanntheitsgrad erlangt hat, ist nun komplett in Rust geschrieben.
Diese «Tests» scheinen erfolgreich gewesen zu sein, denn zur Zeit der Verfassung dieses Blogs sind jetzt bereits die ersten Windows-Kernel Komponenten in Rust umgeschrieben worden. In einem aktuellen Windows 11 Insider Build finden sich die ersten Systemdateien mit dem Suffix «_rs» vor der Dateiendung, welche indizieren, dass es sich dabei um Komponenten handelt, die in Rust geschrieben sind.
Ausblick
Es ist höchst unwahrscheinlich, dass der gesamte Windows-Kernel in naher Zukunft in Rust umgeschrieben wird. Ein Betriebssystem-Kernel besteht aus mehreren Millionen Zeilen Code und der Aufwand all dies zu portieren, ist entsprechend enorm. Dennoch hat Microsoft nun die technische Grundlage geschaffen, damit künftige Komponenten in Rust entwickelt werden können, so dass unter dem Strich die Sicherheit von Windows stetig und nachhaltig verbessert werden kann.
Quellen:
- https://www.malwarebytes.com/blog/news/2023/05/microsoft-introduces-rust-into-kernel-in-windows-11
- https://msrc.microsoft.com/blog/2019/07/a-proactive-approach-to-more-secure-code/
- https://lkml.org/lkml/2022/12/11/206
- https://twitter.com/markrussinovich/status/1656416376125538304
- https://www.youtube.com/watch?v=8T6ClX-y2AE&t=3149s
- https://twitter.com/dwizzzleMSFT/status/1578532292662005760
- https://googleprojectzero.github.io/0days-in-the-wild/0day-RCAs/2020/CVE-2020-0938.html