\n\n\n\n Tutoriel zum Sandboxing von Agents: Sichere LLM-Anwendungen erstellen - BotSec \n

Tutoriel zum Sandboxing von Agents: Sichere LLM-Anwendungen erstellen

📖 18 min read3,561 wordsUpdated Mar 28, 2026

Einführung in das Sandboxing von Agenten

Während große Sprachmodelle (LLMs) sich von einfachen Konversationsagenten zu leistungsstarken autonomen Entitäten entwickeln, die in der Lage sind, Code auszuführen, mit externen APIs zu interagieren und Entscheidungen in der realen Welt zu treffen, wird die Notwendigkeit solider Sicherheitsmaßnahmen entscheidend. Ein LLM-Agent kann, wenn ihm die Fähigkeit gegeben wird zu handeln, ein erhebliches Sicherheitsrisiko darstellen, wenn er nicht ordnungsgemäß eingeschränkt ist. Hier kommt das Sandboxing von Agenten ins Spiel. Das Sandboxing eines Agenten bedeutet, eine isolierte Umgebung zu schaffen, in der er arbeiten kann, ohne das Hostsystem zu beeinträchtigen oder auf unautorisierte Ressourcen zuzugreifen. Dieses Tutorial wird die praktischen Aspekte des Sandboxing von Agenten erkunden und praktische Beispiele liefern, um zu demonstrieren, wie man sichere und zuverlässige LLM-Anwendungen erstellt.

Das zentrale Prinzip des Sandboxing ist das Prinzip der geringsten Privilegien: Ein Agent sollte nur auf die Ressourcen zugreifen dürfen, die für seine Funktionalität unbedingt notwendig sind, und nicht mehr. Ohne angemessenes Sandboxing könnte ein bösartiger oder fehlgeleiteter Agent:

  • Willkürlichen Code auf dem Hostsystem ausführen, was zu Datendiebstahl oder einer Kompromittierung des Systems führen könnte.
  • Auf sensible Dateien oder Netzwerkressourcen zugreifen.
  • Ungewollte externe API-Aufrufe initiieren, die Kosten verursachen oder unautorisierte Aktionen durchführen.
  • Vertrauliche Daten über verschiedene Kanäle exfiltrieren.

Durch die Implementierung eines effektiven Sandboxing können wir diese Risiken mindern und es uns ermöglichen, die enorme Power von LLM-Agenten zu nutzen, während wir die Kontrolle und Sicherheit beibehalten.

Bedrohungen Verstehen: Warum Sandboxing?

Bevor wir das „Wie“ erkunden, festigen wir das „Warum“. Die Bedrohungen, die von nicht gesandboxten Agenten ausgehen, sind vielfältig und können wie folgt kategorisiert werden:

1. Codeausführungsanfälligkeiten

Viele fortgeschrittene LLM-Agenten sind darauf ausgelegt, Code zu schreiben und auszuführen (z. B. Python-Skripte), um Probleme zu lösen, Daten zu analysieren oder mit Tools zu interagieren. Wenn diese Ausführung nicht eingeschränkt wird, könnte der Agent:

  • Befehlsaus injection: Code generieren, der os.system('rm -rf /') oder ähnliche destruktive Befehle aufruft.
  • Remote Code Execution (RCE): Schwachstellen in Bibliotheken ausnutzen, um die Kontrolle über den Host zu übernehmen.
  • Ressourcen erschöpfen: Unendliche Schleifen erstellen oder übermäßigen Speicher/CPU zuweisen, was zu einem Denial of Service führt.

2. Datenzugriff und Exfiltration

Ein Agent könnte damit beauftragt werden, sensible Daten zu verarbeiten. Ohne Sandboxing könnte er:

  • Unbefugter Dateizugriff: Dateien außerhalb seines vorgesehenen Arbeitsverzeichnisses lesen (z. B. /etc/passwd, API-Schlüssel).
  • Netzzugriff: Sich mit internen Netzwerkressourcen, externen böswilligen Servern verbinden oder Daten zu beliebigen Endpunkten exfiltrieren.
  • Prompt-Injection über Dateilesen: Wenn ein Agent beliebige Dateien lesen kann, könnte ein bösartiger Akteur einen Prompt erstellen, der den Agenten täuscht, eine sensible Datei zu lesen und deren Inhalt dann in eine spätere Ausgabe einzufügen.

3. Missbrauch von APIs und Tools

Agenten interagieren oft mit externen APIs oder benutzerdefinierten Tools. Unbeschränkter Zugriff kann zu:

  • Unbefugten API-Aufrufen: API-Aufrufe an sensible Schnittstellen machen, auf die er nicht zugreifen sollte (z. B. Benutzerverwaltung, Zahlungsabwicklung).
  • Kostenüberschreitungen: Teure API-Aufrufe oder ressourcenintensive Cloud-Funktionen auslösen.
  • Bösartige Handlungen: Wenn ein Agent Zugriff auf eine E-Mail-API hat, könnte er Spam-E-Mails oder Phishing-Nachrichten senden.

Sandboxing-Techniken und -Tools

Es gibt mehrere Schichten und Techniken, die wir für das Sandboxing von Agenten einsetzen können, von einfacher Codeüberprüfung bis hin zu anspruchsvoller Containerisierung.

1. Sandboxing auf Sprachebene (Interpreter-Einschränkungen)

Wenn Ihr Agent hauptsächlich Code generiert und ausführt (z. B. Python), können Sie die Fähigkeiten des Interpreters einschränken.

Beispiel: Eingeschränkte Python-Ausführung mit exec() und Whitelist

Ein häufiger Anwendungsfall ist ein Agent, der Python-Code generiert. Anstatt direkt exec() oder eval() auf beliebigen Zeichenfolgen aufzurufen, können Sie die verfügbaren globals und built-ins einschränken.


import subprocess
import os

def safe_execute_python_code(code: str, allowed_modules: list = None, timeout: int = 10):
 if allowed_modules is None:
 allowed_modules = ['math', 'json', 're'] # Whitelist von sicheren Modulen

 # Erstelle einen eingeschränkten globalen Namensraum
 restricted_globals = {
 '__builtins__': {key: globals()['__builtins__'][key] for key in [
 'print', 'len', 'str', 'int', 'float', 'list', 'dict', 'tuple', 'set', 
 'range', 'sum', 'min', 'max', 'abs', 'round', 'type', 'isinstance', 'enumerate'
 ]},
 '__name__': '__main__'
 }

 # Dynamisch die erlaubten Module in den eingeschränkten Namensraum importieren
 for module_name in allowed_modules:
 try:
 restricted_globals[module_name] = __import__(module_name)
 except ImportError:
 print(f"Warnung: Konnte das erlaubte Modul {module_name} nicht importieren")

 try:
 # Verwende subprocess, um in einem isolierten Prozess auszuführen für bessere Isolation
 # Das ist sicherer als nur `exec` im aktuellen Prozess zu verwenden
 # und ermöglicht Zeitüberschreitungen und Ressourcenkontrollen.
 process = subprocess.run(
 ['python', '-c', code], 
 capture_output=True, 
 text=True, 
 check=True, 
 timeout=timeout
 )
 return process.stdout
 except subprocess.CalledProcessError as e:
 return f"Fehler während der Ausführung: {e.stderr}"
 except subprocess.TimeoutExpired:
 return "Fehler: Codeausführung hat zeitlich überschritten."
 except Exception as e:
 return f"Ein unerwarteter Fehler ist aufgetreten: {e}"

# Beispiel für die Verwendung:
# Sicherer Code
agent_code_safe = "import math; print(math.sqrt(16))"
print(f"Sichere Codeausgabe: {safe_execute_python_code(agent_code_safe)}")

# Versuch von bösartigem Code (wird durch die subprocess-Isolation und die built-in-Einschränkungen blockiert, wenn exec direkt verwendet worden wäre)
# Mit subprocess würde auch der Import 'os' im Kindprozess fehlschlagen, es sei denn, er ist ausdrücklich erlaubt.
agent_code_malicious_os = "import os; print(os.listdir('/'))"
print(f"Bösartige OS-Codeausgabe: {safe_execute_python_code(agent_code_malicious_os)}")

# Versuch von bösartigem Code (Versuch, eine Datei zu lesen)
agent_code_malicious_file = "with open('/etc/passwd', 'r') as f: print(f.read())"
print(f"Bösartiger Dateilesen-Codeausgabe: {safe_execute_python_code(agent_code_malicious_file)}")

# Code mit einer unendlichen Schleife (wird durch die Zeitüberschreitung gestoppt)
agent_code_loop = "while True: pass"
print(f"Schleifen-Codeausgabe: {safe_execute_python_code(agent_code_loop, timeout=3)}")

Erklärung:

  • Wir definieren eine Funktion safe_execute_python_code.
  • Sie nimmt den vom Agenten generierten Code als Eingabe.
  • Anstatt direkt im aktuellen Prozess auszuführen, verwenden wir subprocess.run. Dies ist ein entscheidender Schritt für eine echte Isolation, da es den Code in einem separaten Python-Interpreter-Prozess ausführt. Dieser Prozess erbt minimale Privilegien und ist nicht derselbe wie der übergeordnete Prozess, der Ihre Hauptanwendung ausführt.
  • Die Liste allowed_modules dient als Whitelist. Selbst wenn der Agent versucht, os oder sys zu importieren, werden diese Module im eingeschränkten Umfeld des subprocess nicht verfügbar sein, es sei denn, sie sind ausdrücklich erlaubt (was für den allgemeinen Agentencode nicht der Fall sein sollte).
  • timeout verhindert Ressourcenerschöpfung durch unendliche Schleifen.
  • capture_output=True und text=True ermöglichen es uns, die Ausgabe des Agenten zu erfassen.
  • check=True wirft eine Ausnahme, wenn der subprocess einen non-zero Exit-Code zurückgibt (was einen Fehler anzeigt).

Obwohl dieser Ansatz die Sicherheit im Vergleich zur direkten Verwendung von exec() erheblich verbessert, ist er nicht narrensicher. Ein sehr ausgeklügelter Agent könnte dennoch Wege finden, um die zugrunde liegenden Systemaufrufe auszunutzen, wenn die Python-Umgebung selbst anfällig ist oder zu viele Module auf der Whitelist stehen.

2. Sandboxing auf Betriebssystemebene (Container & Virtuelle Maschinen)

Für das solideste Sandboxing, insbesondere wenn Agenten Code in mehreren Sprachen generieren oder mit dem Dateisystem/dem Netzwerk interagieren könnten, ist eine Isolation auf Betriebssystemebene unerlässlich.

a. Docker-Container

Docker ist eine hervorragende Wahl für das Sandboxing. Jede Ausführung eines Agenten kann in ihrem eigenen temporären Container mit streng definierten Ressourcenlimits und Netzwerkzugriffsrichtlinien stattfinden.

Anwendungsbeispiel: Docker für die Ausführung des Agenten

Schritt 1: Erstellen Sie eine Dockerfile für die Ausführungsumgebung des Agenten.


# Dockerfile
FROM python:3.9-slim-buster

WORKDIR /app

# Einen nicht-root Nutzer für die Sicherheit erstellen
RUN useradd --no-create-home --shell /bin/bash agentuser
USER agentuser

# Ein einfaches Skript kopieren, das der Agent generieren könnte und das wir ausführen wollen
COPY run_agent_code.py .

ENTRYPOINT ["python", "run_agent_code.py"]

Schritt 2: Erstellen Sie run_agent_code.py. Dieses Skript wird den vom Agenten generierten Code empfangen.


# run_agent_code.py
import sys
import os

# Simulation des Empfangs von Code vom Agenten (z. B. über stdin oder eine Datei)
# Für dieses Beispiel nehmen wir an, dass der Code als Argument übergeben oder hier direkt geschrieben wird

if __name__ == "__main__":
 agent_code = "print('Hello from the sandboxed agent!')"
 if len(sys.argv) > 1:
 agent_code = sys.argv[1] # Ermöglicht das Übergeben des Codes als Argument

 try:
 # Den Code ausführen. Hinweis: Der Docker-Container selbst ist die Sandbox.
 # Wir könnten dennoch Einschränkungen auf Sprachebene *in* diesem Skript wollen
 # für eine zusätzliche Ebene, aber die Hauptisolierung erfolgt durch den Container.
 exec(agent_code)
 except Exception as e:
 print(f"Die Ausführung des Agentencodes ist fehlgeschlagen: {e}", file=sys.stderr)
 sys.exit(1)

 # Eingeschränkten Zugriff demonstrieren
 try:
 print(f"Versuch, das Root-Verzeichnis aufzulisten: {os.listdir('/')}")
 except Exception as e:
 print(f"Das Auflisten des Root-Verzeichnisses war nicht möglich (erwartet): {e}")

 try:
 with open('/etc/passwd', 'r') as f:
 print(f.read())
 except Exception as e:
 print(f"Das Lesen von /etc/passwd war nicht möglich (erwartet): {e}")

Schritt 3: Führen Sie den Agentencode von Ihrer Hauptanwendung aus.


import docker

client = docker.from_env()

def execute_agent_in_docker(agent_code: str, cpu_limit: float = 0.5, mem_limit: str = '128m', network_enabled: bool = False):
 try:
 # Image erstellen, wenn es nicht existiert (kann einmalig gemacht werden)
 # client.images.build(path='.', tag='agent-sandbox-env')

 # Eine temporäre Datei erstellen, um den Code des Agenten sicher zu übergeben
 # Oder als Umgebungsvariable oder als Befehlszeilenargument übergeben
 # Zur Vereinfachung übergeben wir es hier als Befehlszeilenargument.

 container = client.containers.run(
 'agent-sandbox-env',
 command=['python', 'run_agent_code.py', agent_code], # Code als Argument übergeben
 detach=False, # Im Vordergrund ausführen, auf das Ende warten
 remove=True, # Container nach dem Beenden automatisch löschen
 # Ressourcenlimits
 cpu_period=100000, # CPU-Zeitraum in Mikrosekunden
 cpu_quota=int(cpu_limit * 100000), # CPU-Quota (z. B. 50000 für 0.5 CPU)
 mem_limit=mem_limit, # Speicherlimit
 # Netzwerkbeschränkungen
 network_mode='none' if not network_enabled else 'bridge',
 # Beschränkungen des Dateisystems (Root im Nur-Lese-Modus, keine Mounts für den Agentencode)
 read_only=True, # Macht das Dateisystem des Containers nach der ursprünglichen Konfiguration nurLesen
 # Sicherheitsoptionen (z. B. privilegierten Modus deaktivieren, Fähigkeiten entfernen)
 security_opt=['no-new-privileges'],
 cap_drop=['ALL'], # Entfernt alle Fähigkeiten für den Container
 # Umgebungsvariablen (können verwendet werden, um API-Keys zu übergeben, aber vorsichtig sein)
 # environment={
 # 'API_KEY': 'some_safe_key' # Nur wenn unbedingt notwendig und in einem begrenzten Rahmen
 # }
 )
 return container.decode('utf-8')
 except docker.errors.ContainerError as e:
 return f"Containerfehler: {e.stderr.decode('utf-8')}"
 except docker.errors.ImageNotFound:
 return "Fehler: Docker-Image 'agent-sandbox-env' nicht gefunden. Bitte zuerst erstellen."
 except Exception as e:
 return f"Ein unerwarteter Docker-Fehler ist aufgetreten: {e}"

# Zuerst das Docker-Image erstellen: docker build -t agent-sandbox-env .
# Dann dieses Python-Skript ausführen.

# Beispiel 1: Ausführung von sicherem Code
safe_code = "print('Hello from sandboxed agent!')"
print("\n--- Ausführung von Sicherem Code ---")
print(execute_agent_in_docker(safe_code))

# Beispiel 2: Versuch, auf das Dateisystem zuzugreifen (sollte durch read_only=True und Benutzerberechtigungen blockiert werden)
malicious_fs_code = "import os; print(os.listdir('/'))"
print("\n--- Versuch des Bösartigen Zugriffs auf das Dateisystem ---")
print(execute_agent_in_docker(malicious_fs_code))

# Beispiel 3: Versuch, eine Datei zu erstellen (sollte fehlschlagen)
malicious_write_code = "with open('/app/evil.txt', 'w') as f: f.write('malicious')"
print("\n--- Versuch der Bösartigen Beschriftung ---")
print(execute_agent_in_docker(malicious_write_code))

# Beispiel 4: Versuch, auf das Netzwerk zuzugreifen (sollte fehlschlagen, wenn network_mode='none')
malicious_network_code = "import requests; print(requests.get('http://example.com').status_code)"
print("\n--- Versuch des Bösartigen Netzwerkzugriffs (deaktiviert) ---")
print(execute_agent_in_docker(malicious_network_code, network_enabled=False))

# Beispiel 5: Zugriff auf das Netzwerk (wenn es ausdrücklich aktiviert ist - vorsichtig sein!)
# print("\n--- Zugriff auf das Netzwerk (aktiviert - zur Demonstration) ---")
# print(execute_agent_in_docker("import requests; print(requests.get('http://example.com').status_code)", network_enabled=True))

Erklärung:

  • Dockerfile: Erstellt eine minimale Python-Umgebung. Entscheidend ist, dass ein nicht-root Nutzer (agentuser) erstellt und gewechselt wird, um die Berechtigungen innerhalb des Containers zu minimieren.
  • run_agent_code.py: Dies ist der Einstiegspunkt im Container. Es führt den vom Agenten bereitgestellten Code aus. Es enthält Versuche, auf eingeschränkte Ressourcen zuzugreifen, um die Wirksamkeit der Sandbox zu demonstrieren.
  • Python-Skript (execute_agent_in_docker):
    • client.containers.run(...): Hier passiert die Magie.
    • remove=True: Stellt sicher, dass die Container nach der Ausführung bereinigt werden.
    • cpu_quota, mem_limit: Wesentlich, um Ressourcenverbrauch zu verhindern.
    • network_mode='none': Kritisch, um den Netzwerkzugang zu deaktivieren. Dies verhindert, dass Agenten externe Aufrufe tätigen oder sich mit internen Diensten verbinden. Nur aktivieren, wenn der Agent unbedingt Netzwerkzugang zu bestimmten externen APIs benötigt.
    • read_only=True: Macht das Dateisystem des Containers nach der Initialisierung nurLesen. Dies verhindert, dass der Agent Dateien schreibt oder Systemkonfigurationen ändert.
    • security_opt=['no-new-privileges'], cap_drop=['ALL']: Erweiterte Sicherheitsoptionen zur weiteren Einschränkung der Fähigkeiten im Container.

Docker bietet eine starke Isolationsbarriere, aber es ist entscheidend, es sicher zu konfigurieren. Verwenden Sie immer nicht-root Nutzer, deaktivieren Sie unnötige Fähigkeiten und schränken Sie den Netzwerk-/Dateizugriff ein.

b. Virtuelle Maschinen (VMs)

Für das höchste Isolationsniveau, insbesondere in Multi-User-Umgebungen oder bei der Verarbeitung von hochriskantem Code, bieten VMs (z. B. KVM, AWS Firecracker, Google Cloud Sandbox) eine Trennung auf Hardwareebene. Dies ist komplexer einzurichten und zu verwalten, bietet jedoch eine separate Umgebung für jede Agentenausführung.

3. Einschränkungen auf Werkzeug-/API-Ebene (Funktionsaufruf)

Viele LLM-Agenten interagieren mit externen Werkzeugen oder APIs über den Funktionsaufruf. Diese Sandbox-Schicht erfordert ein durchdachtes Design der dem Agenten exponierten Werkzeuge.

Beispiel: Eingeschränkter API-Zugriff über Pydantic und Whitelist

Bei der Definition von Werkzeugen für einen Agenten stellen Sie sicher, dass sie so granular und permissionsmäßig eingeschränkt wie möglich sind.


from typing import Literal, Optional
from pydantic import BaseModel, Field

# Definieren der erlaubten Werkzeuge und deren Schemata

class SearchToolInput(BaseModel):
 query: str = Field(description="Die Suchanfrage")
 max_results: int = Field(default=5, description="Maximale Anzahl an Suchergebnissen")

class SendEmailInput(BaseModel):
 recipient: str = Field(description="Die E-Mail-Adresse des Empfängers")
 subject: str = Field(description="Der Betreff der E-Mail")
 body: str = Field(description="Der Inhalt des E-Mail-Korpus")
 # Einschränkung der erlaubten Empfänger
 allowed_recipients: Literal["[email protected]", "[email protected]"] = Field(
 description="Nur spezifische und vorab genehmigte Empfänger sind erlaubt."
 )

class DatabaseQueryInput(BaseModel):
 query: str = Field(description="Die auszuführende SQL-Abfrage")
 # KRIITISCH: Keine willkürlichen SQL-Abfragen erlauben. Filtern oder ORM verwenden.
 allowed_tables: Literal["products", "users_public"] = Field(
 description="Nur Abfragen gegen erlaubte Tabellen sind erlaubt."
 )
 read_only: bool = Field(default=True, description="Nur Leseoperationen zulassen")

# Simulieren der Funktionen der Werkzeuge
def search_web(query: str, max_results: int):
 print(f"Websuche nach '{query}' mit {max_results} Ergebnissen.")
 return [f"Ergebnis {i} für {query}" for i in range(max_results)]

def send_restricted_email(recipient: str, subject: str, body: str, allowed_recipients: Literal["[email protected]", "[email protected]"]):
 if recipient not in ["[email protected]", "[email protected]"]:
 raise ValueError(f"Nicht autorisierter Empfänger: {recipient}")
 print(f"Versenden der E-Mail an {recipient} mit dem Betreff '{subject}'.")
 return {"status": "gesendet", "recipient": recipient}

def execute_database_query(query: str, allowed_tables: Literal["products", "users_public"], read_only: bool):
 # In einem realen Szenario sollten Sie die SQL-Abfrage gründlich analysieren und validieren
 # und sicherstellen, dass sie nur die allowed_tables betrifft und im Nur-Lese-Modus ist.
 print(f"Ausführen der DB-Abfrage auf {allowed_tables} (read_only={read_only}) : {query}")
 if not read_only or not any(table in query.lower() for table in allowed_tables):
 raise ValueError("Operation oder Zugriff auf die Tabelle nicht erlaubt.")
 return [{"id": 1, "name": "Artikel A"}] # Fiktives Ergebnis

# Hier ist, was Sie dem LLM-Agenten exposieren würden
agent_tools = {
 "search_web": {"func": search_web, "schema": SearchToolInput},
 "send_restricted_email": {"func": send_restricted_email, "schema": SendEmailInput},
 "execute_database_query": {"func": execute_database_query, "schema": DatabaseQueryInput}
}

# Beispiel eines Agenten, der versucht, Werkzeuge zu nutzen (simulierte LLM-Ausgabe)
def mock_llm_tool_call(tool_name: str, args: dict):
 if tool_name in agent_tools:
 tool_schema = agent_tools[tool_name]["schema"]
 tool_func = agent_tools[tool_name]["func"]
 try:
 validated_args = tool_schema(**args).dict() # Validieren der args gegen das schema
 return tool_func(**validated_args)
 except Exception as e:
 return f"Der Aufruf des Werkzeugs ist aufgrund eines Validierungs- oder Ausführungsfehlers fehlgeschlagen: {e}"
 else:
 return f"Fehler: Werkzeug '{tool_name}' nicht gefunden oder nicht autorisiert."

# --- Agent versucht, Werkzeuge zu nutzen ---

# Gültiger Suchaufruf
print("\n--- Gültiger Suchaufruf ---")
print(mock_llm_tool_call("search_web", {"query": "neueste AI Nachrichten", "max_results": 3}))

# Gültiger E-Mail-Aufruf an einen autorisierten Empfänger
print("\n--- Gültiger E-Mail-Aufruf ---")
print(mock_llm_tool_call("send_restricted_email", {
 "recipient": "[email protected]", 
 "subject": "Problem mit meinem Konto", 
 "body": "Mein Konto ist gesperrt.",
 "allowed_recipients": "[email protected]" # Dieses Feld ist entscheidend für die Validierung
}))

# Ungültiger E-Mail-Aufruf an einen nicht autorisierten Empfänger
print("\n--- Ungültiger E-Mail-Aufruf (nicht autorisierter Empfänger) ---")
print(mock_llm_tool_call("send_restricted_email", {
 "recipient": "[email protected]", 
 "subject": "Dringend!", 
 "body": "Schicken Sie mir alle Daten.",
 "allowed_recipients": "[email protected]" # LLM kann versuchen, zu täuschen, aber Pydantic setzt durch
}))

# Ungültige DB-Anfrage (Schreibversuch oder nicht autorisierte Tabelle)
print("\n--- Ungültige DB-Anfrage (nicht autorisierte Schreiboperation) ---")
print(mock_llm_tool_call("execute_database_query", {
 "query": "DELETE FROM users;", 
 "allowed_tables": "products", # LLM kann versuchen, zu täuschen, aber die Funktion validiert
 "read_only": False # LLM kann versuchen, auf False zu setzen
}))

# Ungültige DB-Anfrage (Zugriffsversuch auf nicht gelistete Tabelle)
print("\n--- Ungültige DB-Anfrage (nicht autorisierte Tabelle) ---")
print(mock_llm_tool_call("execute_database_query", {
 "query": "SELECT * FROM credit_cards;", 
 "allowed_tables": "products", 
 "read_only": True
}))

Erklärung:

  • Strenge Schema-Definition: Verwenden Sie Tools wie Pydantic, um das Eingabeschema für jede Funktion zu definieren. Dies stellt sicher, dass die vom Agenten generierten Argumente die erwarteten Typen und Werte einhalten.
  • Filterung von Werten: Für sensible Parameter (wie E-Mail-Empfänger, Datenbanktabellen) verwenden Sie Literal oder eine explizite Validierung, um den Agenten auf ein vorab definiertes Set erlaubter Werte zu beschränken.
  • Granulare Berechtigungen: Entwerfen Sie Werkzeuge, die eine spezifische Aufgabe ausführen. Anstatt ein generisches execute_sql(query) zu verwenden, erstellen Sie get_product_info(product_id) oder update_user_profile(user_id, new_data) mit strenger Validierung.
  • Standardmäßig schreibgeschützt: Für Datenbank- oder Dateisystemwerkzeuge sollten Sie standardmäßig den Zugang im Nur-Lese-Modus beschränken und eine ausdrückliche Genehmigung von einem Menschen für Schreiboperationen verlangen.
  • Validierung der Eingaben: Validieren Sie immer die Argumente, die an Ihre Werkzeugfunktionen übergeben werden, auch wenn sie die Pydantic-Validierung bestanden haben. Das LLM könnte immer noch auf den ersten Blick gültige, aber bösartige Eingaben erstellen (zum Beispiel eine SQL-Injection-Zeichenkette, die wie eine gültige Produkt-ID aussieht).

Best Practices für das Sandboxing von Agenten

  1. Prinzip der minimalen Berechtigung: Gewähren Sie dem Agenten die absolut minimalen Berechtigungen und Ressourcen, die für seine Aufgabe erforderlich sind.
  2. Schichtungssicherheit: Kombinieren Sie mehrere Sandboxing-Techniken (Sprachebene, Betriebssystemebene, Werkzeugeebene) für einen soliden Schutz. Keine einzelne Schicht ist unfehlbar.
  3. Ephemerale Umgebungen: Bevorzugen Sie bei der Ausführung von Code die Ausführung der Agenten in temporären Containern oder virtuellen Maschinen, die nach jeder Aufgabe zerstört werden.
  4. Strenge Validierung der Eingaben: Validieren und bereinigen Sie immer alle Eingaben, die vom LLM kommen, insbesondere bevor Sie sie in API-Aufrufen, Datenbankabfragen oder Codeausführungen verwenden.
  5. Überwachung und Protokollierung: Protokollieren Sie alle Aktionen des Agenten, die Werkzeugaufrufe und die Ressourcennutzung. Dies ist entscheidend, um anormales Verhalten zu erkennen und für die Nachanalyse nach einem Vorfall.
  6. Zeitlimits und Ressourcenlimits: Implementieren Sie strenge Zeitlimits für die Ausführung von Code und API-Aufrufen und setzen Sie CPU-/Speichergrenzen, um Denial-of-Service-Angriffe zu verhindern.
  7. Netzwerktrennung: Deaktivieren Sie standardmäßig den Netzwerkzugang für die Agenten. Aktivieren Sie ihn nur für spezifische Endpunkte und Protokolle, die zuvor genehmigt wurden, wenn unbedingt erforderlich.
  8. Schreibgeschützte Dateisysteme: Richten Sie die Umgebungen der Agenten, wenn möglich, mit schreibgeschützten Dateisystemen ein, um unautorisierte Änderungen oder Datenexfiltration zu verhindern.
  9. Keine Root-Nutzer: Führen Sie die Agentenprozesse immer als nicht-root-Nutzer mit begrenzten Berechtigungen im Sandbox aus.
  10. Regelmäßige Audits und Updates: Überprüfen Sie kontinuierlich Ihre Sandboxing-Konfigurationen, aktualisieren Sie Ihre Basis-Images und informieren Sie sich über neue Sicherheitsanfälligkeiten.

Fazit

Das Sandboxing von Agenten ist kein optionaler Luxus, sondern eine grundlegende Anforderung, um LLM-Agenten sicher bereitzustellen. Während diese Agenten fähiger und autonomer werden, steigt das Potenzial für Missbrauch oder unbeabsichtigte Schäden erheblich. Durch die Verwendung einer Kombination aus Sprachbeschränkungen, solider Containerisierung und sorgfältig gestalteten Werkzeugschnittstellen können Entwickler leistungsfähige LLM-Anwendungen entwickeln, die sowohl neu als auch sicher sind. Die in diesem Tutorial bereitgestellten Beispiele zeigen praktische Schritte zum Aufbau dieser sicheren Umgebungen, sodass Sie LLM-Agenten mit Vertrauen in Ihre Systeme integrieren können, während Sie die Risiken minimieren.

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: AI Security | compliance | guardrails | safety | security

Recommended Resources

ClawgoClawseoAgntapiAgntkit
Scroll to Top