flawopen.com/Incidents/microsoft-autogen-studio-autojack-agent-rce-june-2026
AutoJack: cadeia de RCE de pesquisa no AutoGen Studio
Pesquisa da Microsoft identificou RCE local via MCP no build de desenvolvimento do AutoGen Studio. Corrigida antes do lançamento, não chegou ao PyPI.[1], [2]
Imagine um laboratório onde um assistente lê bilhetes de visitantes. O assistente entra na sala de controle porque trabalha no mesmo prédio. A recepção dispensa a verificação normal de identidade nessa sala, e um bilhete de visitante pode escolher qual ferramenta será iniciada. O AutoJack combinou esses atalhos: um agente de navegação renderizava conteúdo não confiável, esse conteúdo alcançava o plano de controle MCP local do AutoGen Studio e as configurações fornecidas pelo solicitante podiam levar à criação de um processo filho. A lição é autenticar a sala de controle, tirar as configurações de inicialização das URLs WebSocket e isolar o assistente da estação de trabalho do desenvolvedor. A Microsoft afirma que a falha foi corrigida na branch upstream antes de uma versão PyPI. A análise trata de código pré-lançamento, não de uma versão de clientes afetada.[1]
Conceitos Centrais e Termos
AutoJack- Nome dado pela Microsoft a uma cadeia demonstrada em uma versão de desenvolvimento do AutoGen Studio. O relatório afirma que a rota MCP afetada foi corrigida antes de aparecer em um pacote PyPI publicado.[1], [2]
Loopback / localhost- Interface de rede que alcança serviços no mesmo host. Ela limita o acesso pela rede externa, mas não isola processos locais, como o navegador de um agente, de outros serviços naquele host.[1]
Validação de Origin em WebSocket- Verificação feita pelo servidor do cabeçalho Origin durante o handshake WebSocket. A Microsoft constatou que, no fluxo de agente testado, essa verificação sozinha não impedia a página renderizada de alcançar o serviço MCP local.[1], [3]
StdioServerParams- Configuração stdio do MCP no AutoGen, incluindo o programa e os argumentos usados para iniciar um processo servidor. A rota relatada decodificava essa configuração de um parâmetro da URL WebSocket.[1], [2], [5]
Confused deputy- Um componente privilegiado é induzido a usar sua própria autoridade em favor de alguém não confiável. Aqui, o agente de navegação e o serviço local do Studio conectavam conteúdo da página à criação de processos no host.[1]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-78 CWE-306 CWE-1385
- OWASP GenAI 2025 — LLM06:2025 Agência excessiva
Linha do Tempo do Incidente
A Microsoft publicou a pesquisa AutoJack e as orientações de mitigação. O texto descreve uma demonstração local controlada, não um ataque confirmado contra clientes.[1]
Fluxo de Ataque Passo a Paso
O agente recebe a tarefa de navegar por conteúdo não confiável
Um prompt, uma página recuperada ou outra entrada não confiável leva um agente de navegação AutoGen a renderizar uma página controlada pelo atacante na mesma estação que executa o AutoGen Studio.[1]
Código-Fonte: Vulnerável vs. Seguro
O exemplo vulnerável analisa configurações de inicialização controladas pelo solicitante, mas deliberadamente não inicia processos. A correção upstream removeu as configurações da consulta WebSocket, moveu-as para uma sessão única armazenada no servidor e restaurou a autenticação nas rotas MCP. Este padrão defensivo acrescenta expiração, limite de tamanho, bloqueio concorrente e lista de executáveis permitidos; substitua o nome de exemplo pelos binários MCP aprovados. Ele não substitui validação de Origin nem isolamento do sistema operacional.[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:
# A rota de desenvolvimento confiava na configuração fornecida pela URL.
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 deve vir de um middleware verificado, nunca dos dados da solicitação.
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]Lista de Verificação de Segurança para Engenharia
- ✓Exija autenticação e autorização em todas as rotas do plano de controle MCP, inclusive nos handshakes WebSocket; teste cada modo de autenticação configurado nessas rotas.[1], [2], [4]
- ✓Nunca aceite configuração de inicialização de processos em URL WebSocket ou outra entrada controlada pelo navegador; registre-a por uma requisição autenticada e associe-a a uma sessão server-side curta e de uso único.[2]
- ✓Expire sessões pendentes, limite sua quantidade, consuma cada sessão atomicamente e rejeite identificadores desconhecidos, expirados ou reutilizados.[2]
- ✓Use uma lista permitida de executáveis de servidores MCP e esquemas fixos de argumentos; não deixe a saída do modelo ou o conteúdo da página escolher programas arbitrários.[1], [5]
- ✓Mantenha agentes de navegação que renderizam páginas não confiáveis longe de planos de controle locais privilegiados; bloqueie o acesso loopback pelo sandbox do navegador quando possível.[1], [3]
- ✓Execute o agente e o Studio com identidade de baixo privilégio ou em VM/container descartável e gere alertas para processos filhos inesperados de runtimes de agentes.[1]
- ✓Em builds do código-fonte do AutoGen Studio, use uma revisão igual ou posterior a b047730. O relatório da Microsoft diz que a rota MCP afetada não estava no pacote PyPI então vigente; verifique o artefato exato implantado.[1], [2]
Fontes
- Microsoft Security Blog — AutoJack: como uma página pode executar código no host do agente de IA
- Commit b047730 do Microsoft AutoGen — reforço do endpoint MCP WebSocket
- CWE-1385: ausência de validação de Origin em WebSockets
- CWE-306: ausência de autenticação para função crítica
- CWE-78: neutralização incorreta de elementos especiais em comandos do sistema operacional