flawopen.com/Incidents/microsoft-autogen-studio-autojack-agent-rce-june-2026
AutoJack: RCE-Forschungskette in AutoGen Studio
Microsoft fand eine lokale RCE-Kette via MCP im AutoGen-Studio-Entwicklungsbuild. Vor Release behoben, erschien sie nie auf PyPI.[1], [2]
Stellen Sie sich ein Forschungslabor vor, in dem ein Assistent Besuchernotizen liest. Der Assistent darf in den Kontrollraum, weil er im selben Gebäude arbeitet. Am Empfang entfällt dort die normale Identitätsprüfung, und eine Besuchernotiz kann auswählen, welches Werkzeug gestartet wird. AutoJack verband diese Abkürzungen: Ein Browsing-Agent zeigte nicht vertrauenswürdige Inhalte an, diese erreichten die lokale MCP-Steuerung von AutoGen Studio, und vom Anfragenden gelieferte Einstellungen konnten einen Kindprozess starten lassen. Authentifizieren Sie den Kontrollraum, nehmen Sie Startparameter aus WebSocket-URLs heraus und isolieren Sie den Assistenten vom Entwicklerrechner. Microsoft zufolge wurde der Fehler vor einer PyPI-Veröffentlichung im Upstream-Branch behoben. Die Forschung betrifft Quellcode vor der Veröffentlichung, keine betroffene Kundenversion.[1]
Kernkonzepte & Begriffe
AutoJack- Microsofts Bezeichnung für eine demonstrierte Kette in einem AutoGen-Studio-Entwicklungsbuild. Laut Bericht wurde die betroffene MCP-Route behoben, bevor sie in einem veröffentlichten PyPI-Paket enthalten war.[1], [2]
Loopback / localhost- Eine Netzwerkschnittstelle, über die Dienste auf demselben Host erreichbar sind. Sie begrenzt Zugriffe aus externen Netzen, isoliert aber lokale Prozesse wie den Agentenbrowser nicht von anderen Hostdiensten.[1]
Origin-Prüfung bei WebSockets- Eine serverseitige Prüfung des Origin-Headers während des WebSocket-Handshakes. Microsoft stellte fest, dass diese Prüfung allein im getesteten Agentenablauf die dargestellte Seite nicht vom lokalen MCP-Dienst fernhielt.[1], [3]
StdioServerParams- AutoGens MCP-stdio-Konfiguration mit Programm und Argumenten zum Start eines Serverprozesses. Die beschriebene Route dekodierte diese Einstellungen aus einem WebSocket-URL-Parameter.[1], [2], [5]
Confused deputy- Eine privilegierte Komponente wird dazu gebracht, ihre eigenen Rechte für eine nicht vertrauenswürdige Partei einzusetzen. Hier bildeten Browsing-Agent und lokaler Studio-Dienst die Brücke von Seiteninhalten zum Prozessstart auf dem Host.[1]
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-78 CWE-306 CWE-1385
- OWASP GenAI 2025 — LLM06:2025 Übermäßige Autonomie
Vorfall-Zeitstrahl
Microsoft veröffentlichte die AutoJack-Forschung und Schutzmaßnahmen. Beschrieben wird eine kontrollierte lokale Demonstration, kein bestätigter Angriff auf Kunden.[1]
Schritt-für-Schritt Angriffsablauf
Der Agent soll nicht vertrauenswürdige Inhalte durchsuchen
Ein Prompt, eine abgerufene Seite oder eine andere nicht vertrauenswürdige Eingabe veranlasst einen AutoGen-Browsing-Agenten, eine vom Angreifer kontrollierte Seite auf demselben Rechner wie AutoGen Studio darzustellen.[1]
Quellcode: Verwundbar vs. Sicher
Das verwundbare Beispiel analysiert vom Aufrufer kontrollierte Startparameter, startet aber absichtlich keinen Prozess. Der Upstream-Fix entfernte sie aus der WebSocket-Abfrage, legte sie in einem einmal verwendbaren serverseitigen Sitzungszustand ab und aktivierte die Authentifizierung für MCP-Routen wieder. Dieses defensive Referenzmuster ergänzt Ablaufzeit, Größenlimit, Nebenläufigkeitssperre und eine Allowlist ausführbarer Programme; ersetzen Sie den Beispielnamen durch die genau freigegebenen MCP-Binärdateien. Es ersetzt weder Origin-Prüfung noch Betriebssystemisolation.[1], [2]
import base64
import json
from dataclasses import dataclass
@dataclass(frozen=True)
class StdioServerParams:
command: str
args: tuple[str, ...]
def params_from_websocket_query(query: dict[str, str]) -> StdioServerParams:
# Die Entwicklungsroute vertraute der in der URL übermittelten Konfiguration.
encoded = query["server_params"]
decoded = base64.b64decode(encoded)
return StdioServerParams(**json.loads(decoded))from dataclasses import dataclass
from threading import Lock
from time import monotonic
from uuid import uuid4
@dataclass(frozen=True)
class StdioServerParams:
command: str
args: tuple[str, ...]
SESSION_TTL = 30.0
MAX_PENDING = 256
ALLOWED_COMMANDS = {"approved-mcp-server"}
pending: dict[str, tuple[float, StdioServerParams]] = {}
pending_lock = Lock()
def register_params(params: StdioServerParams, authenticated: bool) -> str:
# authenticated muss aus verifizierter Middleware stammen, niemals aus Anfragedaten.
if not authenticated:
raise PermissionError("MCP control-plane authentication required")
if params.command not in ALLOWED_COMMANDS:
raise ValueError("unapproved MCP server executable")
now = monotonic()
with pending_lock:
for key, (expires, _) in list(pending.items()):
if expires <= now:
pending.pop(key, None)
if len(pending) >= MAX_PENDING:
raise RuntimeError("pending MCP session limit reached")
session_id = str(uuid4())
pending[session_id] = (now + SESSION_TTL, params)
return session_id
def consume_params(session_id: str, authenticated: bool) -> StdioServerParams:
if not authenticated:
raise PermissionError("MCP control-plane authentication required")
with pending_lock:
entry = pending.pop(session_id, None)
if entry is None or entry[0] <= monotonic():
raise ValueError("unknown or expired MCP session")
return entry[1]Checkliste für Engineering & Systemsicherheit
- ✓Authentifizieren und autorisieren Sie jede Route der MCP-Steuerungsebene einschließlich WebSocket-Handshakes; testen Sie alle konfigurierten Authentifizierungsmodi für diese Routen.[1], [2], [4]
- ✓Akzeptieren Sie Prozessstartkonfiguration niemals in einer WebSocket-URL oder einer anderen browsergesteuerten Eingabe. Registrieren Sie sie über eine authentifizierte Anfrage und binden Sie sie an eine kurzlebige, einmal verwendbare serverseitige Sitzung.[2]
- ✓Lassen Sie wartende Sitzungen ablaufen, begrenzen Sie ihre Zahl, verbrauchen Sie jede Sitzung atomar und weisen Sie unbekannte, abgelaufene oder erneut verwendete IDs zurück.[2]
- ✓Erlauben Sie nur freigegebene MCP-Serverprogramme und feste Argumentstrukturen; Modellantworten oder Seiteninhalte dürfen keine beliebigen Programme auswählen.[1], [5]
- ✓Trennen Sie Browsing-Agenten, die nicht vertrauenswürdige Seiten darstellen, von privilegierten lokalen Steuerungsebenen; sperren Sie Loopback-Zugriffe aus dem Browser-Sandbox, wo möglich.[1], [3]
- ✓Betreiben Sie Agent und Studio mit einer Identität mit minimalen Rechten oder in einer kurzlebigen VM/einem Container und alarmieren Sie bei unerwarteten Kindprozessen von Agenten-Runtimes.[1]
- ✓Verwenden Sie für AutoGen-Studio-Quellbuilds eine Revision ab b047730. Microsoft sagt, die betroffene Route sei nicht im damals aktuellen PyPI-Paket enthalten gewesen; prüfen Sie das konkrete bereitgestellte Artefakt.[1], [2]
Quellen
- Microsoft Security Blog — AutoJack: Wie eine Seite Code auf dem Host eines KI-Agenten ausführen kann
- Microsoft-AutoGen-Commit b047730 — MCP-WebSocket-Endpunkt härten
- CWE-1385: fehlende Origin-Prüfung bei WebSockets
- CWE-306: fehlende Authentifizierung für kritische Funktionen
- CWE-78: unzureichende Neutralisierung besonderer Zeichen in Betriebssystembefehlen