Die Entwickler des Chromium-Projekts 912 gefÀhrliche und kritische Schwachstellen wurden in stabilen Versionen von Chrome seit 2015 identifiziert. Es wurde festgestellt, dass 70% davon durch unsicheren Umgang mit dem Speicher (Pointer-Fehler im C/C++-Code) verursacht wurden. Die HÀlfte dieser Probleme (36,1%) entstand durch Zugriffe auf einen Puffer nach der Freigabe des zugehörigen Speichers (Use-after-free).
Bei der Entwicklung von Chromium wurde ursprĂŒnglich , dass im Code Fehler nicht ausgeschlossen sind. Daher wurde stark auf den Einsatz von Sandbox-Isolierung gesetzt, um die Auswirkungen von Schwachstellen zu begrenzen. Mittlerweile haben die Möglichkeiten zur Anwendung dieser Technologie ihre Grenzen erreicht, und eine weitere Zerlegung in Prozesse ist aus Ressourcensicht wenig sinnvoll.
Zur UnterstĂŒtzung der Sicherheit des Codesystems verwendet Google auch die "», wonach jeder hinzugefĂŒgte Code nicht mehr als unter zwei von drei Bedingungen fallen darf: Umgang mit nicht validierten Eingaben, Verwendung einer unsicheren Programmiersprache (C/C++) und AusfĂŒhrung mit erhöhten Rechten. Daraus folgt, dass Code zur Verarbeitung externer Daten entweder auf minimale Rechte (isoliert) beschrĂ€nkt oder in einer sicheren Programmiersprache geschrieben sein muss.
Um die Sicherheit des Codes weiter zu erhöhen, wurde ein Projekt zur Vermeidung von Speicherfehlern im Code gestartet. Es werden drei HauptansĂ€tze verfolgt: Erstellung von C++-Bibliotheken mit Funktionen fĂŒr einen sicheren Umgang mit Speicher, Erweiterung des Anwendungsbereichs von Garbage Collectors, Anwendung von Hardware-Schutzmechanismen (Memory Tagging Extension) und das Schreiben von Komponenten in Sprachen, die einen sicheren Umgang mit Speicher gewĂ€hrleisten (Java, Kotlin, JavaScript, Rust, Swift).
Es wird erwartet, dass die Arbeit in zwei Richtungen fokussiert wird:
- Eine signifikante VerĂ€nderung im C++-Entwicklungsprozess, die möglicherweise negative Auswirkungen auf die Leistung hat (zusĂ€tzliche GrenzĂŒberprĂŒfungen und Garbage Collection). Anstelle von raw-Pointern wird empfohlen, im Code den Typ , der es ermöglicht, exploitable use-after-free-Fehler in nicht sicherheitsrelevante AbstĂŒrze zu verwandeln, ohne spĂŒrbare negative Auswirkungen auf die Leistung, den Speicherverbrauch und die StabilitĂ€t.
- Die Verwendung von Sprachen, die fĂŒr die DurchfĂŒhrung geschĂŒtzter SpeicherĂŒberprĂŒfungen zur Kompilierzeit ausgelegt sind (das wird negative Auswirkungen auf die Leistung vermeiden, die mit solchen ĂberprĂŒfungen zur Laufzeit des Codes verbunden sind, fĂŒhrt jedoch zu zusĂ€tzlichen Kosten fĂŒr die Integration von Code in der neuen Sprache mit C++).
Die Verwendung von Bibliotheken fĂŒr einen sicheren Umgang mit Speicher ist der einfachste, aber auch weniger effektive Weg. Die Neuschreibung des Codes in Rust wird als der effizienteste, jedoch auch sehr kostspielige Weg angesehen.
Quelle: opennet.ru
