Was ist Code Injection und wie man es vermeidet
Code Injection Vulnerabilities ist ein allgemeiner Begriff, der Schwachstellen beschreibt, die von einem Angreifer ausgenutzt werden können, um bösartigen Code einzuschleusen und auszuführen.
Diese Sicherheitsanfälligkeit tritt normalerweise aufgrund fehlender Validierung nicht vertrauenswürdiger Daten auf. Anwendungen, die Code direkt auswerten, ohne ihn vorher zu validieren, wären anfällig für diese Art von Angriff.
Code Injection wird manchmal mit anderen Sicherheitsanfälligkeiten wie und Command Injection verwechselt. Es ist zu beachten, dass Code Injection eine andere Art von Sicherheitsanfälligkeit ist, bei der ein Angreifer Code anstelle von Betriebssystembefehlen einfügt. Dies bedeutet, dass der Angreifer in Bezug auf Code-Injection-Schwachstellen durch die Sprachfunktionalität der Anwendung eingeschränkt ist.
Einschränkungen des Angreifers
Beim Ausnutzen solcher Sicherheitsanfälligkeiten sind Angreifer durch die Funktionalität der Anwendungssprache (z. B. PHP / Python) eingeschränkt. In den meisten Fällen kann der Angreifer jedoch die Funktionalität des Interpreters nutzen, um von der Code-Injektion zur Befehlsinjektion überzugehen.
Wenn ein Angreifer beispielsweise PHP-Code in eine Webanwendung injiziert, wird der Angreifer durch die vom PHP-Interpreter verfügbare Funktionalität eingeschränkt. Wenn der Injection-Angriff auftritt, würde der PHP-Interpreter den injizierten Code ausführen und abhängig von der Funktionalität des Interpreters könnte ein Angreifer Programmausführungsfunktionen nutzen, die in PHP verfügbar sind, wie system() oder shell_exec, um Systembefehle auszuführen.
Die Auswirkungen einer Code-Injection
Die Auswirkungen eines erfolgreichen Angriffs können in Abhängigkeit von mehreren Faktoren variieren, z. B. der von der Anwendung verwendeten Sprache, der von der Anwendung verfügbaren Funktionalität usw.
In den meisten Fällen kann ein erfolgreicher Angriff jedoch die Vertraulichkeit, Integrität und Verfügbarkeit der Anwendung und ihrer Daten vollständig beeinträchtigen.
Beispiel
Stellen Sie sich eine Webanwendung vor, die nicht vertrauenswürdige Daten wie die Eingabe des Benutzers an eine PHP-Funktion eval() übergibt. Die Funktion eval() wertet einen String einfach als PHP-Code aus, solange er eine gültige PHP-Syntax hat und mit einem Semikolon endet.
<?php
$Sicherung = “”;
$ input = $_GET;
eval(“\$Sicherung = \$Eingabe;”);
?>
Da die Anwendung die Eingabe des Benutzers an die gefährliche PHP-Funktion eval() übergibt und keine Validierung durchgeführt wird, wäre die Anwendung anfällig für Code-Injection-Angriffe.
Ein Angreifer könnte diese Schwachstelle ausnutzen, indem er die Eingabe 1; phpinfo(); wie unten gezeigt:
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; phpinfo();
OS-Systembefehle ausführen
Nach Überprüfung der Sicherheitsanfälligkeit kann ein Angreifer Systembefehle ausführen, indem er die Funktionen des Interpreters nutzt, die die Befehlsausführung ermöglichen. In diesem Fall wird die Funktion system() verwendet.
https://example.com/index.php?arg=1;https://example.com/index.php?arg=1; system(‘whoami’);
Der Befehl whoami gibt beim Aufruf den Benutzernamen des aktuellen Benutzers aus. Dies bedeutet, dass, wenn die Anwendung
die Eingabe des Benutzers an die Funktion eval() übergibt, der PHP-Interpreter den Befehl whoami auf dem zugrunde liegenden Betriebssystem
ausführt.
Sobald der Angreifer Systembefehle ausführen kann, kann er eine interaktive Shell auf dem anfälligen
-System erstellen und andere Angriffe auf andere Systeme im internen Netzwerk des kompromittierten Systems ausführen.
Prävention
Unabhängig von der verwendeten Sprache können Code-Injection-Schwachstellen vermieden werden, indem die unten beschriebenen Best Practices
befolgt werden:
- Nicht vertrauenswürdige Daten nicht auswerten
◦ Bewerten Sie nicht vertrauenswürdige Daten nicht direkt mit unsicheren Funktionen wie eval(), es sei denn, dies ist unbedingt erforderlich. * Behandeln Sie alle Daten als nicht vertrauenswürdig
◦ Beachten Sie, dass sich nicht vertrauenswürdige Daten nicht nur auf die über HTML-Formulare bereitgestellten Eingaben beziehen. Informationen, die von Benutzern kontrolliert werden, wie Cookies, HTTP-Anforderungsheader und hochgeladene Dateien, sollten als nicht vertrauenswürdig behandelt werden.
- ValidateUntrusted Daten
◦ Validieren Sie Benutzereingaben immer auf der Serverseite.
◦ Wenn der Benutzer Eingaben in einem bestimmten Format wie Datum, Postleitzahl, Nummern, E-Mail-Adresse
usw. übermitteln soll, stellen Sie sicher, dass die Eingaben des Benutzers dem erwarteten Format entsprechen.
◦ Wenn die Anwendung einen Wert innerhalb eines begrenzten Satzes von Optionen erwartet, folgen Sie einem Whitelist-Ansatz und stellen Sie sicher, dass
die übermittelte Eingabe eine der zulässigen Optionen ist.
- Verhärten Sie den Interpreter
◦ Zum Beispiel sollte die Funktionalität des PHP-Interpreters auf die minimale Funktionalität beschränkt sein, die für die Funktion der Anwendung erforderlich ist. Dies könnte es Angreifern erheblich erschweren, Systembefehle auszuführen. Zum Beispiel könnten die PHP-Programmausführungsfunktionen durch Ändern des PHP deaktiviert werden.ini-Datei.
- Statische Analyse
◦ Führen Sie statische Analyseaktivitäten durch, um Schwachstellen im Zusammenhang mit unsicheren Bewertungen zu identifizieren.
- DAMPF
◦ Führen Sie regelmäßige Schwachstellenbewertungen und Penetrationstests durch, um solche Schwachstellen zu identifizieren und zu beheben.