Entwicklung & Code

Rust Coreutils 0.9.0: weniger unsafe, mehr Tempo


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Die Entwickler von uutils/coreutils haben Version 0.9.0 ihrer in Rust geschriebenen Neuimplementierung der GNU Core Utilities veröffentlicht. Das Release bringt vor allem Sicherheitsverbesserungen nach einem externen Audit, weniger unsafe-Code und schnellere I/O-Pfade durch Zero-Copy-Verfahren. Zudem erweitert die neue Version die Unterstützung für WebAssembly, Windows und Cygwin.

Weiterlesen nach der Anzeige

uutils/coreutils setzt die klassischen GNU Core Utilities in Rust neu um. Das Projekt liefert zahlreiche Standardwerkzeuge von Unix- und Linux-Systemen, darunter ls, cp, mv, rm, cat und sort. Ziel ist eine möglichst hohe Kompatibilität zu den GNU-Pendants – bei gleichzeitig besserer Speichersicherheit und Wartbarkeit durch Rust.

Im Mittelpunkt des Releases stehen Sicherheitsverbesserungen, die auf ein Audit der Firma Zellic zurückgehen. Die Prüfer fanden vor allem TOCTOU-Schwachstellen (Time of Check, Time of Use) und Probleme bei Randfällen im Dateisystem. Bei TOCTOU-Lücken handelt es sich um Race Conditions: Der Zustand einer Datei kann sich zwischen einer Prüfung und ihrer tatsächlichen Verwendung ändern – und genau diese Lücke lässt sich ausnutzen.

Die Maintainer betonen, dass die dabei vergebenen 44 CVEs keine klassischen Speicherfehler beschreiben. Das Audit habe vielmehr Verhaltensunterschiede zu GNU Coreutils aufgedeckt, die in bestimmten Situationen sicherheitsrelevant werden können. Version 0.9.0 schließt nach Projektangaben einen Großteil dieser Befunde.

Dafür führt das Projekt ein neues Modul namens uucore::safe_copy ein, das Kopiervorgänge gegen TOCTOU-Angriffe absichert. Auch die rekursiven Operationen von cp, mv und chmod erhalten entsprechende Schutzmechanismen. rm geht robuster mit problematischen Pfadangaben wie . und .. um. nohup legt die Datei nohup.out nun mit den restriktiven Zugriffsrechten 0600 an. Und chroot löst Benutzer- und Gruppen-IDs bereits auf, bevor es in die neue Wurzelumgebung wechselt.

Parallel dazu reduziert das Team weiter den Anteil an unsafe-Code. Zahlreiche Stellen in Werkzeugen, Tests und gemeinsamen Bibliotheken kommen jetzt ohne unsichere Speicher- oder Systemzugriffe aus. In vielen Bereichen ersetzt das Projekt zudem die bisher genutzten Bibliotheken nix und libc durch rustix. Diese stellt Systemaufrufe über stärker typisierte Rust-Schnittstellen bereit und vermeidet so eine Reihe typischer Fehlerquellen. Die Umstellung betrifft unter anderem id, tr, timeout, sort, wc, tail, cp und who.

Weiterlesen nach der Anzeige

Für mehr Tempo sorgen neue Zero-Copy-Datenpfade unter Linux. Mehrere Werkzeuge nutzen jetzt verstärkt die Syscalls splice(), tee() und pipe(), um Daten direkt zwischen Kernel-Puffern zu übertragen. Da die Daten dabei nicht mehr durch den Adressraum des Prozesses wandern, sinken Speicherzugriffe und CPU-Last. Profitieren sollen unter anderem cat, wc, head, tail, cp, tee, yes und unexpand. Für unexpand nennen die Entwickler einen Geschwindigkeitsgewinn von rund 7,5 Prozent. Auch cp und tee arbeiten beim Verarbeiten von Pipe-Daten spürbar schneller.

An der GNU-Kompatibilität arbeitet das Projekt weiter intensiv. Als Referenz dient nun GNU Coreutils 9.11 statt 9.10. Die Zahl der fehlschlagenden Tests in der GNU-Testsuite steigt dadurch von 21 auf 56 – laut Projekt jedoch ohne Regressionen. Die Ursache liegt in 25 neuen Tests, die GNU der Suite hinzugefügt hat und die uutils noch nicht vollständig besteht. Weitere Kompatibilitätskorrekturen betreffen numfmt, date, tr, cksum, factor, head, stat und sort.

Besonders umfangreich fallen die Änderungen an numfmt aus. Das Werkzeug formatiert numerische Werte jetzt präziser, weist wissenschaftliche Notation zurück und beachtet die Locale-Einstellung LC_NUMERIC für das Dezimaltrennzeichen. Hinzu kommen Anpassungen bei Rundung, Vorzeichen und der Verarbeitung mehrbytiger Suffixe.

Auch ls erhält mehrere Korrekturen und Erweiterungen. Sie betreffen symbolische Links, die Versionssortierung und die rekursive Verzeichnisauflistung. Zudem haben die Entwickler den Code so umgebaut, dass andere Programme ls als Bibliothek einbinden können, ohne dessen Ausgabe zwingend auf die Standardausgabe umzuleiten. Als Beispiel nennt das Projekt die Shell Nushell.

Beim Plattformsupport legt Version 0.9.0 ebenfalls zu. Die Werkzeuge ln, dd, mktemp und tty laufen jetzt auch unter dem WebAssembly System Interface (WASI), das WebAssembly-Anwendungen außerhalb des Browsers standardisierten Zugriff auf Betriebssystemfunktionen erlaubt. Daneben verbessern die Entwickler die Unterstützung für Windows, MSYS2 und Cygwin und arbeiten weiter an der Portierung auf OpenBSD. Schließlich berücksichtigen jetzt auch numfmt und du regionale Einstellungen für das Dezimaltrennzeichen über LC_NUMERIC.

Alle Details zum Update finden sich in den Release Notes auf der GitHub-Projektseite.


(fo)



Source link

Beliebt

Die mobile Version verlassen