Suchen

Analysemethoden Code-Injektion in Embedded-Systemen gezielt verhindern

| Autor / Redakteur: Dr. Paul Anderson * / Franz Graser

Dieser Artikel beschreibt, wie Angreifer Fehler im Quellcode einer Anwendung ausnutzen können. Er beschäftigt sich mit Schwachstellen, die das Einschleusen von Code ermöglichen.

Firmen zum Thema

Bild 1: Code-Injektionen bilden einen riskanten Angriffsvektor, der zunehmend auch für Embedded-Systeme relevant wird. Durch das Einschleusen von Schadcode kann das System kompromittiert werden.
Bild 1: Code-Injektionen bilden einen riskanten Angriffsvektor, der zunehmend auch für Embedded-Systeme relevant wird. Durch das Einschleusen von Schadcode kann das System kompromittiert werden.
(Bild: © Maksim Kabakou - Fotolia )

Unter Code-Injektion (Code-Einschleusung) versteht man, dass sich eine reguläre Dateneingabe in ein Programm so gestalten lässt, dass sie Code enthält, und dass das Programm mit Tricks zur Ausführung dieses Codes gebracht wird. Viele bekannte Computer-Sicherheitspannen der letzten Jahrzehnte wurden durch Schwachstellen verursacht, über die Code infiltriert werden konnte.

Beispielsweise lassen sich bestimmte Arten von Pufferüberläufen zum Einschleusen von Code nutzen. Fehler, über die SQL-Code eingeschleust wird, funktionieren ähnlich und gehören ebenfalls in diese Klasse. Eine Schwachstelle, die eine Code-Injektion ermöglicht, ist im Wesentlichen durch folgende Aspekte gekennzeichnet:

  • Das Programm liest die Daten aus einem Eingabekanal.
  • Das Programm behandelt die Daten als Code und interpretiert ihn.

In den meisten Fällen ist es nicht üblich, dass ein Programm mit Absicht Daten als Code ausführt (obgleich dies eine Anforderung einer Shell oder eines Interpreters mit einer Read-Eval-Print-Schnittstelle ist).

Doch es ist gängige Praxis, Daten zum Aufbau eines Objekts zu verwenden, das absichtlich ausgeführt wird. Beispielsweise könnte ein naiver Programmierer, der eine SQL-Abfrage ausgeben möchte, eine Zeichenkette vom Benutzer in eine Variable (etwa nameString) einlesen und danach eine Abfrage in einer Zeichenkette wie folgt aufbauen:

“SELECT * FROM Names WHERE Id = " + nameString

Gibt der Benutzer einen grammatikalisch korrekten Namen ein, ist alles in Ordnung. Aber ein böswilliger Benutzer kann dies ohne große Mühe ausnutzen durch die Eingabe einer Zeichenkette, die ein SQL-Statement enthält: “x;DROP TABLE Users;". Das führt anschließend zur folgenden SQL-Abfrage:

"SELECT * FROM Names WHERE Id = x; DROP TABLE Users;"

Als Resultat wird eine der Tabellen aus der Datenbank gelöscht. (Eine amüsante Veranschaulichung des Problems liefert dieser Webcomic unter: http://xkcd.com/327/.)

Im obigen Beispiel ist der „Code" eine in einen SQL-Interpreter eingeschleuste SQL-Abfrage. Ein Embedded-System enthält vermutlich keinen SQL-Interpreter, doch es gibt jede Menge anderer Beispiele von Schwachstellen für eine Code-Injektion, die mit größerer Wahrscheinlichkeit in Embedded-Code auftreten. Ein klassisches Beispiel, für das C-Programme anfällig sind, ist die Format-String-Schwachstelle.

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de (ID: 43669401)