In unserem zweiten Teil der Blogserie „IT Security in Web Anwendungen“ thematisieren wir das Thema File Uploads, Downloads und das sichere Abspeichern von Dateien. Anhand konkreter Beispiele – dieses Mal in der Programmiersprache PHP – wollen wir die wichtigsten Punkte im Bezug auf IT-Security aufzeigen und Best Practices auflisten.
In unserem ersten Post dieser Blogserie sind wir das Thema „Injections“ angegangen und haben gezeigt, wie diese zustandekommen bzw. zu verhindern sind. Falls noch nicht geschehen empfehlen wir Ihnen Teil I der Blogserie „IT Security in Web Anwendungen – Injections“.
In dem kommenden Posts der Blogserie möchten wir uns tiefergehend mit den verschiedenen Bereichen der IT Security beschäftigen. In insgesamt neun Blogposts möchten wir tiefergehend auf verschiedene Szenarien eingehen, mögliche Schutzmechanismen präsentieren und diese – wenn möglich – durch praktische Beispiele demonstrieren. Nach Blogpost #9 werden wir diese Serie und weitere Tipps und Tricks als PDF zur Verfügung stellen. Sie können sich unter dem nachfolgenden Formular zum Newsletter anmelden, um das PDF zu erhalten:
[newsletters_subscribe form=3]
Das Problem mit Uploads
Grundsätzlich sind Dateien, die ein Benutzer uploaden kann, eine Benutzereingabe die es zu validieren gilt. Im Unterschied zu anderen Arten von Benutzereingaben – z.B. Daten die über ein Formular eingegeben werden – können unerwünschte Daten als Dateien langfristig auf dem Server persistiert werden oder vorhandene Dateien – inkl. Source Code der Anwendung – überschrieben werden. Dies kann zu gravierenden Sicherheitsproblem führen, wenn z.B. eine Datei Programmcode enthält und auf dem Server ausgeführt wird.
Jede hochgeladene Datei muss also sehr kritisch begutachtet werden bevor es als gültiger Upload zählt und am Zielort abgespeichert wird. Der Zielort kann ein Pfad auf dem Server, ein dedizierter Fileserver oder aber Third Party Anwendungen wie Amazon S3 sein. Wir werden auf diese Möglichkeiten später kurz eingehen.
File Upload mit PHP
Als weiterer Faktor kommt hinzu, dass ziemlich alle Angaben, die in dem HTTP Header für multipart/form-data
angegeben werden, von dem Benutzer manipuliert oder verfälscht werden können und somit ein weiteres Sicherheitsrisiko darstellen. So kann z.B. nicht darauf gesetzt werden, dass die angegebene Dateigröße auch der tatsächlichen Dateigröße entspricht. Wir wollen dies an folgendem Beispiel demonstrieren:
<form method="post" action="file_upload.php" enctype="multipart/form-data">
<input type="file" name="upload_file" />
<input type="submit" value="Upload">
</form>
Das Formular ist relativ einfach gehalten und enthält lediglich ein Input-Feld zur Auswahl von Dateien bzw. einen Button zum Übertragen an den Server. Das Formular schickt die Information an das PHP-Skript file_upload.php
.
Auf dem Server bzw. in dem PHP-Skript sollte die Datei validiert werden. Zentraler Gegenstand des File Uploads ist das $_FILES
-Array, welches alle notwendigen Informationen beinhaltet. Zu dem Validieren der Datei gehören mindestens folgende Schritte:
- prüfen, ob der Name aus dem HTML-Formular mit jenem aus dem
$_FILES
-Array übereinstimmt, - prüfen, ob die hochgeladene existiert und eine realistische Dateigröße hat,
- Dateigröße 0 deutet auf einen Fehler hin,
- zu große Dateien können potenziell böswillige Absichten befolgen
- Dateityp bzw. Mime-Type prüfen bzw. gegen eine Whitelist validieren
Konkret könnte der zugehörige Code wie folgt aussehen:
$filepath = $_FILES['upload_file']['tmp_name'];
$fileSize = filesize($filepath);
$fileinfo = finfo_open(FILEINFO_MIME_TYPE);
$filetype = finfo_file($fileinfo, $filepath);
$fileerror = $_FILES['upload_file']['error'];
Die Angaben in den Variablen sind die „echten“ Daten zu der Datei und können ggf. von jenen aus $_FILES
abweichen. Erst wenn alle Angaben in Ordnung sind kann die Datei aus tmp_name
an den richtigen Ort verschoben werden. Das Verschieben sollte ausschließlich mit move_uploaded_file
geschehen.move_uploaded_file
bietet zusätzliche Sicherheit indem es u.a. prüft, ob die Datei, die es zu verschieben gilt, auch tatsächlich eine hochgeladene Datei ist.
Als unsichere Alternative zumove_uploaded_file
steht rename
. Allerdings kann – wenn Angreifer Quell- und Zielangaben kontrollieren – beliebige Dateien verschieben, überschreiben und in den Document-Root stellen, damit sie öffentlich zur Verfügung stehen. Zusätzlich sollte überprüft werden, ob in error
($fileerror
) der Wert UPLOAD_ERR_OK
steht. Ist dies der Fall war der Upload erfolgreich, andernfalls gab es einen Fehler.
Die oben aufgelisteten Mechanismen sind ein Minimum im Bezug auf IT-Security und File Uploads. Je nach Anwendungsfall können weitere Faktoren eine Rolle spielen, wie z.B. dass hochgeladene Dateien gewisse Informationen beinhalten müssen oder bereits vorhandene Dateien nicht überschrieben werden dürfen.
In jedem Falle sollte der Upload aber „abgesichert“ angeboten werden. Entweder sollten also nur autorisierte und authentifizierte Benutzern uploaden dürfen oder aber – falls dies nicht möglich ist – sollte der Upload an eine Art Session Key gebunden sein, welcher relativ zeitnah verfällt. Andernfalls läuft man gegen die Gefahr durch gezielte HTTP POST’s Dateien hochgeladen und den Server in die Knie gezwungen zu bekommen.
File Storage und Security
Sicherheit im Bezug auf Files endet leider nicht mit dem erfolgreichen Hochladen und Verschieben an den Zielort. Der Zielort wird i.d.R. viele Dateien selber Art beinhalten und es muss sichergestellt werden, dass sie später wieder korrekt zugeordnet werden können. Je nach Art und Inhalt der Dateien sind gesetzliche Verpflichtungen – z.B. im Rahmen von DSGVO – gegeben und verlangen weitere Maßnahmen.
Zunächst muss sichergestellt werden, dass die Datei nicht durch Unbefugte eingesehen werden können. Dies gilt grundsätzlich für den Zugriff „von außen“, also von Benutzern der Anwendung (z.B. durch Verändern von GET-Parametern). Vor dem zur Verfügung stellen der Dateien muss also immer eine Autorisierung stattfinden. Aber auch der Zugriff über die Shell oder Terminal stellt ein potenzielles Sicherheitsrisiko dar. Es muss sichergestellt werden, dass nur befugte Personen Zugriff auf den Upload-Ordner haben. Die Dateien und Ordner sollten über das Rechtekonzept des Betriebssystems abgesichert und Privilegien auf einen engen Kreis beschränkt werden.
Ein weiterer Punkt im Bezug auf File Storage ist das regelmäßige Sichern und Erstellen von Backups. Falsche Programmlogik, ein Tippfehler in dem Terminal oder Ausfall der Hardware kann zu unwiderruflichen Verlust von Dateien führen.
File Downloads
Wenn Files sicher hochgeladen und gespeichert wurden, muss auch ein sicherer Download ermöglicht werden. Wie bereits weiter oben erwähnt sind Sicherheitsrichtlinien zur Vermeidung von unbefugtem Zugriff notwendig. Benutzer sollten grundsätzlich immer autorisiert werden bevor sie auf Dateien zugreifen dürfen (ausgenommen sind hiervon öffentlich zugängliche Dateien). Ferner muss das sichere Speichern sowie Backups gewährleistet sein.
File Backends
Je nach Szenario und Häufigkeit kann das Abspeichern, Absichern und das Erstellen von Datei-Backups eine Herausforderung darstellen. Der Server, welcher gleichzeitig die Applikation bereitstellt, kann sehr schnell an seine Speichergrenzen kommen. Abhilfe können hier eigene Fileserver oder Third Party Services wie Amazon S3 schaffen. Während ein eigener Fileserver meist ein eigenes System für sich darstellt und ebenfalls alle Sicherheitsaspekte implementieren muss, können „fertige“ Systeme die über das HTTP Protokoll abgefragt werden können, eine Vereinfachung darstellen. Allerdings gelten hier ganz neue Bedingungen im Bezug auf Sicherheit: können Sie dem Anbieter trauen? sollten Sie die Daten vorher verschlüsseln? Was passiert wenn der Service irgendwann nicht mehr existiert? Diese Fragen sind zu klären bevor Sie sich für eine Lösungsstrategie entscheiden.
IT Security und File Storage mit Ucar Solutions
Wie bereits in unserem ersten Teil der Blogserie „IT Security in Web Anwendungen“ erwähnt bieten Ihnen vollumfänglichen Source-Code Audit zum Absichern Ihrer Anwendung gegen eine Vielzahl potenzieller Sicherheitsrisiken und weiteren sicherheitsrelevanten Aspekten. Durch automatisierte und manuelle Prozesse helfen wir Ihnen, Ihre sensiblen und geschäftskritischen Informationen zu schützen und die geltenden Gesetze einzuhalten.
Unsere automatisierten Tests beinhalten u.a. Penetrationtests, toolbasierte Codeanalyse und -dokumentation. Darauf aufbauend analysieren wir den Source-Coden persönlich, versuchen die Architektur zu verstehen und mögliche Probleme bzw. Vorschläge in dem Zusammenhang zu identifizieren bzw. unterbreiten.
Des Weiteren agieren wir auch als „Software-as-a-Service“ (kurz SaaS) Vendor und bieten Ihnen ein File Backend als Service, welcher vollumfänglich, unter Berücksichtigung aller o.g. sicherheitsrelevanten und ununterbrochen zur Verfügung steht. So können Sie sich um Ihre Anwendung kümmern während wir Ihre Dateiablage zur Verfügung stellen.
Kontaktieren Sie uns heute noch für ein unverbindliches Erstgespräch. Wir freuen uns darauf!