
Analyse der Drupal-Code-Sicherheit
In den vorherigen Teilen lag der Fokus auf der Konfiguration von Drupal sowie auf der Übersicht über Module und Bibliotheken. Im dritten Teil der Serie zur Durchführung eines Sicherheitsaudits konzentrieren wir uns auf die Übersicht über benutzerdefinierte Module und Themes. Wir werden ein Audit des Projekt-Repositorys durchführen, um die Elemente zu identifizieren und zu analysieren, auf die im Rahmen des Audits besonders geachtet werden sollte.
Übersicht über benutzerdefinierte Drupal-Themen und Module
Bei benutzerdefinierten Drupal-Themen und -Modulen treten Angriffsvektoren am wahrscheinlichsten auf. Dort gibt es Code, der nicht so weit verbreitet ist wie der Code für Contrib-Module und -Themen. Daher ist er in Bezug auf Sicherheit nicht so gut getestet. In diesem Artikel werde ich eine grundlegende Checkliste für das Audit von benutzerdefiniertem Drupal-Code besprechen. Diese Liste kann als Grundlage für ein Audit von benutzerdefinierten Modulen und Themes dienen.
Routing
Wir beginnen mit der Analyse der vom Benutzer empfangenen Parameter. Lassen Sie uns überprüfen, welchen Typ sie haben und wie sie gefiltert werden. Drupal ermöglicht die Verwendung von Parametern in Routen. Diese sind dynamische Werte, deren fehlerhafte Verarbeitung Angriffsvektoren schaffen kann. Wenn eine Abfrage auf der Basis eines Parameters erstellt wird und nicht gefiltert wird, kann dies beispielsweise zu einem SQL-Injection-Angriff führen.
Als Nächstes sollten wir uns die Routing-Zugangskonfiguration ansehen, insbesondere die Berechtigungen, die der Benutzer haben muss, um Zugriff zu erhalten. Beim Deklarieren des Routings müssen wir die Anforderungen definieren, die der Benutzer erfüllen muss, um Zugang zum Routing zu erhalten. Wir müssen die erforderlichen Berechtigungen für jede in unserem benutzerdefinierten Drupal-Code spezifizierte Route analysieren und prüfen, ob ihr Niveau angemessen ist. Die Angabe eines zu niedrigen oder falschen Niveaus erforderlicher Berechtigungen führt dazu, dass Benutzer Zugriff auf Seiten haben, die sie nicht einsehen sollten. Dies können sowohl die Seiten sein, die die Artikel auf Ihrer Seite auflisten, als auch die Seiten, die alle Benutzer zusammen mit allen einem bestimmten Konto zugeordneten Daten auflisten. Aus diesem Grund ist das Berechtigungsaudit so wichtig.
Formulare
Zuerst werden wir die Korrektheit der Elementtypen analysieren und prüfen, ob der richtige Typ für ein gegebenes Feld verwendet wurde. Bei der Analyse der in einem Formular verwendeten Feldtypen können wir auf ein Feld stoßen, dessen Name und Beschreibung darauf hindeuten, dass es mit Daten eines bestimmten Typs ausgefüllt werden sollte. Die Definition des Feldes kann jedoch zulassen, dass das Feld mit anderen Datentypen ausgefüllt wird. Wir sollten sicherstellen, dass die Definition der Elementtypen ihrem Zweck entspricht.
Der nächste Schritt besteht darin, die verwendeten Methoden zur Validierung der Feldwerte im Formular zu analysieren. Drupal ermöglicht es, benutzerdefinierte Methoden zu definieren, die die Korrektheit der eingetragenen Daten validieren. Wir sollten die Korrektheit der benutzerdefinierten Validierungsmethoden testen und sicherstellen, dass nur gültige Daten die Validierung bestehen.
Der letzte Punkt wird sein, die Anwesenheit und korrekte Verwendung der von Drupal bereitgestellten Form API zu überprüfen. Wir sollten analysieren, wie die Form API verwendet wird, vorzugsweise mithilfe der Dokumentation, und sicherstellen, dass die Formulare gemäß den Anweisungen erstellt werden.
Die Dokumentation spezifiziert:
- die Fälle, in denen die Verwendung eines bestimmten Feldtyps korrekt ist,
- wie man die Validierungsmethoden erstellt,
- wie man hook_form_alter verwendet,
- wie man Formulare erstellt, die für den Benutzer intuitiv sind.
SQL-Abfragen
Lassen Sie uns beginnen, indem wir das Vorhandensein und die korrekte Verwendung der von Drupal bereitgestellten Database API überprüfen. Sie ist mit Methoden ausgestattet, die Sicherheit gegen Angriffe auf die Datenbank bieten. Die korrekte Nutzung der API schützt weitgehend vor Angriffen. Wir sollten besonders darauf achten, ob Methoden zur Filterung von Eingabedaten in den SQL-Abfragen verwendet werden. Drupal empfiehlt die Verwendung von Platzhaltern, wenn es notwendig ist, Eingabedaten zu verwenden, z. B. aus einer Variablen, deren Wert vom Benutzer im Formular angegeben wurde. Hier ein Beispiel:
$foo = $this->getFormData(); $query = \Database::getConnection()->query(‘SELECT foo FROM {bar} b WHERE b.name = ‘ . $foo[‘name’]);
Im obigen Code sehen wir, dass der Wert „name“ aus dem $foo-Array ohne Filterung der Abfrage hinzugefügt wird. In solchen Fällen empfehle ich die Verwendung von Platzhaltern.
$foo = $this->getFormData(); $query = \Database::getConnection()->query(‘SELECT foo FROM {bar} b WHERE b.name = :name’, [‘:name’ => $foo[‘name’]]);
Indem wir Abfragen auf diese Weise erstellen, unterziehen wir die Variable $foo [„name“] eine Filterung, die die Abfrage gegen SQL-Injection-Angriffe schützt.
Filtermechanismen
Dies bedeutet, das Vorhandensein und die Korrektheit der gefilterten Daten zu überprüfen, die vom Benutzer empfangen werden. Wir müssen sicherstellen, dass nur TWIG verwendet wird, um die Variablen in den Vorlagen zu rendern, das standardmäßig den Variableninhalt filtert und dafür sorgt, dass sie sicher sind. Im Falle der Arbeit mit Variablen, die dann in übersetzbare Zeichenfolgen verwendet werden, müssen wir sicherstellen, dass diese Variablen für die entsprechenden Platzhalter ersetzt werden. Der reine Text, der vom Benutzer kommt, sollte mit der Html::escape() Methode gefiltert werden, wenn der Benutzer keine HTML-Tags im Text angeben soll, und mit der Xss::filterAdmin() Funktion, wenn er dies tun können soll. Wenn der Benutzer Links bereitstellt, sollten diese ebenfalls gefiltert werden.
Zu diesem Zweck werden die Funktionen UrlHelper::stripDangerousProtocols() und UrlHelper::filterBadProtocol() verwendet. Filtermechanismen sind auch auf der Clientseite anwendbar. Um Text in JavaScript zu bereinigen, sollten wir die Drupal.checkPlain() Funktion verwenden.
Sensitive Daten
Wir sollten überprüfen, ob der Code keine Zugangsdaten oder API-Schlüssel enthält. In einigen Fällen könnten wir über Zugangsdaten stolpern, die im Code von benutzerdefinierten Modulen verblieben sind. Diese zu identifizieren, erfordert nicht viel Arbeit.
Repository-Überprüfung
Es lohnt sich, einen Blick auf das Repository zu werfen, um nach sensiblen Informationen zu suchen, die in den Dateien gespeichert sein könnten. Der erste Schritt besteht darin, die settings.php-Datei zu analysieren und sicherzustellen, dass darin keine Zugangsdaten enthalten sind, die Zugriff auf die Datenbank oder andere Komponenten der Drupal-Website gewähren würden. Als nächstes sollten wir die Umgebungsvariablen-Dateien überprüfen und sicherstellen, dass keine Zugangsdaten in ihnen enthalten sind. Die von der Umgebung benötigten Zugangsdaten sollten kein Teil des Repositorys sein.
Der nächste Schritt besteht darin, zu überprüfen ob keine tief versteckten vertraulichen Dateien vorhanden sind, zum Beispiel – mit SSL-Privatschlüsseln oder Datenbankkopien oder -dumps. Manchmal gelangen Dateien, die niemals im Repository sein sollten, versehentlich dorthin. Einige von ihnen sind beispielsweise Datenbank-Dumps oder private Schlüssel. Es wird empfohlen, diese zu identifizieren und zu entfernen.
Analyse des Drupal-Codes – Zusammenfassung
Im dritten Teil der Serie zur Durchführung eines Drupal-Sicherheits-Audits haben wir die Möglichkeiten kennengelernt, den Code von benutzerdefinierten Modulen und Themes zu überprüfen, wir haben das Repository des Projekts auditiert, um sicherzustellen, dass keine sensiblen Daten öffentlich verfügbar waren, und wir haben die Elemente analysiert, auf die während des Audit-Prozesses geachtet werden sollte.
Die Anwendung der in diesem Artikel geposteten Tipps erhöht die Sicherheit Ihrer Anwendung. Ein Code-Audit ist ein wesentliches Element für eine bessere Seitensicherheit. Es erfordert mehr Zeit und Wissen als das Update, das wir im ersten Teil behandelt haben, und die korrekte Konfiguration von Drupal, die wir im zweiten Teil der Serie behandelt haben, aber die Vorteile, die sich daraus ergeben, sind weitaus wertvoller als die dafür aufgewendete Zeit.
Im nächsten Teil dieser Artikelserie werden wir über externe Werkzeuge zur Automatisierung des Audit-Prozesses lernen. Dies ist der nächste Schritt bei der Durchführung eines umfassenden Sicherheitsaudits. Benötigen Sie Hilfe bei der Durchführung einer solchen Aufgabe? Unser Drupal-Support-Team hat umfangreiche Erfahrung in der Durchführung von Audits.