Unsichere direkte Objektverweise in Python finden und beheben
Keshav Malik
19. Juli 2023
0 Min. LesezeitEin unsicherer direkter Objektverweis (IDOR) ist eine Sicherheitslücke, die auftritt, wenn die Implementierung eines Systems Angreifern ermöglicht, ohne Berechtigungsprüfung direkt auf vertrauliche Objekte oder Ressourcen zuzugreifen und diese zu manipulieren. Ein IDOR kann beispielsweise entstehen, wenn eine Anwendung anhand von Benutzereingaben direkten Zugriff auf Objekte gewährt und Angreifer dadurch die Berechtigungsprüfung umgehen können.
IDOR-Schwachstellen verstehen
Wir müssen IDORs beheben, um die Vertraulichkeit, Integrität und Verfügbarkeit der sensiblen Daten zu gewährleisten, die von Ihren Python-Anwendungen verarbeitet werden. Entwickler müssen IDOR-Schwachstellen verstehen, um unbefugten Zugriff zu verhindern, das Vertrauen der Benutzer zu erhalten und potenziell schwerwiegende finanzielle und rechtliche Folgen zu vermeiden.
Arten von IDORs
IDORs treten je nach Implementierung und Funktionalität einer Anwendung in unterschiedlichen Formen auf.
IDOR durch Objektverweise
Diese Form von IDOR tritt auf, wenn ein Angreifer auf ein Objekt zugreifen oder es ändern kann, obwohl er dazu nicht berechtigt ist. Ein häufiges Beispiel: Eine Webanwendung ermöglicht über eine einfache Anfrage Zugriff auf sensible Daten wie Bankkonten, etwa mit example.com/accounts?id={account_id}. Prüft die Anwendung die Berechtigungen der anfragenden Person nicht wirksam, können unbefugte Benutzer Kontoinformationen einsehen oder manipulieren.
IDOR durch Dateiverweise
Bei dieser Art von IDOR werden Dateien unbefugt abgerufen. Speichert eine Chat-Anwendung beispielsweise vertrauliche Gesprächsprotokolle in nummerierten Dateien mit fortlaufenden Nummern, könnte ein Angreifer über ähnlich nummerierte Anfragen auf private Unterhaltungen zugreifen – example.com/1.log, example.com/2.log und so weiter.
Blinder IDOR
Von einem blinden IDOR spricht man, wenn die Ausnutzung in der Serverantwort nicht direkt sichtbar ist, obwohl möglicherweise eine unbefugte Änderung vorgenommen wurde. Bei einem blinden IDOR kann ein Angreifer die privaten Daten eines anderen Benutzers ändern, ohne sie einzusehen. Ermöglicht eine Webanwendung einem Benutzer beispielsweise, seine Profileinstellungen über einen API-Aufruf wie example.com/users/update?id={user_id} zu ändern, könnte ein Angreifer den Wert von user_id in der Anfrage manipulieren und so die Profileinstellungen eines Benutzers ändern, ohne dessen Daten direkt einzusehen.
Gängige Muster, an denen wir IDOR-Schwachstellen im Code erkennen
Um IDOR-Schwachstellen im Code zu erkennen, müssen Sie aufmerksam sein und gängige Muster kennen:
Fehlende Zugriffskontrolle: Eine Anwendung, die Benutzereingaben verwendet, um direkt auf Ressourcen zuzugreifen, ohne die Berechtigung des Benutzers zu prüfen, weist wahrscheinlich eine IDOR-Schwachstelle auf.
Erratbare Kennungen: Leicht zu erratende Kennungen – etwa fortlaufende Ganzzahlen (
user_id=99001) oder kurze Zeichenfolgen (user_id=user1) – erhöhen das Risiko von IDOR-Schwachstellen in einer Anwendung. Schwer zu erratende Kennungen wie Universally Unique Identifiers (UUIDs) können dieses Risiko verringern.Direkter Dateizugriff: Eine Anwendung, die Benutzern über URLs oder Anfrageparameter direkten Zugriff auf beliebige Ressourcen wie Bilder oder CSV-Dateien gewährt, ist anfällig für IDORs. Wir müssen geeignete Kontrollmechanismen einrichten, damit Benutzer nicht direkt auf Dateien zugreifen können.
Eine Python-Anwendung mit IDOR und FastAPI erstellen
In diesem Abschnitt erstellen wir mit dem Python-Framework FastAPI eine Web-API, die anfällig für IDOR ist. Anschließend sehen wir uns an, wie sich die Schwachstelle beheben lässt.
Damit Sie diesem praxisorientierten Tutorial folgen können, stellen Sie bitte sicher, dass Python 3.x auf Ihrem Rechner installiert ist.
Erste Schritte
Zunächst benötigen wir eine neue Anwendung. Erstellen Sie ein neues Verzeichnis für Ihr Projekt und wechseln Sie in dieses Verzeichnis:
Installieren Sie anschließend FastAPI, Uvicorn, SQLAlchemy und SQLite mit folgendem Befehl:
Erstellen Sie zum Schluss im Projektverzeichnis eine Datei mit dem Namen main.py.
Eine anfällige API mit FastAPI erstellen
Nachdem wir die Verzeichnisstruktur eingerichtet und die erforderlichen Pakete installiert haben, schreiben wir nun den Code mit einer IDOR-Schwachstelle. Kopieren Sie dazu den folgenden Code in main.py:
Die IDOR-Schwachstelle befindet sich im Endpunkt /users/user_id. Da die Anwendung keine Zugriffskontrollen hat, kann jeder Benutzer die Daten anderer Benutzer einsehen, indem er den Wert von user_id in der URL ändert.
IDOR-Schwachstellen erkennen und beheben
Sehen wir uns nun an, wie wir die Sicherheitslücke durch IDOR in unserer FastAPI-Anwendung finden und beheben.
Schwachstellen finden
Um IDOR-Schwachstellen zu erkennen, müssen wir im Code nach bestimmten Mustern suchen. In der FastAPI-Anwendung sollten wir den Endpunkt /users/{user_id} untersuchen, der aus folgenden Gründen eine potenzielle IDOR-Schwachstelle darstellt:
Ungeschützte direkte Objektverweise: In der Funktion
get_user_by_idverweist der Parameteruser_iddirekt auf das DatenbankobjektUser. Jeder Client könnte den Wert vonuser_idin der Anfrage manipulieren und auf die Daten anderer Benutzer zugreifen, da keine Zugriffskontrollmechanismen diesen direkten Verweis schützen.Fehlende Berechtigungsprüfung: In derselben Funktion
get_user_by_idwird nicht geprüft, ob der anfragende Benutzer berechtigt ist, auf die angeforderten Benutzerdaten zuzugreifen. Jeder Benutzer kann durch Manipulation des Parametersuser_idauf die Daten anderer Benutzer zugreifen.
Anfälligen Code beheben
Um die IDOR-Schwachstelle zu beheben, müssen wir den Endpunkt /users/{user_id} um geeignete Zugriffskontrollen ergänzen.
Simulieren wir einen authentifizierten Benutzer und erlauben wir den Zugriff nur dann, wenn user_id in der URL mit der ID des authentifizierten Benutzers übereinstimmt. Zur Veranschaulichung nehmen wir an, dass der authentifizierte Benutzer die ID 1 hat. Hier ist der aktualisierte Code:
In diesem Codeblock haben wir eine Zugriffskontrolle ergänzt, die den Wert von user_id aus der URL mit authenticated_user_id vergleicht. Stimmen die IDs nicht überein, gibt die Anwendung den HTTP-Fehler 403 Forbidden zurück. Dadurch wird verhindert, dass unbefugte Benutzer auf die Informationen anderer Benutzer zugreifen können, und die IDOR-Schwachstelle ist behoben.
Sicherheitsprobleme mit Snyk erkennen und beheben
Snyk ist eine Sicherheitslösung mit Funktionen für Software Composition Analysis (SCA) und Static Application Security Testing (SAST). Nutzen wir Snyk, um Sicherheitsprobleme in unserer FastAPI-Anwendung zu finden und zu beheben.
Snyk CLI installieren und authentifizieren
Installieren Sie zunächst die Snyk CLI auf Ihrem Rechner. Folgen Sie dazu der Installationsanleitung in der Dokumentation.
Nach der Installation der CLI müssen Sie Ihr Snyk-Konto authentifizieren. Führen Sie dazu im Terminal den Befehl snyk auth aus. Daraufhin öffnet sich ein Browserfenster, in dem Sie sich mit Ihrem GitHub- oder Google-Konto anmelden können.
Abhängigkeiten auf Schwachstellen prüfen
Um das Projekt auf Schwachstellen in Drittanbieterbibliotheken zu prüfen, benötigen wir eine Datei requirements.txt. Erstellen Sie requirements.txt mit folgendem Befehl:
Prüfen Sie anschließend die Projektabhängigkeiten auf Schwachstellen, indem Sie den folgenden Befehl im Terminal ausführen:
Dieser Befehl analysiert Ihre Abhängigkeiten, identifiziert und beschreibt Schwachstellen, nennt deren Schweregrad und gibt Hinweise zur Behebung. So könnten Sie beispielsweise eine Denial-of-Service-Schwachstelle (DoS) mittleren Schweregrads in starlette@0.14.2 entdecken.
Hinweis: Snyk kann das Projekt nicht prüfen, wenn ein erforderliches Paket fehlt. Mit dem Flag –skip-unresolved lässt sich dieses Verhalten umgehen.
Schwachstellen mit Snyk beheben
Snyk kann Ihnen auch dabei helfen, Schwachstellen zu beheben. Der Befehl snyk fix kann einige der erkannten Probleme automatisch beheben. Snyk aktualisiert oder patcht die betroffenen Abhängigkeiten auf sichere Versionen, damit Ihre Anwendungen auf dem neuesten Stand und geschützt bleiben.
Snyk Code für die statische Codeanalyse verwenden
Snyk bietet außerdem eine leistungsstarke Lösung für Static Application Security Testing (SAST). Mit dem Befehl snyk code können Sie Ihren Anwendungscode analysieren, Sicherheitsprobleme erkennen und detaillierte Informationen zu deren Behebung erhalten.
Führen Sie den folgenden Befehl im Terminal aus, um snyk code zu verwenden:
Snyk Code analysiert Ihre Codebasis eingehend und hebt vorhandene Sicherheitslücken hervor. Darüber hinaus erhalten Sie Empfehlungen zur Behebung dieser Probleme, damit Sie eine sichere und zuverlässige Anwendung betreiben können.
IDOR-Schwachstellen erklärt
Als Entwickler müssen wir sicherstellen, dass unsere Anwendungen geschützt sind. IDORs stellen eine Bedrohung für Webanwendungen dar. Deshalb müssen wir lernen, sie zu finden und zu beheben. Mit einem guten Verständnis von IDOR-Schwachstellen können Sie leistungsstarke und sichere Python-Anwendungen entwickeln.
In diesem Tutorial haben Sie gelernt, wie Sie IDOR-Schwachstellen in einer Python-Anwendung finden und patchen. Außerdem haben wir untersucht, wie Snyk Sie dabei unterstützen kann, Sicherheitsrisiken in Ihren Projektabhängigkeiten und im Anwendungscode selbst zu erkennen und zu beheben. Snyk ist ein leistungsstarkes Sicherheitstool. Wenn Sie es in Ihren Entwicklungsalltag integrieren, erhalten Sie eine zusätzliche Schutzschicht, die Ihren Code robust hält.
Werfen Sie mit einer kostenlosen Testversion einen genaueren Blick unter die Haube von Snyk.
Starten Sie mit Capture the Flag
Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.
