In der Standardbibliothek der Sprache Rust wurde eine Sicherheitsanfälligkeit (CVE-2022-21658) festgestellt, die mit einem Zeitrace-Zustand in der Funktion std::fs::remove_dir_all() zusammenhängt. Wenn diese Funktion zum Entfernen temporärer Dateien in einer privilegierten Anwendung verwendet wird, kann ein Angreifer erreichen, dass beliebige Systemdateien und -verzeichnisse gelöscht werden, auf die der Angreifer unter normalen Bedingungen keinen Zugriff hat.
Die Sicherheitsanfälligkeit wird durch eine fehlerhafte Implementierung der Überprüfung von symbolischen Links vor dem rekursiven Löschen von Verzeichnissen verursacht. Anstatt das Folgen von symbolischen Links zu verbieten, überprüft die Funktion remove_dir_all() zunächst, ob die Datei ein symbolischer Link ist. Wenn ein Link festgestellt wird, wird er als Datei gelöscht, und wenn es sich um ein Verzeichnis handelt, wird die Operation zum rekursiven Löschen des Inhalts aufgerufen. Das Problem besteht darin, dass zwischen der Überprüfung und dem Beginn der Löschoperation eine kurze Verzögerung besteht.
In dem Moment, in dem die Überprüfung bereits durchgeführt wurde, die Operation zum Durchlaufen von Verzeichnissen zum Löschen jedoch noch nicht begonnen hat, kann der Angreifer das Verzeichnis mit temporären Dateien durch einen symbolischen Link ersetzen. Wenn dies zur rechten Zeit geschieht, behandelt die Funktion remove_dir_all() den symbolischen Link als Verzeichnis und beginnt mit dem Löschen des Inhalts, auf den dieser Link verweist. Obwohl der Erfolg des Angriffs von der Genauigkeit des gewählten Zeitpunkts für den Austausch des Verzeichnisses abhängt und es unwahrscheinlich ist, beim ersten Mal den richtigen Zeitpunkt zu treffen, gelang es den Forschern in Experimenten, nach der Ausführung des Exploits innerhalb weniger Sekunden wiederholt erfolgreich zu attackieren.
Alle Versionen von Rust, von 1.0.0 bis 1.58.0 einschließlich, sind anfällig für Sicherheitsanfälligkeiten. Das Problem wurde vorübergehend durch einen Patch behoben (die Korrektur wird in Version 1.58.1 enthalten sein, die in den nächsten Stunden erwartet wird). Die Beseitigung der Sicherheitsanfälligkeiten in den Distributionen kann auf den folgenden Seiten verfolgt werden: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Allen Nutzern von Programmen in Rust, die mit erhöhten Rechten ausgeführt werden und die Funktion remove_dir_all verwenden, wird dringend empfohlen, Rust auf Version 1.58.1 zu aktualisieren. Interessanterweise behebt der veröffentlichte Patch das Problem nicht auf allen Systemen, beispielsweise wird in REDOX und in macOS-Versionen vor 10.10 (Yosemite) die Sicherheitsanfälligkeit aufgrund des Fehlens des Flags O_NOFOLLOW, das das Folgen von symbolischen Links deaktiviert, nicht blockiert.
Quelle: opennet.ru
