Analysemethoden

Code-Injektion in Embedded-Systemen gezielt verhindern

< zurück

Seite: 3/4

Anbieter zum Thema

Zu bedenken ist auch Folgendes: Sind tatsächlich weniger Argumente der Funktion vorhanden als Formatspezifikatoren, dann interpretiert "printf" einfach alles, was auf dem Stack liegt, als Argumente; kann also der Angreifer den Format-String kontrollieren, kann er im Grunde genommen beliebige Werte an Stackpositionen schreiben. Der Stack befindet sich dort, wo die lokalen Variablen abgelegt sind, ihre Werte lassen sich somit ändern.

Sind einige dieser Variablen Zeiger, dann bietet dies dem Angreifer eine Plattform, über die er andere, nicht zum Stack gehörende Adressen im Speicher erreichen kann. Die wirklich interessanten Ziele sind diejenigen, über die der Angreifer die Kontrolle über die Ausführung des Programms erlangt.

Ist eine dieser lokalen Variablen ein Funktionszeiger, dann können nachfolgende Aufrufe über diesen Zeiger zu einem Code nach Wahl des Angreifers erfolgen. Oder der Angriff kann die Adresse der Anweisung überschreiben, wohin die Kontrolle übertragen wird, nachdem die Funktion an ihren Ausgangspunkt zurückgekehrt ist.

Die beste Möglichkeit, Code-Einschleusung zu vermeiden, ist deren Ausschluss auf Design-Ebene. Idealerweise verwendet man eine Programmiersprache, in der diese Schwachstellen niemals auftreten können, denn dann ist der Code konstruktionsbedingt dagegen immun. Oder das Design des Codes muss Schnittstellen verbieten, die zu Problemen dieser Art führen können.

Leider bieten Embedded-Systeme oft gar keine solchen Wahlmöglichkeiten. Obwohl C eine hochgefährliche Sprache und mit Schwachstellen wie diesen durchsetzt ist, bleibt sie für viele Unternehmen die Sprache der Wahl. Darum sollten Entwickler andere Vermeidungsstrategien kennen. Zwei goldene Regeln sollten befolgt werden, um Schwachstellen für Code-Injektion zu verhindern:

  • Daten nicht als Code interpretieren, wenn sich dies vermeiden lässt; und
  • wenn es unvermeidlich ist: Durch Prüfung sicherstellen, dass die Daten korrekt gebildet sind, bevor sie verwendet werden.

Um die Format-String-Schwachstelle zu verhindern, sollte man die erste dieser Regeln beachten. Der Code kann wie folgt geschrieben werden:

printf("%s", str);

Somit wird der Inhalt von str nur als Daten behandelt. Das ist leicht, solange alle Orte, an denen diese Änderung vorgenommen werden sollte, leicht auffindbar sind. Bei großen Programmen kann das jedoch knifflig sein, insbesondere wenn Bibliotheken mit Drittanbieter-Code zum Einsatz kommen.

Um die im obigen Beispiel gezeigte Injektion von SQL-Code zu vermeiden, kann eine nameString-Prüfung sicherstellen, dass es sich um ein einzelnes Wort ohne Leerzeichen und Strichpunkte handelt.

Artikelfiles und Artikellinks

(ID:43669401)

Jetzt Newsletter abonnieren

Verpassen Sie nicht unsere besten Inhalte

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung. Die Einwilligungserklärung bezieht sich u. a. auf die Zusendung von redaktionellen Newslettern per E-Mail und auf den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern (z. B. LinkedIn, Google, Meta).

Aufklappen für Details zu Ihrer Einwilligung