In der Standardbibliothek der Programmiersprache Rust wurde eine Schwachstelle (CVE-2022-21658) entdeckt, die mit einem Race Condition in der Funktion std::fs::remove_dir_all() zusammenhängt. Wenn diese Funktion verwendet wird, um temporäre Dateien in einer privilegierten Anwendung zu löschen, kann ein Angreifer möglicherweise beliebige Systemdateien und -verzeichnisse löschen, auf die er normalerweise keinen Zugang hat.
Die Schwachstelle 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 verhindern, überprüft die Funktion remove_dir_all() zunächst, ob die Datei ein symbolischer Link ist. Wenn dies der Fall ist, wird sie wie eine Datei gelöscht, und wenn es sich um ein Verzeichnis handelt, wird der rekursive Löschvorgang des Inhalts gestartet. Das Problem besteht darin, dass zwischen der Überprüfung und dem Beginn des Löschvorgangs eine kurze Verzögerung auftritt.
Wenn die Überprüfung abgeschlossen ist, aber der Prozess zum Entfernen von Verzeichnissen noch nicht begonnen hat, kann der Angreifer das Verzeichnis mit temporären Dateien durch einen symbolischen Link ersetzen. Wenn dies zum richtigen Zeitpunkt 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 abhängt und es unwahrscheinlich ist, beim ersten Versuch den richtigen Moment zu treffen, gelang es den Forschern in ihren Experimenten, einen wiederholbaren erfolgreichen Angriff innerhalb weniger Sekunden nach der Ausführung des Exploits zu erreichen.
Alle Versionen von Rust von 1.0.0 bis 1.58.0 sind anfällig für Schwachstellen. Das Problem wurde vorübergehend durch einen Patch behoben (die Korrektur wird in Version 1.58.1 enthalten sein, die innerhalb weniger Stunden erwartet wird). Die Behebung der Schwachstelle in den Distributionen kann auf folgenden Seiten nachverfolgt werden: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch, FreeBSD. Allen Benutzern von Anwendungen, die in der Programmiersprache Rust mit erhöhten Rechten und der Funktion remove_dir_all ausgeführt werden, wird dringend geraten, Rust auf Version 1.58.1 zu aktualisieren. Interessanterweise löst der veröffentlichte Patch das Problem nicht auf allen Systemen, zum Beispiel wird die Schwachstelle auf REDOX OS und in macOS-Versionen vor 10.10 (Yosemite) nicht blockiert, da das O_NOFOLLOW-Flag zum Deaktivieren des Folgens von symbolischen Links fehlt.
Quelle: opennet.ru
