Analysemethoden

Code-Injektion in Embedded-Systemen gezielt verhindern

< zurück

Seite: 2/4

Anbieter zum Thema

Format-String-Schwachstellen und ihre Tücken

Fast alle C-Programmierer kennen die Funktionenfamilie printf. Einfach ausgedrückt, verwenden diese Funktionen einen Format-String, auf den eine Liste weiterer Argumente folgt, und dieser Format-String wird als Satz von Anweisungen für die Wiedergabe der übrigen Argumente als Zeichenketten interpretiert.

Die Sprache für die Festlegung des Formats ist relativ kompliziert und kann ganz schön knifflig sein. Die meisten Benutzer wissen, wie die gängigsten Formatspezifikatoren geschrieben werden, etwa diejenigen für Zeichenketten, Dezimal- und Gleitkommazahlen (%s, %d, %f), doch nur wenigen ist bekannt, dass es noch einige weitere Format-String-Anweisungen gibt, die sich übel missbrauchen lassen.

Vor der Erklärung, wie die Schachstelle für die Code-Einschleusung entstehen kann, hier noch ein Hinweis darauf, wie die Funktion „printf“ am häufigsten falsch angewendet wird. Leider haben manche Programmierer die Angewohnheit, Zeichenketten wie folgt auszugeben:

printf(str);

Auch wenn das in den meisten Fällen den gewünschten Effekt erzielt, ist es doch falsch, denn das erste Argument von "printf" wird als Format-String interpretiert. Daher werden, wenn "str" Formatspezifikatoren enthält, diese als solche ausgelegt. Enthält "str" beispielsweise "%d", interpretiert es den nächsten Wert in der Argumentliste von "printf" als ganze Zahl und wandelt ihn in eine Zeichenkette um.

In diesem Fall gibt es keine weiteren Argumente, doch die Implementierung kann das nicht wissen. Sie weiß nur, dass eine bestimmte Anzahl von Argumenten der Funktion auf den Stack gesetzt wurde. Da es in der C-Laufzeit keinen Mechanismus gibt, der das Programm darüber informiert, dass es keine weiteren Argumente gibt, nimmt "printf" einfach das nächste Element, das zufälligerweise auf dem Stack liegt, interpretiert es als ganze Zahl und gibt es aus.

Es ist leicht ersichtlich, dass man sich dies zunutze machen kann, um eine beliebige Menge an Informationen von dem Stack auszugeben. Wenn "str" beispielsweise "%d %d %d %d" enthielte, dann würden die Werte der nächsten vier Wörter auf dem Stack ausgegeben.

Dies ist an sich bereits eine Sicherheitslücke zur Code-Injektion. Man könnte sie allerdings verzeihen, wenn man zu dem Schluss kommt, dass ihr einziger möglicher Schaden darin besteht, dass sie genutzt werden kann, um sich Zugang zu den Daten auf dem Stack zu verschaffen. Sind dort aber sensible Daten wie ein Passwort oder ein Zertifikatschlüssel abgelegt, ist das schlimm.

Doch es zieht unter Umständen gravierendere Folgen nach sich, weil ein Angreifer auch in beliebige Speicheradressen schreiben kann. Der Formatspezifikator, der dies erlaubt, ist "%n". Normalerweise ist das zugehörige Argument ein Zeiger auf eine ganze Zahl. Da der Fomat-String so interpretiert wird, dass er den Ergebnis-String aufbaut, wird, sobald „%n“ ersichtlich ist, die Anzahl der bis dahin geschriebenen Bytes an den von diesem Zeiger angegebenen Speicherort gesetzt. In dem nachfolgenden Beispiel nimmt, nachdem "printf" abgeschlossen ist, i den Wert 4 an:

printf("1234%n", &i);

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