FlawOpen

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

● Correspondance FlawOpen : CWE-94 · Sévérité éditoriale : Haute
Recherche · FlawOpen

Injection de prompt par e-mail dans Manus : le code s’est exécuté avant l’alerte

Salt Labs indique qu’un e-mail spécialement conçu pouvait amener Manus à exécuter du code dans son environnement serveur avant d’avertir l’utilisateur. Les chercheurs déclarent avoir signalé le problème de manière responsable et qu’il est résolu ; aucun CVE ni compromission réelle de victime n’est rapporté.[1]

💡 Explication en Langage Simple (ELI5)

Imaginez un employé du courrier qui lit une lettre à voix haute puis suit les consignes qu’elle cache avant de demander à son responsable si elle est fiable. L’avertissement arrive après l’action. La frontière de sécurité doit empêcher dès le départ que le texte non fiable devienne une instruction exécutable.[1]

Concepts Clés et Termes

Injection indirecte de prompt
Instructions intégrées dans un contenu que l’IA doit examiner, comme un e-mail, plutôt que données directement par l’utilisateur.[1], [5]
Environnement d’exécution de l’agent
Processus et outils dont l’agent dispose. Ses permissions et son isolation déterminent l’impact des actions influencées par le modèle.[1], [6]
Contrôle avant exécution
Mesure qui bloque une action avant l’exécution de code ou l’appel d’un outil. Une alerte après coup ne peut pas empêcher cette exécution.[1], [6]
CWE-94 (correspondance éditoriale)
Contrôle inadéquat de la génération ou de l’exécution de code. FlawOpen utilise cette correspondance conceptuelle pour la transition démontrée du contenu non fiable au code ; Salt Labs n’a attribué ni CWE ni CVE.[4], [1]

Correspondances de référentiels

Déroulement de l'Attaque Étape par Étape

Étape 1

L’utilisateur demande à Manus de consulter ses e-mails

Salt Labs indique que son test contrôlé consistait à demander à Manus d’inspecter la boîte de réception ; aucun clic supplémentaire ni vol d’identifiants n’était nécessaire.[1]

Étape 2

Un e-mail apporte du contenu non fiable

Le message contenait des instructions intégrées au texte ordinaire. La classification ou l’alerte du modèle ne constitue pas une frontière de sécurité pour ces données.[1]

Étape 3

Le contenu atteint un chemin d’exécution côté serveur

Salt Labs indique que Manus a traité le contenu via un environnement Node.js et exécuté du code avant d’afficher son avertissement et sa demande d’approbation. L’implémentation interne exacte n’est pas publique ; il s’agit du récit des chercheurs, pas d’un audit du code source.[1]

Étape 4

Le contexte d’exécution dispose de permissions connectées

Dans son test contrôlé, Salt Labs indique que l’environnement pouvait accéder à des jetons associés aux services connectés par l’utilisateur. La portée potentielle dépendait des intégrations et permissions disponibles.[1]

Étape 5

La divulgation a été corrigée

Salt Labs affirme avoir signalé le problème via le programme de bug bounty de Meta et que cette technique précise n’est plus exploitable. Il s’agissait d’une démonstration de chercheurs, pas d’une brèche chez un client ; aucun CVE ni diff public du correctif n’existe.[1]

Code Source : Vulnérable vs Sécurisé

Salt Labs ne publie ni le code vulnérable de Manus ni le diff du correctif du fournisseur. Ces exemples illustrent une erreur générale de frontière de confiance et une architecture défensive ; ils ne reconstituent pas le produit. Gardez les e-mails non fiables dans un parcours de résumé sans capacité d’exécution. Une politique serveur distincte doit autoriser l’action exacte avant qu’un outil ou un environnement puisse l’exécuter.[1], [6]

IMPLÉMENTATION VULNÉRABLE
// Conception dangereuse illustrative ; ce n’est pas le code de Manus.
async function inspectEmail(email: Email) {
  return agent.process(email.body, { tools: [serverSideRuntime] });
}
PATCH SÉCURISÉ ET ROBUSTE
// Frontière plus sûre illustrative ; ce n’est ni l’implémentation ni le correctif de 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);
}

Liste de Contrôle de Sécurité pour l'Ingénierie

Sources

← AI Security Directory →