Skip to main content

Unsichere direkte Objektverweise in Python finden und beheben

Artikel von

Keshav Malik

feature python linting

19. Juli 2023

0 Min. Lesezeit

Ein 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:

mkdir fastapi-app; cd fastapi-app

Installieren Sie anschließend FastAPI, Uvicorn, SQLAlchemy und SQLite mit folgendem Befehl:

pip install fastapi uvicorn sqlalchemy

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:

from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

app = FastAPI()

# SQLite database configuration
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

# User model
class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    uuid = Column(String, unique=True, index=True)
    username = Column(String, unique=True, index=True)
    email = Column(String, unique=True, index=True)

Base.metadata.create_all(bind=engine)

# Dependency for database session
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users/{user_id}")
async def get_user_by_id(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

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_id verweist der Parameter user_id direkt auf das Datenbankobjekt User. Jeder Client könnte den Wert von user_id in 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_id wird nicht geprüft, ob der anfragende Benutzer berechtigt ist, auf die angeforderten Benutzerdaten zuzugreifen. Jeder Benutzer kann durch Manipulation des Parameters user_id auf 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:

@app.get("/users/{user_id}")
async def get_secure_user(user_id: int, db: Session = Depends(get_db)):
    # Assume user authentication and authorization are performed here
    authenticated_user_id = "hbecec-edeek-wxwexe-cdcece" # better to use UUIDs

    if authenticated_user_id != user_id:
        raise HTTPException(status_code=403, detail="Not authorized to access this user")

    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

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:

pip freeze > requirements.txt

Prüfen Sie anschließend die Projektabhängigkeiten auf Schwachstellen, indem Sie den folgenden Befehl im Terminal ausführen:

snyk test --file=requirements.txt --skip-unresolved

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 test

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.