Wie man einen KI-Agenten Webseiten lesen lässt, ohne dass dabei Prompts eingeschleust werden
Du bittest Deinen KI-Agenten, „diese Seite zu überprüfen und zusammenzufassen“, oder Du gibst ihm ein Tool, das während der Arbeit die Dokumentation durchsucht. Er ruft die URL ab, liest den Text und bezieht das Gefundene in seine Überlegungen ein. Genau darum geht es, wenn man einem Agenten das Internet zur Verfügung stellt – und genau darin liegt auch der Anfang.
Für ein Sprachmodell gibt es keine klare Grenze zwischen der Seite, die ich lesen soll und einer Anweisung, der ich folgen soll. Eine Webseite kann Text enthalten, den ein Mensch nie sieht, den das Modell aber genauso klar liest wie alles andere: unsichtbare Unicode-Zeichen, weiß-auf-weißer Text, in HTML-Kommentaren versteckte Inhalte, ein gefälschtes „System“-Trennzeichen, das so gestaltet ist, dass es wie der Anfang einer echten Anweisung aussieht. Sicherheitsforscher haben genau das in funktionierende Angriffe umgesetzt – Seiten, die einem Programmieragenten unbemerkt befahlen, ein API-Token preiszugeben, einen Befehl auszuführen oder seine eigene Konfiguration umzuschreiben. „Ich habe eine Webseite gelesen“ wird zu „Die Webseite hat meinen nächsten Schritt vorgegeben.“
safe-fetch errichtet eine Barriere auf diesem Weg. Es ruft die Seite in einem abgeschotteten Einweg-Container ab, filtert die versteckten Tricks heraus und gibt das Ergebnis klar als untrusted data gekennzeichnet zurück – etwas zum Lesen, niemals eine Reihe von Anweisungen, denen man Folge leisten muss.
Das Problem, ganz einfach ausgedrückt
Die Gefahr ist kein Virus im üblichen Sinne, sondern Sprache. Alles, was ein Agent liest, wird Teil des Kontexts, auf dessen Grundlage er Schlussfolgerungen zieht. Ein Angreifer, der dem Modell Text zuführen kann – indem er eine Seite kontrolliert, die der Agent besucht, oder den Text in einer Datei platziert, die der Agent öffnet –, kann versuchen, diesen Text als Befehl zu formulieren. Dies wird als indirekte prompt injection bezeichnet, und OWASP stuft die prompt injection als das größte Risiko für LLM-Anwendungen ein. Das Beunruhigende daran ist, dass die payload unsichtbar für Dich ist: Die Seite sieht im Browser ganz normal aus, enthält aber Anweisungen, die nur das Modell „hört“.
Wem passiert das schon?
Jeder, dessen KI Dinge liest, die sie nicht selbst geschrieben hat: Claude Code, der einem Link folgt, ein benutzerdefinierter Agent, der Dokumentation auswertet, ein Browsing-Tool, das Suchergebnisse zusammenfasst. Je nützlicher Du einen Agenten machst, indem Du ihn das offene Web lesen lässt, desto wichtiger wird das.
Was „safe-fetch“ macht – und wie es funktioniert
safe-fetch <url> ist ein Drop-in-Fetcher: Richte ihn auf eine Seite, und er gibt den bereinigten, formatierten Text anstelle des rohen HTML-Codes zurück.
Vier unabhängige Schichten
safe-fetch stützt sich nicht auf einen einzigen Trick. Der fetch (laden) läuft in einem abgeschirmten Container (kein Zugriff auf den Host, keine Eskalation im Netzwerk, kein Speichern des Zustands zwischen den Aufrufen), sodass selbst eine Schwachstelle im Cleaner Deinen Rechner nicht erreichen kann. Im Inneren entfernt ein Sanitizer die bekannten Injektionsvektoren – Zero-Width- und bidirektionales Unicode, Homoglyphen, Skripte, Kommentare, Off-Screen- und gleichfarbiges CSS, Base64-payloads sowie gefälschte Modell-Trennzeichen. Der bereinigte Text wird dann in eine „untrusted-content“-Hülle verpackt, die Dein Agent als Daten behandeln soll, wobei jeder Versuch, die Hülle im Inhalt zu fälschen, neutralisiert wird. Schließlich schreibt --install-claude-hooks die Modellregel, die den Agenten dazu bringt, die Hülle zu respektieren: Fakten lesen, den Inhalt niemals ausführen.
Ehrliche Grenzen
Ein Angriff in einfacher Prosa ohne technische Hinweise – buchstäblich „Ignoriere Deine vorherigen Anweisungen und…“ – wird vom Sanitizer absichtlich nicht anhand von Mustern erkannt: Regex-Prüfungen auf natürlicher Sprache führen bei echter Prosa zu Fehlalarmen, übersehen jede Umformulierung und vermitteln dabei ein falsches Sicherheitsgefühl. Das ist die Aufgabe der Modellregel (Schicht vier), weshalb der Schritt --install-claude-hooks so wichtig ist. „safe-fetch“ legt klar fest, was jede Schicht abdeckt und was nicht.
Installiere es und nutze es
Installieren
brew install sharkyger/tap/safe-fetch
Benutz es
safe-fetch https://example.com # fetch, sanitise, wrap
safe-fetch --install-claude-hooks # add the model rule + Claude Code hooks
Richte Deinen Agenten auf safe-fetch statt auf einen reinen HTTP-Fetch aus und führe den Schritt „install-hooks“ einmal aus, damit die Regel für untrusted data eingerichtet wird. Alle Optionen, das Bedrohungsmodell und der Quellcode findest Du auf GitHub: github.com/sharkyger/safe-fetch
(MIT).
FAQ
Was ist ein „Prompt-Injection-Sanitizer“?
Ein Filter, der die versteckten Tricks entfernt, die ein Angreifer in Webinhalte einbaut, um eine KI zu kapern – unsichtbares Unicode, Text außerhalb des Bildschirms, gefälschte Trennzeichen, verschlüsselte payloads –, bevor die Seite das Modell erreicht. safe-fetch wendet diesen Filter auf jede Seite an, die es fetcht.
Wie kann ich einen KI-Agenten eine Webseite sicher lesen lassen?
Lade sie über „safe-fetch“ statt direkt. Die Seite wird in einem abgeschotteten Container heruntergeladen, von bekannten Injektionsvektoren befreit und in einem „untrusted-content“-Umschlag zurückgegeben, den Dein Agent als Daten behandelt – so kann eine mit Fallen gespickte Seite nicht zu einem Befehl werden.
Erkennt es jede prompt injection?
Nein, und das steht dort auch so. Angriffe in einfacher Prosa ohne technische Anzeichen werden nicht anhand von Mustern abgeglichen – diese Klasse lässt sich besser über eine Modellregel behandeln, die safe-fetch über --install-claude-hooks installiert. Die Container-Isolierung und der „untrusted data“-Wrapper sind die Ebenen, die immer zum Einsatz kommen.
safe-fetch ist eines der 5bats KI-Agent-Sicherheit -Tools. Für Claude Desktop und andere MCP-Clients gibt es mcp-safe-fetch ; um zu verhindern, dass abgerufener Text oder Text von Sub-Agenten als Befehle innerhalb von Claude Code ausgeführt wird, siehe claude-code-prompt-injection-gate .
Siehe das Bedrohungsmodell, die Optionen und den Quellcode auf GitHub →
