Technik

Sichere Software wächst an den Grenzen des alten Codes

Rust kann neue Fehlerklassen begrenzen. Bei großen bestehenden Programmen entscheidet aber vor allem, wo sichere und alte Komponenten aufeinandertreffen.

Von Wolfgang

06. Okt. 20267 Min. Lesezeit

Alte und neue abstrakte Softwarebausteine treffen an einer sorgfältig konstruierten Verbindung aufeinander; realer Server im Hintergrund, keine lesbaren Codezeichen oder Logos.

Ein Programm mit Millionen Zeilen wird nicht über Nacht sicherer, indem man eine andere Sprache in seinen Bauplan schreibt. Trotzdem kann ein kleiner neuer Bestandteil einen sinnvollen Anfang bilden. Der entscheidende Punkt ist seine Grenze zum vorhandenen Code: Welche Daten erhält er, welche Regeln gelten innerhalb der Komponente und welche Risiken bleiben außerhalb bestehen?

Der aktuelle Vorschlag, Rust zunächst optional für einen Teil von CPython einzusetzen, macht diese Frage greifbar. Es geht um einen begrenzten Einstieg bei der Kompressionsbibliothek zlib-rs. Die Python-Laufzeit soll dadurch nicht vollständig neu geschrieben werden. Der Vorschlag ist zudem noch keine abschließend beschlossene Einführung. Python Software Foundation

Zusammen mit älteren Empfehlungen der NSA und Erfahrungen aus Android ergibt sich ein nachvollziehbarer Ansatz: Neue Komponenten lassen sich mit strengeren Regeln entwickeln, während bestehende Software schrittweise weiter gepflegt wird. Der Ansatz verbindet neue Entwicklung mit der Pflege des Bestands. Welche Sicherheitswirkung daraus entsteht, hängt von der konkreten Aufgabe und ihren Übergängen ab.

Warum Speicherfehler so unangenehm sind

Ein Programm muss wissen, wo seine Daten liegen und wie lange sie gültig bleiben. In einer Sprache mit weitreichender manueller Speicherverwaltung trägt der Code dafür viel Verantwortung. Ein Fehler kann beispielsweise dazu führen, dass ein Programm auf Daten zugreift, deren Lebensdauer bereits beendet ist. Das ist etwas anderes als eine falsche Berechnung mit ansonsten korrekt verwalteten Daten.

Der sichere Übergang ist Teil der Arbeit: Schema: Sichere neue Bausteine ersetzen keine Prüfung des Gesamtsystems.
Schema: Sichere neue Bausteine ersetzen keine Prüfung des Gesamtsystems. Grafik: TechZeitGeist.

Rust stellt für gewöhnlichen sicheren Code Regeln bereit, die viele dieser Beziehungen schon beim Übersetzen prüfen. Das Ownership-Modell ordnet Werte einem Besitzer zu und beschreibt, wann ihre Lebensdauer endet. Die Rust-Dokumentation erklärt dieses Prinzip als Grundlage ihrer Speicherverwaltung. Rust Project

Für einen Leser ohne Programmiererfahrung hilft ein Lagerhaus als Bild. Es genügt nicht, dass jede Kiste eine Nummer hat. Es muss auch klar sein, wer sie benutzen darf und ob sie noch an ihrem Platz steht. Eine strengere Verwaltung kann bestimmte Verwechslungen früh verhindern. Sie garantiert aber nicht, dass in der Kiste der richtige Inhalt liegt oder dass die gesamte Organisation sinnvoll arbeitet.

Darin liegt die Reichweite speichersicherer Sprachen. Sie können bestimmte Fehlerklassen begrenzen. Eine falsche Zugriffsentscheidung, ein schlecht gewähltes Protokoll oder eine unzutreffende Berechnung bleibt weiterhin möglich. Sicherheit besteht aus mehr als der korrekten Lebensdauer von Daten.

Der ältere Bestand verschwindet nicht

Die NSA empfahl bereits 2022, beim Schutz vor Speicherproblemen speichersichere Sprachen und weitere Maßnahmen zu betrachten. Das war eine Sicherheitsorientierung, keine Anweisung, jede bestehende Anwendung sofort vollständig neu zu schreiben. NSA

Ein vollständiger Ersatz hat eigene Risiken. In alter Software stecken bekannte Sonderfälle, Anpassungen und Erfahrungen. Eine neue Implementierung muss nicht nur die beabsichtigte Funktion nachbilden. Sie muss sich auch mit den tatsächlich verwendeten Schnittstellen und Daten vertragen. Dabei können andere Fehler entstehen als diejenigen, die man beseitigen möchte.

Das macht eine schrittweise Strategie plausibel. Ein Projekt kann bei einem neuen oder klar abgegrenzten Bestandteil beginnen. Alte und neue Komponenten arbeiten dann zunächst zusammen. Die sicherere Sprache ersetzt nicht automatisch die Regeln des übrigen Programms. Sie schafft einen Bereich, in dem zusätzliche Prüfmechanismen gelten.

Der Begriff „schrittweise“ darf allerdings nicht zur Ausrede für unklare Zuständigkeiten werden. Eine neue Komponente braucht einen definierten Eingang und Ausgang. Sonst bleibt offen, welche Annahmen der alte Code erfüllen muss und welche Zusicherungen der neue Code tatsächlich liefert. Die Grenze wird zum technischen Vertrag.

Android zeigt eine Strategie, keine einfache Ursache

Google beschreibt in seiner Sicherheitsanalyse von 2024, wie Android neue Entwicklung stärker auf speichersicheren Code ausrichtete und gleichzeitig vorhandenen Code weiter absicherte. Die berichtete Entwicklung der Sicherheitslücken gehört zu diesem konkreten System und seiner parallelen Sicherheitsarbeit. Sie lässt sich nicht als isolierter Effekt einer einzigen Sprache lesen. Google Security Blog

Der interessante Mechanismus ist die unterschiedliche Behandlung von neuem und altem Code. Neuer Code besitzt noch nicht denselben Erfahrungsstand wie lange verwendete Komponenten. Wenn hier strengere Sprachregeln gelten, kann das einen anderen Ausgangspunkt schaffen. Für den Bestand bleiben Prüfung, Fehlerbehebung und Schutzmaßnahmen erforderlich.

Das ist eine brauchbare Gegenposition zur Vorstellung, ausschließlich eine große Neuschreibung könne Fortschritt bringen. Es ist zugleich eine Gegenposition zur Vorstellung, alter Code werde durch sein Alter automatisch ungefährlich. Erprobung kann Wissen liefern; sie hebt vorhandene Schwachstellen nicht auf.

Als Leser sollte man bei Erfolgsmeldungen deshalb nach dem betrachteten Ausschnitt fragen. Geht es um neue Komponenten, die gesamte Plattform oder gemeldete Sicherheitslücken eines bestimmten Jahres? Eine Entwicklung ist erst verständlich, wenn ihr Bezugspunkt klar bleibt.

Warum CPython bei einer begrenzten Aufgabe beginnen könnte

Der Bericht vom Python Language Summit beschreibt einen optionalen Rust-Einstieg über zlib-rs. Als frühester vorgeschlagener Schritt wird Python 3.16 genannt; eine weitergehende verpflichtende Nutzung liegt im vorgeschlagenen Zeitplan erheblich später. Der Bericht behandelt auch Voraussetzungen und Bedenken. Die abschließende Entscheidung steht noch aus. Python Software Foundation

Die Wahl einer begrenzten Kompressionskomponente macht das Thema anschaulich. Komprimierte Daten werden entgegengenommen und verarbeitet. Eine solche Aufgabe lässt sich gedanklich besser abgrenzen als die gesamte Sprachlaufzeit. Ob die konkrete Integration funktioniert, muss dennoch anhand ihrer Schnittstellen, unterstützten Plattformen und Tests beurteilt werden.

Der Vorteil eines optionalen Einstiegs liegt in der Lernmöglichkeit. Das Projekt kann untersuchen, was sich beim Bau und Betrieb verändert. Gleichzeitig entstehen neue Anforderungen: Ein zusätzliches Werkzeug muss verfügbar sein, Abhängigkeiten müssen kontrolliert und weniger verbreitete Plattformen berücksichtigt werden. Diese Arbeit gehört zum Sicherheitsansatz selbst.

Eine Sprache kann strenge Regeln für ihren eigenen Code bieten und dennoch in ein System eingebaut werden, das an anderer Stelle andere Annahmen verwendet. Genau deshalb ist der Übergang so wichtig. Die Frage „Ist die neue Funktion in Rust geschrieben?“ ist nur der Anfang der Bewertung.

Die Gegenargumente sind Teil des Entwurfs

Ein Team muss die neue Sprache beherrschen und ihre Werkzeuge pflegen. Wenn diese Verantwortung nicht eingeplant wird, entsteht eine zusätzliche Komponente, deren Vorteile schwer nutzbar sind. Auch ein sorgfältiger Entwurf kann an einer Plattform scheitern, die einen benötigten Werkzeugstand nicht unterstützt.

Ebenso wenig garantiert eine neue Kompressionsbibliothek korrektes Verhalten bei jedem denkbaren Datenformat und jeder Kombination von Aufrufparametern. Funktionale Tests und die Prüfung unerwarteter Eingaben bleiben notwendig. Die Sprachregeln entlasten einen Teil der Arbeit; sie ersetzen das Verständnis der Aufgabe nicht.

Damit wird eine realistische Sicherheitsentscheidung konkreter. Ein Projekt sollte wissen, welche Fehlerklasse es begrenzen möchte, welcher Teil dafür geändert wird und welche neuen betrieblichen Pflichten entstehen. Eine pauschale Aussage über eine vermeintlich sichere Sprache reicht dafür nicht aus.

Diese Grenze lässt sich auch an einer organisatorischen Frage erkennen: Wer ist für eine falsch formatierte Eingabe zuständig? Ein neuer Baustein darf nicht stillschweigend voraussetzen, dass der alte Teil bereits jede mögliche Eingabe geprüft hat. Ein klarer Vertrag macht solche Annahmen sichtbar. Damit verbessert sich nicht nur die Sprachwahl, sondern auch die Verständlichkeit des Gesamtsystems.

Ein kleinerer Umbau kann eine klare Wirkung haben

Die drei zeitlich getrennten Quellen zeigen einen wiederkehrenden Gedanken aus unterschiedlichen Perspektiven: eine Sicherheitsbehörde formuliert die Orientierung, ein Plattformbetreiber beschreibt seine Strategie, und ein anderes großes Projekt diskutiert einen möglichen Einstieg. Daraus lässt sich eine begrenzte These ableiten. Bei umfangreicher bestehender Software entsteht Fortschritt häufig an gut kontrollierten Übergängen.

Für die Bewertung künftiger Ankündigungen lohnt daher eine einfache Frage: Welcher neue Bereich bekommt welche überprüfbaren Regeln? Das ist genauer als „Das Programm wird jetzt sicher“. Es lässt sich auch besser mit Ergebnissen vergleichen. Erst wenn die konkrete Grenze und der erwartete Nutzen benannt sind, wird aus einer Sprachentscheidung ein nachvollziehbarer Sicherheitsbeitrag.

Quellen

Für diesen Artikel wurden KI-gestützte Recherche- und Editierwerkzeuge verwendet. Der Inhalt wurde redaktionell geprüft.