FlawOpen

flawopen.com/AI Security/manus-email-prompt-injection-agent-runtime-october-2026

● Mapeamento da FlawOpen: CWE-94 · Severidade editorial: Alta
Pesquisa · FlawOpen

Injeção de prompt por e-mail no agente Manus: o código foi executado antes do alerta

A Salt Labs relatou que um e-mail preparado podia levar o Manus a executar código no ambiente do servidor antes de avisar o usuário. Os pesquisadores dizem que fizeram a divulgação responsável e que o problema foi resolvido; não há CVE nem relato de comprometimento real de vítima.[1]

💡 Explicação em Linguagem Simples (ELI5)

Imagine um funcionário da triagem que lê uma carta em voz alta e segue as instruções escondidas nela antes de perguntar ao supervisor se a carta é confiável. O aviso chega depois da ação. A barreira de segurança precisa impedir que o texto não confiável vire instrução executável desde o início.[1]

Conceitos Centrais e Termos

Injeção indireta de prompt
Instruções inseridas no conteúdo que a IA deve analisar, como um e-mail, em vez de serem fornecidas diretamente pelo usuário.[1], [5]
Ambiente de execução do agente
Processo e ferramentas que o agente pode usar. As permissões e o isolamento determinam o impacto das ações influenciadas pelo modelo.[1], [6]
Bloqueio antes da execução
Controle que impede uma ação antes de executar código ou chamar uma ferramenta. Um alerta posterior não impede a execução.[1], [6]
CWE-94 (mapeamento editorial)
Controle inadequado da geração ou execução de código. A FlawOpen usa essa associação conceitual para a passagem demonstrada de conteúdo não confiável para código; a Salt Labs não atribuiu CWE nem CVE.[4], [1]

Mapeamentos de frameworks

Fluxo de Ataque Passo a Paso

Passo 1

O usuário pede ao Manus para verificar e-mails

Segundo a Salt Labs, no teste controlado bastava pedir ao Manus que analisasse a caixa de entrada; os pesquisadores dizem que não era necessário clicar nem roubar credenciais.[1]

Passo 2

Um e-mail fornece conteúdo não confiável

A mensagem continha instruções embutidas em conteúdo comum. A classificação ou o aviso do modelo não é uma barreira de segurança para esses dados.[1]

Passo 3

O conteúdo chega a um caminho de execução no servidor

A Salt Labs relata que o Manus processou o conteúdo por meio de um ambiente Node.js e executou código antes de exibir seu alerta e pedido de aprovação. A implementação interna exata não é pública; este é o relato dos pesquisadores, não uma auditoria do código-fonte.[1]

Passo 4

O contexto de execução alcança permissões conectadas

No teste controlado, a Salt Labs relata que o ambiente podia acessar tokens de serviços conectados pelo usuário. O alcance potencial dependia das integrações e permissões disponíveis nesse ambiente.[1]

Passo 5

A divulgação foi resolvida

A Salt Labs diz que reportou o problema pelo programa de recompensas da Meta e que a técnica específica deixou de ser explorável. Foi uma demonstração de pesquisadores, não um relato de violação de cliente; não há CVE nem diff público do patch.[1]

Código-Fonte: Vulnerável vs. Seguro

A Salt Labs não publica o código vulnerável do Manus nem o diff do patch do fornecedor. Estes exemplos ilustram uma falha geral de limite de confiança e uma arquitetura defensiva; não reconstituem o produto. Mantenha e-mails não confiáveis em um fluxo de resumo sem capacidade de execução. Uma política separada no servidor deve autorizar a ação exata antes de qualquer ferramenta ou ambiente executá-la.[1], [6]

IMPLEMENTAÇÃO VULNERÁVEL
// Desenho inseguro ilustrativo; não é código-fonte do Manus.
async function inspectEmail(email: Email) {
  return agent.process(email.body, { tools: [serverSideRuntime] });
}
PATCH SEGURO E ROBUSTO
// Barreira mais segura ilustrativa; não é a implementação nem o patch do Manus.
async function inspectEmail(email: Email, session: AuthenticatedSession) {
  const summary = SummarySchema.parse(
    await readOnlyModel.summarize({ content: email.body })
  );
  const proposal = ActionRequestSchema.parse(
    await readOnlyModel.proposeAction({ summary })
  );
  if (!proposal) return summary;

  const approval = await approvalStore.consumeExact({
    actorId: session.userId,
    action: proposal.action,
    resourceId: proposal.resourceId
  });
  const permit = await serverPolicy.authorize({
    actorId: session.userId,
    action: proposal.action,
    resourceId: proposal.resourceId,
    approval
  });
  if (!permit.allowed) throw new Error("Action denied");
  return narrowTools.execute(permit.approvedAction);
}

Lista de Verificação de Segurança para Engenharia

Fontes

← AI Security Directory →