Zurück zu allen Beiträgen
Veröffentlicht am · von Renaud Deraison

Der Agent hatte eine Adresse

Auf der DEF CON 34 zeigte Eli Woodward von Team Cymru 48 Stunden Mitschnitt aus einem KI-Honeypot: 3.993 Anfragen, 327 Quell-IPs, 344 Zugangsdaten-Sondierungen, gegen Ports, die niemand bekannt gemacht hatte. Die anderen Angriffe auf einen Coding-Agenten brauchen einen Weg, ihm Text vorzulegen. Dieser braucht eine Route zu ihm. Bromure Agentic Coding betreibt den Agenten standardmäßig hinter NAT, also gibt es keine Route zu finden.

Die anderen Angriffe auf einen Coding-Agenten brauchen einen Weg, ihm Text vor die Augen zu bringen. Dieser braucht eine Route zu ihm, und die Scanner haben längst eine.

Samstagmorgen auf der DEF CON 34, auf der Creator Stage 3, hielt Eli Woodward von Team Cymru einen halbstündigen Vortrag mit dem Titel MCPwned: How Exposed AI Agents Became the Internet's New Recon Toy. Er hatte einen KI-Honeypot gebaut: 16 LLM- und KI-Infrastruktur-Personas über 16 Ports verteilt, jede mit framework-echten Antworten, Headern, Fehlern und Protokollverhalten, sodass ein Scanner, der sie berührte, glaubte, das Echte gefunden zu haben.

In einem Zeitfenster von 48 Stunden nahm der Honeypot 3.993 Anfragen von 327 eindeutigen Quell-IP-Adressen entgegen, darunter 155 MCP-Sondierungen und 344 Sondierungen nach KI-API-Schlüsseln.

Niemand hatte diese Ports bekannt gemacht, und keine der 327 Adressen hatte es gezielt auf Woodward abgesehen. Das Vorgehen, das er aus dem Mitschnitt zog, ist von der langweiligen, industriellen Sorte: Missbrauch der Modellregistrierung in LiteLLM, Aufzählung von MCP-Ressourcen, framework-bewusstes Durchprobieren von Zugangsdaten und koordiniertes Scannen nach exponierten lokalen Inferenzdiensten. Die Gruppen, die seit einem Jahrzehnt den Adressraum nach offenem RDP und unauthentifiziertem Redis durchkämmen, haben dieselbe Maschinerie auf KI-Entwicklerwerkzeuge gerichtet, noch vor den Bedrohungsmodellen.

Niemand muss Ihnen irgendetwas schicken

Gehen Sie das letzte Jahr an Angriffen auf Coding-Agenten durch, und sie haben alle dieselbe Form. Etwas, das der Agent liest, enthält Anweisungen: ein Fehlerbericht, ein unsichtbarer PR-Kommentar, eine vom Agenten abgerufene Webseite, eine README, eine Zeile im WAF-Log. In jedem dieser Fälle ist die Zustellung das schwierige Problem des Angreifers. Er muss einen Kanal finden, den Sie absichtlich angeschlossen haben, und seinen Text hineinbekommen.

Drehen Sie den Pfeil um, und das Problem verschwindet. Ein Scanner schickt ein SYN an Port 11434, und etwas auf Ihrer Maschine antwortet.

Was die Scanner finden

Die Population hinter Woodwards Mitschnitt geht in die Zehntausende.

Censys hat über das Internet erreichbare MCP-Dienste kartiert und fand davon 12.520 auf 8.758 eindeutigen IP-Adressen in 56 Ländern und 425 autonomen Systemen, Stand 28. April 2026. Eine Woche später, am 6. Mai, lag die Zahl über 21.000. Rund vier von zehn nehmen Anfragen von jedem entgegen, ohne Prüfung von Zugangsdaten, weil das Protokoll standardmäßig keine verlangte.

Wiz hat angeklopft. In einer am 28. Juli veröffentlichten Untersuchung fanden sie MCP in 80 % der Cloud-Umgebungen, wobei etwa jede sechste mindestens einen Server exponierte. Von den exponierten gaben rund 70 % ihren vollständigen Werkzeugkatalog an einen unauthentifizierten Aufrufer heraus, etwa 42 % lieferten echte Daten zurück, wenn die Forschenden ein Werkzeug aufriefen, und ungefähr 10 % standen vor sensiblen Backends. Wiz richtete eine bestätigte Teilmenge auf Cloud-Metadaten-Endpunkte und bekam temporäre Zugangsdaten zurück.

Knostic machte dieselbe Übung von Shodan aus und nahm bei 1.862 exponierten Servern Fingerabdrücke; jeder einzelne der 119, die sie von Hand prüften, beantwortete tools/list ohne Authentifizierung. Jeder dieser Server tat genau das Eine, wofür er existiert, für einen Fremden.

Lokale Inferenz ergibt dasselbe Bild mit runderen Zahlen. LeakIX zählte am 23. Februar 2026 12.269 unauthentifizierte Ollama-Instanzen, jede mit Modellaufzählung über /api/tags, kostenloser Rechenleistung über /api/generate und /api/chat, Modelldiebstahl über /api/pull und /api/push und in etwa tausend Fällen der Probllama-Kette zum Verzeichnisdurchlauf.

48 Stunden auf 16 Ports, die niemand bekannt gabdas Internet, scannendkeine Zielliste, kein Phishing,nichts zuzustellennur ein SYN an einen Portetwas antwortet16 LLM- und KI-Infra-Personasauf 16 Ports, framework-echtHeader, Fehler, Protokollund das Log füllt sich3.993 Anfragenvon 327 eindeutigen Quell-IPsin einem einzigen 48-Stunden-Fensterdas Vorgehen, von IP zu IP unverändert155 MCP-Sondierungen344 KI-Schlüssel-ProbenLiteLLM-ModellregistrierungScans nach lokaler InferenzRessourcenaufzählung, framework-bewusstes Durchprobieren von Zugangsdaten, und was zuletzt antworteteWas die Scanner finden, im echten Internet21.000+ MCP-DiensteCensys, Mai 2026, zuvor 12.520rund 4 von 10 ohne Zugangsdaten70 % geben den Katalog herWiz, Juli 2026, anonym42 % liefern echte Daten12.269 offene OllamasLeakIX, Februar 2026auflisten, generieren, pull, push
Woodwards Mitschnitt über 48 Stunden und die reale Population dahinter. Der Scanner braucht keine Zielliste und keinen Zustellkanal, weil die Dienste von sich aus antworten.

Wie Ihre Maschine dazu kommt, zu antworten

Sie haben nicht entschieden, einen Dienst ins Internet zu stellen. Sie haben OLLAMA_HOST=0.0.0.0 gesetzt, damit das Notebook auf dem Sofa das Modell auf dem Desktop nutzen kann, und aus demselben Grund einen MCP-Server an alle Schnittstellen gebunden. Sie haben docker run -p 8080:8080 ausgeführt, weil die README es so sagte. Sie haben einen Tunnel geöffnet, um etwas auf einem Handy zu debuggen, und ihn offen gelassen.

Dann haben Sie das Notebook woandershin getragen. Konferenz-WLAN, eine Coworking-Etage, ein Hotel, ein Heimrouter, wo UPnP in Ihrem Namen gefällig war, oder eine Cloud-Entwicklungsmaschine, deren Sicherheitsgruppe jemand in aller Eile weiter aufgemacht hat. Das Binden ist ein einziges Flag; die Exposition gehört demjenigen, der die Routing-Tabelle geschrieben hat, hinter der Sie gerade sitzen. Zugestimmt haben Sie dem an keiner Stelle.

Bromure Agentic Coding schließt diese Lücke standardmäßig, ohne dass Sie etwas einstellen.

Die VM hat keine Adresse

Bromure betreibt den Coding-Agenten in einer wegwerfbaren Linux-VM auf Apple Silicon, wobei jedes Byte seines Verkehrs einen Proxy auf dem Host durchquert, außerhalb der Kiste, in der der Agent läuft. Für diese Angriffsklasse trägt die Netzwerkseite dieser Anordnung das Gewicht.

Unter Ressourcen → Netzwerk steht der Modus auf NAT, und NAT bekommen Sie, ohne eine Wahl zu treffen. Die VM teilt sich die Netzwerkverbindung Ihres Mac über das eingebaute NAT von Virtualization.framework: ausgehend funktioniert alles, und nichts in Ihrem LAN erreicht die VM. Binden Sie einen Dienst in dieser VM an 0.0.0.0, dann haben Sie ihn an eine VM-interne Schnittstelle hinter dem NAT gebunden. Es gibt keine Portweiterleitungstabelle, die man falsch ausfüllen könnte, weil der Modus überhaupt keine Ports weiterleitet.

Das SYN des Scanners erreicht gar keinen Port, weder gefiltert noch geschlossen, weil keine Route zu einem führt. Woodwards Honeypot brauchte 16 lauschende Prozesse, um überhaupt etwas zu sammeln. Ein Bromure-Profil bietet keinen einzigen, und die 344 Zugangsdaten-Sondierungen haben nirgends, wo sie landen könnten.

Bridged ist da, wenn Sie es wollen, und gibt der VM per DHCP eine im LAN routbare Adresse auf einer physischen Schnittstelle, die Sie benennen. Es ist eine Einstellung pro Profil, mit einer ausdrücklichen Schnittstellenauswahl, sodass Sie nur bei dem Lauf im LAN landen, bei dem Sie das auch wollten.

Ihre MCP-Server lauschen nicht

Die Server im Panel MCP sind Profilkonfiguration. Bromure übersetzt sie in Claude-Code-JSON oder Codex-TOML und spielt sie beim Start ein. Ein stdio-Server ist ein Kindprozess innerhalb der VM, der über Pipes spricht, hat also kein Socket, und die Aufzählung per tools/list hat nichts zu erreichen. Ein HTTP-Server ist eine URL, auf die Sie zeigen, mit optionalem Bearer-Token, womit Sie derjenige sind, der die Anfrage sendet. Die 40 % der MCP-Dienste, die Fremden antworten, sind Server, die jemand von Hand aufgesetzt und gebunden hat.

Lokale Inferenz läuft auf dem Mac

„Koordiniertes Scannen nach exponierten lokalen Inferenzdiensten“ ist die Formulierung des Honeypots selbst, und 12.269 offene Ollamas sind das, was es findet. Die Authentifizierung Lokales Modell in Claude Code leitet die Inferenz an ein geräteinternes MLX-Modell, das im Panel Lokale Modelle gewählt wird und unter macOS läuft, auf der Host-Seite des Proxys. Es gibt in der VM keinen Port 11434, den man exponieren könnte. Der geräteinterne Zweig von Fusion nimmt denselben Weg.

Eine Sonde, die hineinkäme, sammelte Platzhalter

Wer framework-bewusst Zugangsdaten durchprobiert, weiß, wo zu suchen ist: OPENAI_API_KEY in der Umgebung, ~/.aws/credentials, ~/.docker/config.json, eine kubeconfig, ~/.ssh. Bromure legt all das in die VM und macht all das falsch. Sie bekommen brm_…- und xai-brm-…-Token, eine synthetische kubeconfig mit Wegwerf-Client-Zertifikaten, eine gefälschte Base64-Registry-Auth und AWS-Material, das InvalidSignatureException zurückgibt, sobald irgendetwas den Proxy umgeht. Bromure behält die echten Werte auf dem Host und setzt sie auf der Leitung ein, für genau das Ziel, zu dem sie gehören.

Über destruktive Verben wird auf dem Host entschieden

Wiz fand rund 42 % der exponierten Server, die echte Daten zurückgaben, und daneben eine Schreib- und Löschklasse. Guardrails ist eine Richtlinien-Engine im Host-Proxy und deckt Kubernetes, AWS, DigitalOcean, Container-Registries, GitHub, GitLab, Bitbucket und die HTTPS-Datenbank-Endpunkte ab. Stellen Sie pro Ressource Destruktives blockieren oder Nur lesen ein, und der blockierte Aufruf kommt als hartes 403 zurück, das der Agent als ganz gewöhnlichen API-Fehler meldet. Bromure trifft diese Entscheidung in macOS, es gibt also nichts in der VM, das man abschalten könnte.

Auf dem Notebook der EntwicklerinOLLAMA_HOST=0.0.0.0damit das andere Notebook das Modell hatPort 11434, lauscht auf allemder MCP-Server ist genauso gebundentools/list antwortet jedem, der fragtder Katalog ist die Aufklärungund die Umgebung ist echt344 Proben in 48 h kennen die Pfadewer zu Ihnen routet, entscheidetKonferenz-WLAN, UPnP, zu weite GruppeIn einem Bromure-Profildie VM steht auf NAT, per Vorgabeausgehend geht; nichts kommt hinein0.0.0.0 bindet an eine VM-SchnittstelleMCP über stdio ist eine Pipeein Kindprozess, kein Socket zum ZählenHTTP-Server sind URLs, auf die Sie zeigenlokale Inferenz läuft auf dem Mackein 11434 in der VM zum Scannenund die Umgebung hält ohnehin brm_…echte Werte auf dem Host, auf der Leitung getauscht
Dieselben zwei Bequemlichkeiten auf zwei Maschinen. Auf einem Notebook stellt je ein Flag einen Dienst in genau das Netz, in dem Sie gerade sitzen. In einem Bromure-Profil hat die VM keine eingehende Route, der MCP-Server ist eine Pipe, das Modell läuft auf dem Mac, und die Umgebung, die eine Sonde durchsuchen würde, enthält Platzhalter.

Eine Aufgabe von einem Fremden ist immer noch Text

Angenommen, Sie schließen einen entfernten MCP-Server an, den jemand anderes exponiert hat, und er antwortet Ihnen mit mehr als Daten. Sobald Scanner diese Dienste aufzählen können, kann jeder, der einen findet, ihn auch nutzen, um Ihren Agenten durch die Vordertür zu erreichen, als Inhalt.

Bromure bewertet diesen Inhalt beim Hereinkommen. Ein lokales Prompt-Injection-Modell liest die Dateiinhalte, Webseiten und tool_result-Blöcke, die der Agent aufnimmt, und sucht nach einem Imperativ, der sich an denjenigen richtet, der gerade liest. Protokollieren, aber fortfahren hält jeden Treffer im Sicherheitsprotokoll fest. Mich fragen, was zu tun ist pausiert die ausgehende Anfrage und legt Ihnen die markierte Stelle vor. Einseitig blockieren stoppt sie, bevor das Modell sie sieht, und gibt dem Agenten ein hartes 451. Ein zweiter Detektor, ein feinabgestimmter ModernBERT-Klassifikator plus ein deterministischer Scanner für Nutzlasten mit Nullbreite, Bidi-Steuerzeichen und Unicode-Tags, deckt CLAUDE.md, AGENTS.md, GROK.md sowie deren verschachtelte und globale Varianten ab.

Beide Modelle laufen auf Ihrem Mac, einmal von bromure.io heruntergeladen. Die Ausgabe eines fremden MCP-Servers zu bewerten bedeutet nicht, diese Ausgabe irgendwohin zu schicken.

Das Anklopfen ist eine Zeile im Log

Jede Anfrage, die die VM stellt, durchquert den Host-Proxy, und auf der Trace-Stufe Aktivität hält Bromure zu jeder den Host, den Status, die Latenz, den Austauschbericht und etwaige Leck-Warnungen fest. Injektionserkennungen landen im Sicherheitsprotokoll, mit dem markierten Text daran. Erhöhen Sie die Stufe, und Bromure bewahrt auch die Rümpfe der KI-Anfragen auf, verschlüsselt mit demselben Schlüsselbund-Schlüssel wie Ihre Profilgeheimnisse.

Ein Agent, der angefangen hat, Anweisungen von außen zu befolgen, muss irgendwohin gelangen, um für irgendjemanden nützlich zu sein, und irgendwohin zu gelangen ist eine Zeile, die Sie auf der Maschine lesen können, auf der die Sitzung lief.

Und wenn Sie die Maschine loswerden wollen, ist sie weg. Home löschen wischt /home/ubuntu aus, also Dotfiles, .ssh, npm-global, .cargo und den Shell-Verlauf, zurück auf den Zustand direkt nach dem Klonen. Auf Basis zurücksetzen verwirft jede Änderung auf Systemebene und klont die Arbeitsplatte neu aus dem Basis-Image.

MCP wird bessere Voreinstellungen bekommen und Ollama eine Authentifizierungsgeschichte, und die Ports in Woodwards Honeypot werden im nächsten August andere Ports sein. Die Form bleibt. Einen Agenten heute ordentlich zu betreiben heißt, ein Gateway und eine Handvoll Werkzeugserver daneben zu betreiben, und jeder davon ist ein Programm, das auf einem Notebook, das reist, ein Socket bindet.

Andere Beiträge hier bitten Sie, dem zu misstrauen, was Ihr Agent liest. Dieser stellt eine kürzere Frage: Was antwortet, wenn ein Fremder klopft, und wäre es Ihnen nicht lieber, es täte niemand.

Installieren Sie Bromure Agentic Coding und geben Sie Ihrem Agenten eine Maschine, die die Scanner nicht sehen können.