
Forschungsdemonstration von indirekten Prompt-Injection-Angriffen zur Kontrolle autonomer LLM-basierter Web-Agenten, mit Werkzeugen zur Trigger-Optimierung und -Bewertung.
Angesichts der Allgegenwart von LLM-integrierten Anwendungen ist die Untersuchung potenzieller Sicherheitsrisiken von entscheidender Bedeutung. Eine der bedeutendsten Schwachstellen dieser Systeme ist ihre Anfälligkeit für adversariale Angriffe durch indirekte Prompt-Injection. In diesem Repository zeigen wir eine Methode, mit der ein böswilliger Akteur einen universellen Trigger erzeugen könnte, der es ihm ermöglicht, die Aktionen eines LLM-basierten Web-Navigationsagenten zu steuern. Wir hoffen, dass die Präsentation dieser Informationen Praktikern hilft, sich ihrer potenziellen Verwundbarkeit bewusst zu werden, und Forscher dazu anregt, Schutzmaßnahmen gegen Angriffe dieser Art zu entwickeln.
Nach dem Klonen dieses Repos sind die folgenden Befehle erforderlich, um die Web-Navigationsinfrastruktur von Browser Gym einzurichten:
conda create -n browser-gym
conda init
conda activate browser-gym
pip install browsergym-core
playwright install chromium
pip install transformers
Die Details können je nach Rechenumgebung variieren.
Wenn Sie daran interessiert sind, ein Verfahren zur Optimierung universeller Trigger auszuführen, müssen Sie einen Datensatz mit Websites und Web-Navigationszielen generieren. Dies kann mit den Befehlen aus der Datei src/actions/mask_dataset.py bewerkstelligt werden. Außerdem müssen Sie einige API-Schlüssel erstellen und in einer sicheren Umgebung speichern.
pip install python-dotenv und dann touch .env aus.'.env'-Datei sollte wie folgt aussehen:
OPENAI_API_KEY=<key>
GOOGLE_API_KEY=<key>
GOOGLE_ENGINE_NAME=<name>
GOOGLE_CX=<engine ID>
python -m src.dataset.actions.make_dataset get_webs aus, bis Sie eine geeignete Anzahl von Website-JSON-Dateien in Ihrem Datenordner haben.python -m src.dataset.actions.make_dataset set_goals aus, um JSONs nach blockierten Websites zu filtern, die Website-Klassen neu auszubalancieren und einen Batch-Auftrag an die OpenAI-API zu senden, um Zielobjekte für die verbleibenden Websites zu generieren. Sie sollten das Flag --n_batch_splits <int> hinzufügen, wenn Sie über 10.000 Website-JSONs verfügen.set_goals ausführen, werden Ihre Batch-IDs im Terminal ausgegeben. Führen Sie python -m src.dataset.actions.make_dataset get_goals --batch_ids <batch ID 1> <batch ID 2> ... aus, um die Zielobjekte in die entsprechenden Website-JSONs zu schreiben, sofern die Batch-Aufträge abgeschlossen sind. Ein Batch-Auftrag kann bis zu 24 Stunden dauern, bis OpenAI ihn abschließt. Möglicherweise müssen Sie also einen Tag warten, bevor dieser Befehl erfolgreich ausgeführt werden kann.Demo #1 zeigt, wie ein Angreifer eine Website mit einem in einen Link eingebetteten Schadcode hosten und einen Web-Navigationsagenten dazu zwingen könnte, jedes Mal auf diesen Link zu klicken. Eine Website-JSON und ein Trigger zur Steuerung der Web-Agenten-Ausgabe sind im Ordner data/ bzw. im Ordner triggers/ gespeichert.
Das Ausführen von python -m src.attack.actions.run_demo startet einen Browser mit einer Beispiel-Webseite und einer LLM-Chat-Oberfläche. Der LLM-Chat fordert Sie auf, ein Ziel für den Web-Navigationsagenten anzugeben. Schreiben Sie eine Aufgabe wie „Suche nach einem Flug nach Chicago“ in das Fenster. Der Agent wird die Aufgabe wie erwartet auf dem Tab mit der Beispiel-Webseite ausführen.
Führen Sie python -m src.attack.actions.run_demo --trigger_json triggers/zzz_travel_ad_demo_1_trigger_uni_secondary.json aus, um den Web-Navigationsagenten bei dieser Aufgabe anzugreifen. Wie zuvor wird ein Browser mit der Beispiel-Webseite und der LLM-Chat-Oberfläche gestartet. Bitte geben Sie wie zuvor ein Ziel im Chat-Fenster ein. Der Ablauf ist identisch mit dem der Kontrolle, mit dem einzigen Unterschied, dass der Trigger aus der Datei zzz_travel_ad_demo_1_trigger_uni_secondary.json in einen versteckten Link auf der Website eingefügt wird. Sie sollten sehen, dass der Web-Agent diesmal die von Ihnen bereitgestellte Anweisung ignoriert und auf die Werbung in der Fußzeile klickt!
Um einen adversarialen Trigger zu optimieren, der die Ausgabe eines Web-Navigationsagenten auf einer Website Ihrer Wahl steuert, können Sie die Datei find_narrow_trigger.py verwenden. Sobald Sie mithilfe des Dataset-Erstellungstools eine Website-JSON generiert haben, können Sie den Text '{optim_str}' an einer beliebigen Stelle im ax-Tree einfügen. Dies teilt der nanogcg-Bibliothek, die wir verwenden werden, mit, dass Sie den Trigger an dieser Stelle in der Website einfügen möchten.
pip install nanogcg aus.python -m src.attack.actions.find_narrow_trigger aus. Die Optionen und Flags für dieses Befehlszeilenprogramm sind wie folgt:-h, --help show this help message and exit
--json JSON File and path for the JSON file to find a trigger for.
--target TARGET The desired output when triggered.
--device DEVICE Device to run the model on.
--trigger_length TRIGGER_LENGTH
--include_target, --no-include_target
--loss_fn {cw,mm,ce}
--search_width SEARCH_WIDTH
--top_k TOP_K
--model {mistral-7B,mistral-24B,llama2,llama3}
The model to use for generation.
--dtype DTYPE Data type to use for the model.
Damit der Angriff in unserer Umgebung funktioniert, sollte das Ziel Ihrer Optimierung eine Funktion im Web-Navigations-Aktionsraum von Browser Gym sein. Siehe dazu die Datei action_space.txt.
Der optimierte Trigger wird in einer JSON-Datei im Ordner triggers/ gespeichert, wobei der Dateiname der zugehörigen Website-Daten-JSON entspricht. Sie können diesen Trigger verwenden, um Ihre eigene Demo mit dem Dienstprogramm python -m src.attack.actions.run_demo und den entsprechenden Flags auszuführen.