Die Google Company hat den Chrome-Browser auf die Skrifa-Bibliothek umgestellt, die in der Programmiersprache Rust geschrieben ist und Funktionen zur Verarbeitung von Schriftarten im OpenType-Format bietet. Skrifa implementiert eine Teilmenge der Funktionen der FreeType-Schriftmotorbibliothek, die für die 2D-Bibliothek Skia erforderlich ist, die in Chrome und Chromium verwendet wird. Um die Skia-Bibliothek von der Abhängigkeit zum FreeType-Motor zu befreien, wurde ein neuer Schriftarten-Backend basierend auf Skrifa geschaffen.
In Chrome 128 wurde der in Rust geschriebene Backend experimentell für selten verwendete Schriftartenformate wie CFF2 und farbige Schriften aktiviert. Ab der Version Chrome 133 wird der neue Backend für alle Webschriften in den Builds für die Plattformen Linux, Android und ChromeOS verwendet. Auf den Plattformen Windows und macOS wird der neue Motor bisher nur als Fallback verwendet und kommt zum Einsatz, wenn das System das Schriftartenformat nicht unterstützt, das der Browser anzuzeigen versucht.
Der Skrifa-Code wurde von Ingenieuren bei Google im Rahmen des Fontations-Toolkits entwickelt und steht unter den MIT- und Apache 2.0-Lizenzen. Um die Funktionalität von Skrifa zu überprüfen, wurden etwa 700 Unit-Tests vorbereitet. Die Bibliothek unterstützt die Decodierung von Glyphen in den Formaten glyf, CFF, CFF2, COLRv0, COLRv1, EBDT, CBDT und sbix, variative Schriftarten in den Formaten glyf, CFF2 und COLRv1 sowie das Hinting von Schriftarten in den Formaten glyf, CFF und CFF2.
Neben der Skrifa-Bibliothek, die eine API für den Zugriff auf Schriftmetadaten und das Herunterladen von Glyphen-Umrissen bereitstellt, umfasst das Fontations-Toolkit niedrigstufige Bibliotheken zum Lesen, Parsen, Modifizieren und Erstellen von Schriftartdaten im OpenType-Format. Fontations wiederum ist Teil des Oxidize-Projekts, das entwickelt wurde, um Tools und Bibliotheken zur Arbeit mit Text und Schriftarten von Komponenten in Python (fonttools, fontmake, nanoemoji) und C++ (HarfBuzz, FreeType) in neue, in Rust geschriebene Implementierungen zu übertragen.
Die Entwicklung von Komponenten in Rust begann aufgrund der unzureichenden Effizienz bei der Fehlererkennung durch Fuzzing-Tests, da die Schriftartenformate zu komplex sind, um alle möglichen Kombinationen abzudecken. Zum Beispiel wurde letzte Woche eine kritische Sicherheitsanfälligkeit in FreeType entdeckt, die die Ausführung von Code bei der Verarbeitung speziell gestalteter Schriftarten durch Bufferüberlauf ermöglicht. Neben der FreeType-Engine können auch die verwendeten Abhängigkeiten wie bzip2, libpng und zlib Sicherheitsprobleme verursachen.
Die Verwendung von Rust hat die Wahrscheinlichkeit von Speicherproblemen erheblich verringert, die Codequalität verbessert, den Zeitaufwand für die Behebung von Sicherheitsproblemen reduziert und die Implementierung von Verbesserungen in den Chrome-Funktionalitäten im Zusammenhang mit Schriftarten beschleunigt. Laut Statistiken von Google und Microsoft sind etwa 70 % der gefährlichen Sicherheitsanfälligkeiten auf Speicherprobleme zurückzuführen, die durch die Verwendung von Rust ohne unsafe-Blöcke vermieden werden können.
Die Verwendung von Rust hätte frühere Probleme im FreeType-Code vermeiden können, die mit dem Zugriff auf freigegebene Speicherbereiche, Bufferüberläufen, dem Zugriff auf Arrays ohne Indexprüfung, ganzzahligen Überläufen, unsachgemäßer Verwendung von nicht initialisierten Speicherbereichen und Typumwandlungsfehlern zusammenhängen.
Quelle: opennet.ru
