Dies ist die Codebasis von imprompter
. Es stellt wesentliche Komponenten bereit, um den im Dokument vorgestellten Angriff zu reproduzieren und zu testen. Sie können darüber hinaus auch Ihren eigenen Angriff erstellen.
Ein Screencast, der zeigt, wie ein Angreifer mit unserer gegnerischen Eingabeaufforderung die PII des Benutzers in einem realen LLM-Produkt (Mistral LeChat) herausfiltern kann:
Weitere Videodemos finden Sie auf unserer Website. In der Zwischenzeit ein großes Dankeschön an Matt Burges von WIRED und Simon Willison für das Schreiben cooler Geschichten (WIRED, Simons Blog) über dieses Projekt!
Richten Sie die Python-Umgebung mit pip install .
oder pdm install
(pdm). Wir empfehlen die Verwendung einer virtuellen Umgebung (z. B. conda
mit pdm venv
).
Für GLM4-9b
und Mistral-Nemo-12B
ist eine 48-GB-VRAM-GPU erforderlich. Für Llama3.1-70b
sind 3x 80GB VRAM erforderlich.
Es gibt zwei Konfigurationsdateien, die potenzielle Aufmerksamkeit erfordern, bevor Sie den Algorithmus ausführen
./configs/model_path_config.json
definiert den Pfad des Huggingface-Modells auf Ihrem System. Sie müssen dies höchstwahrscheinlich entsprechend ändern.
./configs/device_map_config.json
konfiguriert die Ebenenzuordnung zum Laden der Modelle auf Multi-GPU. Wir zeigen unsere Konfiguration zum Laden von LLama-3.1-70B auf 3x Nvidia A100 80G GPUs. Möglicherweise müssen Sie dies für Ihre Computerumgebungen entsprechend anpassen.
Folgen Sie den Beispielausführungsskripten, z. B. ./scripts/T*.sh
. Die Erläuterungen zu jedem Argument finden Sie in Abschnitt 4 unseres Papiers.
Das Optimierungsprogramm generiert Ergebnisse in .pkl
Dateien und Protokollen im Ordner ./results
. Die Pickle-Datei aktualisiert jeden Schritt während der Ausführung und speichert immer die aktuellen 100 gegnerischen Eingabeaufforderungen (mit dem geringsten Verlust). Es ist als Min-Heap strukturiert, wobei an der Spitze der Prompt mit dem geringsten Verlust steht. Jedes Element des Heaps ist ein Tupel von (<loss>, <adversarial prompt in string>, <optimization iteration>, <adversarial prompt in tokens>)
. Sie können jederzeit von einer vorhandenen Pickle-Datei aus neu starten, indem Sie dem ursprünglichen Ausführungsskript die Argumente --start_from_file <path_to_pickle>
hinzufügen.
Die Auswertung erfolgt über evaluation.ipynb
. Befolgen Sie dort die detaillierten Anweisungen, um Datensätze zu generieren, Tests durchzuführen, Metriken zu berechnen usw.
Ein Sonderfall sind die PII-Präc/Recall-Metriken. Sie werden eigenständig mit pii_metric.py
berechnet. Beachten Sie, dass --verbose
Ihre vollständigen PII-Details zu jedem Konversationseintrag zum Debuggen bereitstellt und --web
hinzugefügt werden sollte, wenn die Ergebnisse von echten Produkten im Web stammen.
Beispielverwendung (Nicht-Web-Ergebnis, d. h. lokaler Test):
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/local_evaluations/T11.json
Beispielverwendung (Webergebnis, z. B. echter Produkttest):
python pii_metric.py --data_path datasets/testing/pii_conversations_rest25_gt.json --pred_path evaluations/product_evaluations/N6_lechat.json --web --verbose
Wir verwenden Selenium, um den Testprozess an realen Produkten (Mistral LeChat und ChatGLM) zu automatisieren. Wir stellen den Code im Verzeichnis browser_automation
bereit. Beachten Sie, dass wir dies nur in einer Desktop-Umgebung unter Windows 10 und 11 getestet haben. Es soll auch unter Linux/MacOS funktionieren, dies kann jedoch nicht garantiert werden. Möglicherweise sind einige kleine Anpassungen erforderlich.
Beispielverwendung: python browser_automation/main.py --target chatglm --browser chrome --output_dir test --dataset datasets/pii_conversations_rest25_gt.json --prompt_pkl results/T12.pkl --prompt_idx 1
--target
gibt das Produkt an. Derzeit unterstützen wir zwei Optionen: chatglm
und mistral
.
--browser
definiert den zu verwendenden Browser. Sie sollten entweder chrome
oder edge
verwenden.
--dataset
verweist auf den Konversationsdatensatz, mit dem getestet werden soll
--prompt_pkl
verweist auf die PKL-Datei, aus der die Eingabeaufforderung gelesen werden soll, und --prompt_idx
definiert den geordneten Index der Eingabeaufforderung, der aus der PKL verwendet werden soll. Alternativ kann man die Eingabeaufforderung auch direkt in main.py
definieren und diese beiden Optionen nicht bereitstellen.
Wir stellen alle Skripte ( ./scripts
) und Datensätze ( ./datasets
) zur Verfügung, um die Eingabeaufforderungen (T1-T12) zu erhalten, die wir in der Arbeit vorstellen. Darüber hinaus stellen wir auch die pkl-Ergebnisdatei ( ./results
) für jede Eingabeaufforderung bereit, solange wir noch eine Kopie und das über evaluation.ipynb
erhaltene Auswertungsergebnis davon ( ./evaluations
) behalten. Beachten Sie, dass bei PII-Exfiltrationsangriffen die Trainings- und Testdatensätze reale PII enthalten. Obwohl sie aus dem öffentlichen WildChat-Datensatz stammen, entscheiden wir uns aus Datenschutzgründen, sie nicht direkt öffentlich zu machen. Als Referenz stellen wir unter ./datasets/testing/pii_conversations_rest25_gt_example.json
eine einzelne Teilmenge dieser Datensätze bereit. Bitte kontaktieren Sie uns, um die vollständige Version dieser beiden Datensätze anzufordern.
Wir haben am 9. September 2024 bzw. am 18. September 2024 mit der Offenlegung gegenüber Mistral und dem ChatGLM-Team begonnen. Die Mitglieder des Mistral-Sicherheitsteams reagierten umgehend und erkannten die Schwachstelle als mittelschweres Problem an. Sie haben die Datenexfiltration behoben, indem sie am 13. September 2024 das Markdown-Rendering externer Bilder deaktiviert haben (die Bestätigung finden Sie im Mistral-Änderungsprotokoll). Wir haben bestätigt, dass das Update funktioniert. Das ChatGLM-Team antwortete uns am 18. Oktober 2024 nach mehreren Kommunikationsversuchen über verschiedene Kanäle und gab an, dass es mit der Arbeit daran begonnen habe.
Bitte zitieren Sie unseren Artikel, wenn Sie diese Arbeit wertvoll finden.
@misc{fu2024impromptertrickingllmagents, title={Imprompter: LLM-Agenten zur unsachgemäßen Werkzeugnutzung verleiten}, Autor={Xiaohan Fu und Shuheng Li und Zihan Wang und Yihao Liu und Rajesh K. Gupta und Taylor Berg-Kirkpatrick und Earlence Fernandes}, Jahr={2024}, eprint={2410.14923}, archivePrefix={arXiv}, PrimaryClass={cs.CR}, url={https://arxiv.org/abs/2410.14923}, }