\n\n\n\n Agent Sandboxing Tutorial: Aufbau sicherer LLM-Anwendungen - BotSec \n

Agent Sandboxing Tutorial: Aufbau sicherer LLM-Anwendungen

📖 18 min read3,449 wordsUpdated Mar 28, 2026

Einführung in die Agenten-Sandboxing

Da große Sprachmodelle (LLMs) von einfachen Gesprächsagenten zu leistungsstarken autonomen Entitäten evolvieren, 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 einen erheblichen Sicherheitsrisiko darstellen, wenn er die Fähigkeit erhält zu handeln, es sei denn, er wird angemessen eingeschränkt. Hier kommt Agenten-Sandboxing ins Spiel. Die Sandboxierung eines Agenten bedeutet, eine isolierte Umgebung zu schaffen, in der er operieren kann, ohne das Host-System zu beeinträchtigen oder unbefugte Ressourcen zuzugreifen. Dieses Tutorial wird die praktischen Aspekte der Agenten-Sandboxing erkunden und praktische Beispiele bereitstellen, um zu demonstrieren, wie man sichere und zuverlässige LLM-Anwendungen erstellt.

Das Grundprinzip hinter der Sandboxierung ist das Minimalprinzip: Ein Agent sollte nur Zugang zu den Ressourcen haben, die unbedingt notwendig für seine Funktion sind, und nicht mehr. Ohne angemessene Sandboxierung könnte ein bösartiger oder fehlerhafter Agent:

  • Beliebigen Code auf dem Host-System ausführen, was zu Datendiebstahl oder Systemkompromittierung führen kann.
  • Auf vertrauliche Dateien oder Netzwerkressourcen zugreifen.
  • Unerwünschte externe API-Aufrufe initiieren, was Kosten verursachen oder unbefugte Aktionen ausführen könnte.
  • Vertrauliche Daten durch verschiedene Kanäle exfiltrieren.

Durch die Implementierung effektiver Sandboxierung können wir diese Risiken mindern und das immense Potenzial von LLM-Agenten nutzen, während wir Kontrolle und Sicherheit aufrechterhalten.

Die Bedrohungen verstehen: Warum Sandbox?

Bevor wir das ‘Wie’ erkunden, lassen Sie uns das ‘Warum’ festigen. Die Bedrohungen, die von nicht-sandboxierten Agenten ausgehen, sind vielschichtig und können wie folgt kategorisiert werden:

1. Codeausführungsanfälligkeiten

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

  • Systembefehl-Injection: Code generieren, der os.system('rm -rf /') oder ähnliche zerstörerische Befehle aufruft.
  • Remote Code Execution (RCE): Verwundbarkeiten in Bibliotheken ausnutzen, um Kontrolle über das Host-System zu erlangen.
  • Ressourcenausnutzung: Unendliche Schleifen erzeugen oder übermäßigen Speicher/CPU zuweisen, was zu einem Denial-of-Service führen kann.

2. Datenzugriff und Exfiltration

Ein Agent könnte beauftragt werden, vertrauliche Daten zu verarbeiten. Ohne Sandboxierung könnte er:

  • Unbefugter Datei-Zugriff: Dateien außerhalb seines vorgesehenen Arbeitsverzeichnisses lesen (z. B. /etc/passwd, API-Schlüssel).
  • Netzwerkzugang: Mit internen Netzwerkressourcen oder externen bösartigen Servern verbinden oder Daten an beliebige Endpunkte exfiltrieren.
  • Prompt-Injection über Dateilesen: Wenn ein Agent beliebige Dateien lesen kann, könnte ein böswilliger Akteur einen Prompt erstellen, der den Agenten dazu verleitet, eine vertrauliche Datei zu lesen und deren Inhalt in eine nachfolgende Ausgabe einzufügen.

3. Missbrauch von APIs und Tools

Agenten interagieren häufig mit externen APIs oder benutzerdefinierten Tools. Unbeschränkter Zugang kann zu folgendem führen:

  • Unbefugte API-Aufrufe: Anruf von sensiblen APIs, auf die er keinen Zugriff haben sollte (z. B. Benutzerverwaltung, Zahlungsabwicklung).
  • Kostenüberschreitungen: Teure API-Aufrufe oder ressourcenintensive Cloud-Funktionen auslösen.
  • Böswillige Aktionen: Wenn ein Agent Zugriff auf eine E-Mail-API hat, könnte er Spam oder Phishing-E-Mails senden.

Sandboxing-Techniken und -Werkzeuge

Es gibt mehrere Ebenen und Techniken, die wir für die Agenten-Sandboxing einsetzen können, von einfacher Codeüberprüfung bis hin zu ausgeklügelter Containerisierung.

1. Sandboxierung auf Sprachebene (Einschränkungen des Code-Interpreters)

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 Whitelisting

Ein häufiges Szenario ist, dass ein Agent Python-Code generiert. Anstatt exec() oder eval() direkt auf beliebigen Strings 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 sicherer Module

 # Erstellen eines eingeschränkten globalen Namensraums
 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__'
 }

 # Dynamisches Importieren erlaubter Module in den eingeschränkten Namensraum
 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:
 # Verwenden von subprocess zur Ausführung in einem isolierten Prozess für bessere Isolation
 # Das ist robuster als nur `exec` im aktuellen Prozess
 # und ermöglicht Zeitüberschreitungen und Ressourcengrenzen.
 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 Zeitüberschreitung."
 except Exception as e:
 return f"Ein unerwarteter Fehler ist aufgetreten: {e}"

# Beispielverwendung:
# 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 subprocess-Isolierung und Restriktionen der Built-ins blockiert, falls direkt exec verwendet wird)
# Mit subprocess würde der Import von 'os' im Kindprozess immer noch scheitern, es sei denn, er wird ausdrücklich erlaubt.
agent_code_malicious_os = "import os; print(os.listdir('/'))"
print(f"Ausgabe für bösartigen OS-Code: {safe_execute_python_code(agent_code_malicious_os)}")

# Versuch von bösartigem Code (versucht, eine Datei zu lesen)
agent_code_malicious_file = "with open('/etc/passwd', 'r') as f: print(f.read())"
print(f"Ausgabe für bösartigen Dateilese-Code: {safe_execute_python_code(agent_code_malicious_file)}")

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

Erklärung:

  • Wir definieren eine safe_execute_python_code-Funktion.
  • Sie nimmt den vom Agenten generierten Code als Eingabe.
  • Anstatt direkt im aktuellen Prozess auszuführen, verwenden wir subprocess.run. Das ist ein entscheidender Schritt für echte Isolation, da es den Code in einem separaten Python-Interpreter-Prozess ausführt. Dieser Prozess hat minimale Berechtigungen und ist nicht derselbe wie der übergeordnete Prozess, der Ihre Hauptanwendung ausführt.
  • Die allowed_modules-Liste fungiert als Whitelist. Selbst wenn der Agent versucht, os oder sys zu importieren, stehen sie in der eingeschränkten Umgebung des subprocess nicht zur Verfügung, es sei denn, sie werden ausdrücklich erlaubt (was sie für allgemeinen Agenten-Code nicht sein sollten).
  • timeout verhindert Ressourcenausnutzung durch unendliche Schleifen.
  • capture_output=True und text=True ermöglichen es uns, die Ausgabe des Agenten einzufangen.
  • check=True löst eine Ausnahme aus, wenn der subprocess einen anderen Rückgabewert als null liefert (was einen Fehler anzeigt).

Während dieser Ansatz die Sicherheit im Vergleich zu direktem exec() erheblich erhöht, ist er nicht narrensicher. Ein hochentwickelter Agent könnte immer noch Wege finden, zugrunde liegende Systemaufrufe auszunutzen, wenn die Python-Umgebung selbst verwundbar ist oder wenn zu viele Module auf die Whitelist gesetzt sind.

2. Sandboxierung auf Betriebssystemebene (Container & Virtuelle Maschinen)

Für die solideste Sandboxierung, insbesondere wenn Agenten Code in mehreren Sprachen generieren oder mit dem Dateisystem/dem Netzwerk interagieren könnten, ist eine Isolation auf Betriebssystemebene unverzichtbar.

a. Docker-Container

Docker ist eine hervorragende Wahl für das Sandboxing. Jede Ausführung eines Agenten kann innerhalb ihres eigenen, kurzlebigen Containers mit streng definierten Ressourcenlimits und Netzwerkzugriffsrichtlinien erfolgen.

Praktisches Beispiel: Docker für die Ausführung von Agenten

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


# Dockerfile
FROM python:3.9-slim-buster

WORKDIR /app

# Erstellen Sie einen non-root Benutzer aus Sicherheitsgründen
RUN useradd --no-create-home --shell /bin/bash agentuser
USER agentuser

# Kopieren Sie ein einfaches Skript, das der Agent möglicherweise generiert und das wir ausführen möchten
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

# Simuliere, dass Code vom Agenten empfangen wird (z. B. über stdin oder eine Datei)
# In diesem Beispiel nehmen wir an, dass der Code als Argument übergeben oder hier direkt geschrieben wird

if __name__ == "__main__":
 agent_code = "print('Hallo vom sandboxed Agenten!')"
 if len(sys.argv) > 1:
 agent_code = sys.argv[1] # Erlaube das Übergeben von Code als Argument

 try:
 # Führe den Code aus. Hinweis: Der Docker-Container selbst ist die Sandbox.
 # Wir möchten möglicherweise innerhalb dieses Skripts *sprachliche* Einschränkungen haben
 # für eine zusätzliche Sicherheitsebene, aber die primäre Isolation erfolgt im Container.
 exec(agent_code)
 except Exception as e:
 print(f"Die Ausführung des Agentencodes ist fehlgeschlagen: {e}", file=sys.stderr)
 sys.exit(1)

 # Zeige eingeschränkten Zugriff
 try:
 print(f"Versuche, das Root-Verzeichnis aufzulisten: {os.listdir('/')}")
 except Exception as e:
 print(f"Konnte das Root-Verzeichnis nicht auflisten (erwartet): {e}")

 try:
 with open('/etc/passwd', 'r') as f:
 print(f.read())
 except Exception as e:
 print(f"Konnte /etc/passwd nicht lesen (erwartet): {e}")

Schritt 3: Führen Sie den Code des Agenten aus 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:
 # Baue das Image, wenn es nicht existiert (kann einmal erledigt werden)
 # client.images.build(path='.', tag='agent-sandbox-env')

 # Erstelle eine temporäre Datei, um den Code des Agenten sicher zu übergeben
 # Oder übergebe ihn als Umgebungsvariable oder Argument in der Kommandozeile
 # Zur Vereinfachung übergeben wir ihn hier als Argument in der Kommandozeile.

 container = client.containers.run(
 'agent-sandbox-env',
 command=['python', 'run_agent_code.py', agent_code], # Übergebe den Code als Argument
 detach=False, # Im Vordergrund ausführen, auf Abschluss warten
 remove=True, # Container nach dem Verlassen automatisch entfernen
 # Ressourcenbeschränkungen
 cpu_period=100000, # CPU-Periode 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',
 # Dateisystembeschränkungen (schreibgeschütztes Root, keine Bind-Mounts für Agenten-Code)
 read_only=True, # Macht das Dateisystem des Containers nach der initialen Einrichtung schreibgeschützt
 # Sicherheitsoptionen (z. B. privilegierten Modus deaktivieren, Berechtigungen entziehen)
 security_opt=['no-new-privileges'],
 cap_drop=['ALL'], # Alle Berechtigungen für den Container entziehen
 # Umgebungsvariablen (kann verwendet werden, um API-Schlüssel zu übergeben, aber vorsichtig sein)
 # environment={
 # 'API_KEY': 'some_safe_key' # Nur wenn unbedingt notwendig und eingegrenzt
 # }
 )
 return container.decode('utf-8')
 except docker.errors.ContainerError as e:
 return f"Container-Fehler: {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: Sichere Codeausführung
safe_code = "print('Hallo vom sandboxed Agenten!')"
print("\n--- Sichere Codeausführung ---")
print(execute_agent_in_docker(safe_code))

# Beispiel 2: Versuch, auf das Dateisystem zuzugreifen (sollte durch read_only=True und Benutzerberechtigungen blockiert sein)
malicious_fs_code = "import os; print(os.listdir('/'))"
print("\n--- Versuch des böswilligen 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('böswillig')"
print("\n--- Versuch des böswilligen Schreibens ---")
print(execute_agent_in_docker(malicious_write_code))

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

# Beispiel 5: Netzwerkzugriff (wenn ausdrücklich aktiviert - seien Sie vorsichtig!)
# print("\n--- Netzwerkzugriff (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 minimalistische Python-Umgebung. Entscheidender Punkt ist, dass ein non-root Benutzer (agentuser) erstellt und gewechselt wird, um die Berechtigungen innerhalb des Containers zu minimieren.
  • run_agent_code.py: Dies ist der Einstiegspunkt innerhalb des Containers. Es führt den Code aus, der vom Agenten bereitgestellt wird. Es beinhaltet 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 Container nach der Ausführung aufgeräumt werden.
    • cpu_quota, mem_limit: Essenziell zur Vermeidung von Ressourcenerschöpfung.
    • 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 dringend Netzwerkk Zugriff für bestimmte, genehmigte externe APIs benötigt.
    • read_only=True: Macht das Dateisystem des Containers nach der Initialisierung schreibgeschützt. Dies verhindert, dass der Agent Dateien oder Systemkonfigurationen ändert.
    • security_opt=['no-new-privileges'], cap_drop=['ALL']: Erweitere Sicherheitsoptionen zur weiteren Einschränkung der Berechtigungen innerhalb des Containers.

Docker bietet eine starke Isolationsgrenze, aber es ist entscheidend, sie sicher zu konfigurieren. Verwenden Sie immer Nicht-Root-Benutzer, deaktivieren Sie unnötige Berechtigungen und beschränken Sie den Netzwerk-/Dateizugriff.

b. Virtuelle Maschinen (VMs)

Für das höchste Maß an Isolation, insbesondere in Multimieterumgebungen oder beim Umgang mit stark untrusted Code, bieten VMs (z. B. KVM, AWS Firecracker, Google Cloud Sandbox) hardwarelevel Trennung. Dies ist komplexer einzurichten und zu verwalten, bietet jedoch eine luftdichte Umgebung für jede Agentenausführung.

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

Viele LLM-Agenten interagieren über Funktionsaufrufe mit externen Tools oder APIs. Diese Sandbox-Ebene erfordert eine sorgfältige Gestaltung der Tools, die dem Agenten zur Verfügung stehen.

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

Stellen Sie beim Definieren von Tools für einen Agenten sicher, dass diese so granular und berechtigungsgebunden wie möglich sind.


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

# Definiere die 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 der E-Mail")
 # Erlaube nur spezifische Empfänger
 allowed_recipients: Literal["[email protected]", "[email protected]"] = Field(
 description="Nur spezifische, genehmigte Empfänger sind erlaubt."
 )

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

# Simuliere die Werkzeugfunktionen
def search_web(query: str, max_results: int):
 print(f"Suche im Web 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"Unbefugter Empfänger: {recipient}")
 print(f"Sende E-Mail an {recipient} mit dem Betreff '{subject}'.")
 return {"status": "sent", "recipient": recipient}

def execute_database_query(query: str, allowed_tables: Literal["products", "users_public"], read_only: bool):
 # In einem realen Szenario würdest du die SQL-Abfrage gründlich analysieren und validieren
 # und sicherstellen, dass sie nur erlaubte Tabellen betrifft und schreibgeschützt ist.
 print(f"Führe DB-Abfrage auf {allowed_tables} (read_only={read_only}) aus: {query}")
 if not read_only or not any(table in query.lower() for table in allowed_tables):
 raise ValueError("Unbefugte Datenbankoperation oder Tabellenauswahl.")
 return [{"id": 1, "name": "Artikel A"}] # Dummy-Ergebnis

# Das ist es, was du dem LLM-Agenten zur Verfügung stellen würdest
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 Argumente gemäß Schema
 return tool_func(**validated_args)
 except Exception as e:
 return f"Werkzeugaufruf gescheitert aufgrund von Validierungs- oder Ausführungsfehler: {e}"
 else:
 return f"Fehler: Werkzeug '{tool_name}' nicht gefunden oder unbefugt."

# --- 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-Abruf an einen erlaubten Empfänger
print("\n--- Gültiger E-Mail-Abruf ---")
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-Abruf an einen unbefugten Empfänger
print("\n--- Ungültiger E-Mail-Abruf (Unbefugter Empfänger) ---")
print(mock_llm_tool_call("send_restricted_email", {
 "recipient": "[email protected]", 
 "subject": "Dringend!", 
 "body": "Schicke mir alle Daten.",
 "allowed_recipients": "[email protected]" # LLM könnte versuchen, zu tricksen, aber Pydantic erzwingt
}))

# Ungültige DB-Abfrage (Versuch, zu schreiben oder auf unbefugte Tabellen zuzugreifen)
print("\n--- Ungültige DB-Abfrage (Unbefugtes Schreiben) ---")
print(mock_llm_tool_call("execute_database_query", {
 "query": "DELETE FROM users;", 
 "allowed_tables": "products", # LLM könnte versuchen, zu tricksen, aber die Funktion validiert
 "read_only": False # LLM könnte versuchen, auf False zu setzen
}))

# Ungültige DB-Abfrage (Versuch, auf nicht aufgeführte Tabelle zuzugreifen)
print("\n--- Ungültige DB-Abfrage (Unbefugte Tabelle) ---")
print(mock_llm_tool_call("execute_database_query", {
 "query": "SELECT * FROM credit_cards;", 
 "allowed_tables": "products", 
 "read_only": True
}))

Erklärung:

  • Strikte Schemadefinition: Verwende Werkzeuge wie Pydantic, um das Eingabeschema für jede Funktion zu definieren. Dies stellt sicher, dass die vom Agenten generierten Argumente den erwarteten Typen und Werten entsprechen.
  • Whitelisting von Werten: Für sensible Parameter (wie E-Mail-Empfänger, Datenbanktabellen) verwende Literal-Typen oder explizite Validierung, um den Agenten auf eine vordefinierte Menge von erlaubten Werten zu beschränken.
  • Detaillierte Berechtigungen: Gestalte Werkzeuge so, dass sie eine spezifische Aufgabe erledigen. Anstelle eines generischen execute_sql(query), erstelle 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, stelle standardmäßig nur schreibgeschützten Zugriff und erfordere explizite, von Menschen genehmigte Berechtigungen für Schreiboperationen.
  • Eingangsvalidierung: Überprüfe immer die Argumente, die an deine Werkzeugfunktionen übergeben werden, auch wenn sie die Pydantic-Validierung bestanden haben. Der LLM könnte dennoch gültig aussehende, aber schadhafte Eingaben konstruieren (z.B. eine SQL-Injection-Zeichenfolge, die wie eine gültige Produkt-ID aussieht).

Best Practices für das Sandboxing von Agenten

  1. Prinzip der minimalen Berechtigung: Gewähre dem Agenten die absolut minimalen Berechtigungen und Ressourcen, die für seine Aufgabe erforderlich sind.
  2. Schichtene Sicherheit: Kombiniere mehrere Sandboxing-Techniken (auf Sprachebene, OS-Ebene, Werkzeug-Ebene) für soliden Schutz. Keine einzelne Schicht ist narrensicher.
  3. Ephemeral Environments: Bevorzuge es, Agenten in kurzlebigen, wegwerfbaren Containern oder VMs auszuführen, die nach jeder Aufgabe zerstört werden.
  4. Strenge Eingangsvalidierung: Überprüfe und reinige immer alle Eingaben vom LLM, insbesondere bevor du sie in API-Aufrufen, Datenbankabfragen oder Codeausführungen verwendest.
  5. Überwachung und Protokollierung: Protokolliere alle Aktionen des Agenten, Werkzeugaufrufe und Ressourcennutzung. Dies ist entscheidend für die Erkennung anomaler Verhaltensweisen und für die Analyse nach Vorfällen.
  6. Timeouts und Ressourcenlimits: Implementiere strenge Timeouts für die Codeausführung und API-Aufrufe und setze CPU-/Speicherlimits, um Denial-of-Service-Angriffe zu verhindern.
  7. Netzwerkisolation: Deaktiviere standardmäßig den Netzwerkzugang für Agenten. Aktiviere ihn nur für spezifische, genehmigte Endpunkte und Protokolle, wenn unbedingt erforderlich.
  8. Schreibgeschützte Dateisysteme: Konfiguriere Agentenumgebungen, wo immer möglich, mit schreibgeschützten Dateisystemen, um unbefugte Datenänderungen oder -exfiltration zu verhindern.
  9. Keine Root-Benutzer: Führer die Agentenprozesse immer als Nicht-Root-Benutzer mit eingeschränkten Berechtigungen im Sandbox-Bereich aus.
  10. Regelmäßige Audits und Aktualisierungen: Überprüfe kontinuierlich deine Sandboxing-Konfigurationen, aktualisiere deine Basisbilder und halte dich über neue Sicherheitsanfälligkeiten informiert.

Fazit

Das Sandboxing von Agenten ist keine optionale Annehmlichkeit, sondern eine grundlegende Anforderung für den sicheren Einsatz von LLM-Agenten. Da diese Agenten leistungsfähiger und autonomer werden, wächst das Potenzial für Missbrauch oder versehentliche Schäden erheblich. Durch den Einsatz einer Kombination aus sprachbasierten Einschränkungen, solider Containerisierung und sorgfältig gestalteten Werkzeugschnittstellen können Entwickler leistungsstarke LLM-Anwendungen erstellen, die sowohl neu als auch sicher sind. Die in diesem Tutorial bereitgestellten Beispiele zeigen praktische Schritte zum Aufbau dieser sicheren Umgebungen, sodass du LLM-Agenten mit Zuversicht in deine Systeme integrieren kannst, während du Risiken minimierst.

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

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