Announcement

Wie Sie URL-Handler und OpenURL sicher in Ihrer Unity-Anwendung verwenden

BRANDON CALDWELL Anonymous
Nov 6, 2019|7 Min.
Wie Sie URL-Handler und OpenURL sicher in Ihrer Unity-Anwendung verwenden
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Das Unity-Sicherheitsteam unterstützt Unity-Entwickler bei der Entwicklung vertrauenswürdiger Spiele und Anwendungen. In dieser Blogserie finden Sie Tipps, Techniken und Empfehlungen für die Entwicklung sicherer Spiele und Anwendungen mit Unity.

Heute starten wir eine fortlaufende Blog-Serie über die sichere Entwicklung mit Unity. In dieser Reihe werden Inhalte vermittelt, die Unity-Entwickler direkt in ihren Spielen und Anwendungen anwenden können. Wir hoffen, eine Vielzahl von Themen abdecken zu können, die von grundlegenden bis hin zu fortgeschrittenen Kenntnissen reichen und sich auf die besten Praktiken bei der Verwendung von Unity-Produkten und -Diensten konzentrieren. Wenn es ein Thema gibt, über das Sie gerne lesen möchten, lassen Sie es uns wissen. Wir freuen uns auf Ihr Feedback. In diesem Blog geht es in erster Linie um einen Überblick über URL-Handler.

Wie Sie URL-Handler und OpenURL sicher in Ihrer Unity-Anwendung verwenden

URL- und Dateihandler verknüpfen Dateitypen mit dem installierten Programm, das die angegebene Datei öffnen kann, aber sie sind mit Risiken verbunden. Wenn Sie beispielsweise auf Ihrem lokalen Rechner sitzen und eine PDF-Datei von Ihrem lokalen Laufwerk per Doppelklick öffnen, greift Ihr Betriebssystem auf seine Liste der Dateihandler zurück und wählt das für diesen Dateityp zugewiesene Programm aus, so dass Ihre PDF-Datei von einem Programm geöffnet wird, das sie korrekt anzeigen kann. Dateiverwaltungsprogramme verwenden in der Regel die Dateierweiterung (z. B. .pdf - das Suffix am Ende des Dateinamens), um zu entscheiden, wie die Datei zu behandeln ist.

Ein ähnlicher Mechanismus, der URL-Handler, entscheidet auf der Grundlage des Pfadpräfixes, wie URLs geöffnet werden sollen. Ein Beispiel hierfür ist das allgegenwärtige Protokoll https://, das Ihren Standardbrowser öffnet. Ein weiteres Beispiel für ein gängiges URL-Schema wäre file://c:/windows/system32/drivers/gmreadme.txt; die Eingabe dieser URL in das Dialogfeld Ausführen veranlasst Windows, diese Lizenzdatei in Notepad zu öffnen.

URL-Handler sind eine nützliche Funktion Ihres Betriebssystems, die dem Benutzer beim Starten von Anwendungen Zeit spart. Dieser bequeme Mechanismus kann jedoch gelegentlich unsicher sein.

Warum sind URL-Handler für Unity-Spiele wichtig?

Der Unity-Editor und die Unity-Laufzeitumgebung unterstützen die programmatische Verwendung von URL-Handlern, sowohl durch die Verwendung des .NET Frameworks als auch durch eine spezielle Unity-Skript-API, nämlich Application.OpenURL. Spieleentwickler verwenden OpenUrl oft so, dass der Webbrowser des lokalen Systems gestartet wird, wenn ein Spieler auf einen Link im Spiel klickt. Wenn der Spieleentwickler jedoch die in Application.OpenURL übergebenen Daten nicht ordnungsgemäß säubert, besteht für den Spieler ein Risiko.

Diese Skript-API ist nicht von Natur aus unsicher, aber in jedem Fall, in dem nicht vertrauenswürdige Eingaben als Teil der übergebenen URL verwendet werden, müssen Sie vorsichtig sein.

Anmerkung: Nicht vertrauenswürdige Eingabe

Nicht vertrauenswürdige Eingaben/Daten sind alle Daten, die nicht aus einer vertrauenswürdigen Quelle stammen. Was ist also eine vertrauenswürdige Quelle? Im Rahmen dieses Artikels sollten nur Ihre Endpunkte mit aktiviertem striktem HTTPS als vertrauenswürdig angesehen werden.

Es gibt viele Beispiele für nicht vertrauenswürdige Eingaben. Wenn Sie ein Anti-Cheat-System entwickeln, sollte das lokale Dateisystem des Spielers als nicht vertrauenswürdig angesehen werden. Wenn Sie ein Multiplayer-Spiel entwickeln, sollten alle Spieler als nicht vertrauenswürdig eingestuft werden.

Es gibt noch andere Möglichkeiten, Daten/Eingaben zu schützen, z. B. durch Verschlüsselung mit öffentlich-privaten Schlüsseln, aber das würde den Rahmen dieses Artikels sprengen. (Hinterlassen Sie einen Kommentar, wenn Sie mehr darüber erfahren möchten).

Ausnutzung der URL-Behandlung und unsichere Verwendung

Diese Handler bieten den Nutzern zwar großen Komfort, bergen aber auch Risiken. Hier ist ein Beispiel für die unsichere Verwendung von Application.OpenURL:

using UnityEngine;
using System.Collections;

public class VulnerableBrowserClass: MonoBehaviour {
// Übergeben Sie die URL des Links, auf den ein Spieler in unseren Spielforen geklickt hat
void OpenBrowser(string url_from_chat) {
Application.OpenURL(url_from_chat); // ←- Schlechtigkeit hier; Wert ist nicht bereinigt
}
}

Abbildung 1. Beispiel für die unsichere Verwendung von Application.OpenURL

In diesem Beispiel erlaubt das Kommentarsystem im Spiel den Benutzern, Links zu teilen; wenn ein Benutzer auf einen Link klickt, wird die Funktion VulnerableBrowserClass.OpenBrowser aufgerufen.

Beispielszenario

Abbildung 2. Beispielszenario mit einem potenziell gefährlichen Link

Sie können sehen, wie einfach es ist, einem ahnungslosen Benutzer einen Link zu einer potenziell gefährlichen Anwendung zu senden (Abbildung 2). Wird diese URL, wie in Abbildung 1 gezeigt, direkt an Application.OpenURL übergeben, führt der Rechner des Opfers sofort die Anwendung über diesen Link aus, wodurch ein Angreifer möglicherweise die Kontrolle über das System des Opfers übernehmen kann.

Im obigen Bild könnte der Angreifer den obigen Link so formatieren, dass er im Chat-Fenster als https://SuperLeetCheats.com/VulnTheGame angezeigt wird, der eigentliche Link aber zu seiner Malware führt: file://leethaxorz.net/super_malware.exe. Das Problem besteht nicht darin, dass sich Benutzer gegenseitig Links senden können. Das Problem liegt darin, dass die von einem Benutzer (möglicherweise dem Angreifer) gesendeten Links ohne jegliche Validierung oder Bereinigung direkt an Application.OpenURL übergeben werden, wie im obigen Codebeispiel zu sehen ist (Abbildung 1). Ohne diese Bereinigung würde ein Klick auf den obigen Link dazu führen, dass der Unity-Editor die Datei direkt an das Betriebssystem des Zielspielers übergibt, was wahrscheinlich zur Ausführung der Malware des Angreifers führt.

Wie kann ich das Risiko mindern?

Am sichersten ist es, Application.OpenURL niemals mit nicht vertrauenswürdigen Daten zu verwenden. Verwenden Sie es nur, um URLs zu öffnen, die von Ihren Entwicklern oder Servern stammen und über einen vertrauenswürdigen Transport (d.h. HTTPS).

Wenn Sie Remote-Konfigurationen verwenden (z. B. wenn Sie eine Liste von Inhalts-URLs für neue Aktualisierungen hosten), dann stellen Sie sicher, dass diese Daten nur über HTTPS abgerufen werden, mit strikter Durchsetzung. Rufen Sie entfernte Inhalte immer auf diese Weise ab.

Anmerkung: HTTPS behebt keine Schwachstellen in Ihrer Anwendung, die durch nicht vertrauenswürdige/ungeprüfte Eingaben entstehen, wie in dem oben beschriebenen Angriff beschrieben. Es stellt jedoch sicher, dass die Daten, die Sie an Ihren Player senden, während des Transports nicht verfälscht wurden.

Wenn Sie beschlossen haben, dass Sie OpenUrl unbedingt mit Daten aus nicht vertrauenswürdigen Quellen verwenden müssen, dann müssen Sie Ihr Bestes tun, um die Eingaben, die Sie von der nicht vertrauenswürdigen Quelle erhalten, zu bereinigen. Es gibt mehrere Möglichkeiten, dies zu tun, z. B. mit Regex-Mustervergleichen, der Erstellung von URLs über .Net-Bibliotheken oder der Nutzung externer Sanitization-Bibliotheken. Keine dieser Abhilfemaßnahmen wird jedoch zu 100 % funktionieren, und unabhängig davon, für welche Lösung Sie sich entscheiden, besteht ein gewisses Risiko, wenn Application.OpenUrl (und ähnliche Funktionen) mit nicht vertrauenswürdigen Daten verwendet wird.

Wie in Abbildung 2 zu sehen ist, gibt es für die Nutzer keine Möglichkeit zu erfahren, welche URL sich hinter diesem Link verbirgt. Geben Sie den Benutzern zumindest eine Aufforderung mit der vollständigen URL, die sie besuchen werden. Sie sollten dies jedoch nicht als robuste Lösung betrachten, da die Benutzer dafür bekannt sind, dass sie jede Aufforderung, die ihnen vorgesetzt wird, blindlings anklicken.

Warum sich mit OpenURL und Dateihandlern herumschlagen?

Die Verwendung von OpenURL und File-Handlern ist für Entwickler sehr üblich, insbesondere bei Rich-Media-Anwendungen und Social-Media-ähnlichen Funktionen, wie z. B. In-Game-Chat, Bewertungen und Kommentaren, bei denen Benutzer in der Regel Inhalte freigeben möchten, die sich außerhalb des Spiels im Internet befinden. Darüber hinaus gibt es gängige Produktivitätsszenarien, wie z. B. die Bearbeitung einer Konfigurationsdatei, in denen Sie dem Betriebssystem einen Link übergeben möchten, der die bevorzugte Codebearbeitungsanwendung des Benutzers öffnet, um dem Benutzer die Arbeit zu erleichtern. Application.OpenURL ist eine plattformunabhängige API zur Unterstützung von Datei-Handlern, die es Unity-Entwicklern erspart, eigene Handler für jede Plattform zu schreiben.

Ist dies nur beim Unity Editor und der Runtime der Fall?

Nein. Wie oben beschrieben, ist dies eine gängige Funktion in den meisten Betriebssystemen und wird von vielen Sprachen und Frameworks unterstützt. Achten Sie auf die Verwendung der Windows API Windows.System.LauchURIAsync (für Universal Windows Platform [UWP]-Anwendungen) oder der gefürchteten System.Diagnostics.Process.Start; diese beiden nativen .Net-Bibliotheken bieten dieselbe Funktionalität wie Application.OpenURL. LaunchURIAsync ermöglicht das Starten von Anwendungen aus der sicheren Anwendungs-Sandbox von Windows, und Process.Start kann zum Starten einer beliebigen ausführbaren Datei auf dem lokalen System verwendet werden. Außerdem bieten einige systemeigene Aufrufe die gleiche Funktionalität, wie z. B. Apples open(_:options:completionHandler:). Alle diese Arten von APIs können leicht missbraucht werden, wenn nicht vertrauenswürdige, nicht sanitisierte Eingaben an diese APIs weitergegeben werden.

Was kommt als Nächstes?

Wir werden hier in regelmäßigen Abständen Artikel zu Themen veröffentlichen, die für die Anwendung und Aufrechterhaltung von Best Practices im Bereich Sicherheit bei der Entwicklung mit Unity wichtig sind. Zu den nächsten Themen gehören der sichere Transport von Spieldaten und die Demokratisierung des Lebenszyklus der sicheren Softwareentwicklung (SSDLC). Wir arbeiten auch daran, einige unserer internen Anleitungen und Sicherheitstools als Open Source zu veröffentlichen.

Gibt es ein Sicherheitsthema, über das Sie gerne in einem zukünftigen Artikel mehr erfahren würden? Schreiben Sie uns eine Nachricht!

Erfahren Sie mehr über Unity Security, einschließlich Sicherheitshinweisen.