FlawOpen

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

● Соответствие FlawOpen: CWE-94 · Редакционная оценка: Высокий
Исследования · FlawOpen

Prompt-инъекция через почту в Manus: код выполнился до предупреждения

Salt Labs сообщила, что специально подготовленное письмо могло привести к выполнению кода в серверной среде Manus до предупреждения пользователя. Исследователи утверждают, что сообщили об этом ответственным образом и проблема устранена; CVE и реальный взлом пользователя не заявлены.[1]

💡 Простыми словами (ELI5)

Представьте сотрудника почтовой комнаты: он читает письмо и выполняет скрытые в нём указания, а уже потом спрашивает руководителя, заслуживает ли письмо доверия. Предупреждение появляется после действия. Граница безопасности должна не допустить превращения недоверенного текста письма в исполняемые инструкции.[1]

Ключевые понятия и термины

Косвенная prompt-инъекция
Инструкции в содержимом, которое ИИ должен изучить, например в письме, а не в прямом запросе пользователя.[1], [5]
Среда выполнения агента
Процесс и инструменты, которыми может пользоваться агент. Их права и изоляция определяют последствия действий под влиянием модели.[1], [6]
Контроль до выполнения
Мера, блокирующая действие до запуска кода или вызова инструмента. Предупреждение после выполнения не может его отменить.[1], [6]
CWE-94 (редакционная классификация)
Недостаточный контроль генерации или выполнения кода. FlawOpen использует это как концептуальную классификацию перехода от недоверенного содержимого к коду; Salt Labs не присваивала CWE или CVE.[4], [1]

Связи со стандартами

Пошаговый сценарий атаки

Шаг 1

Пользователь просит Manus проверить почту

По данным Salt Labs, в контролируемом тесте было достаточно попросить Manus изучить входящие; дополнительный клик или кража учётных данных не требовались.[1]

Шаг 2

Письмо передаёт недоверенное содержимое

Сообщение содержало инструкции внутри обычного текста. Классификация или предупреждение модели не является границей безопасности для этих данных.[1]

Шаг 3

Содержимое попадает в серверный путь выполнения

Salt Labs сообщает, что Manus обрабатывал содержимое через среду Node.js и выполнял код до появления предупреждения и запроса подтверждения. Точная внутренняя реализация не опубликована; это рассказ исследователей, а не аудит исходного кода.[1]

Шаг 4

Среда выполнения имеет доступ к подключённым разрешениям

В контролируемом тесте среда, по данным Salt Labs, могла обращаться к токенам подключённых пользователем сервисов. Потенциальный охват зависел от доступных интеграций и разрешений.[1]

Шаг 5

Уязвимость устранена после раскрытия

Salt Labs сообщает, что передала сведения через программу bug bounty Meta и конкретный приём больше не работает. Это демонстрация исследователей, а не сообщение о взломе клиента; CVE и публичного diff исправления нет.[1]

Исходный код: Уязвимый vs Защищённый вариант

Salt Labs не публикует уязвимый исходный код Manus или diff исправления поставщика. Примеры иллюстрируют общую ошибку границы доверия и защитную архитектуру, а не реконструируют продукт. Недоверенная почта должна обрабатываться в режиме суммаризации без возможности выполнения. Отдельная серверная политика обязана разрешить конкретное действие до его выполнения инструментом или средой.[1], [6]

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
// Иллюстрация небезопасного дизайна; это не исходный код Manus.
async function inspectEmail(email: Email) {
  return agent.process(email.body, { tools: [serverSideRuntime] });
}
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
// Иллюстрация более безопасной границы; не реализация и не патч 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);
}

Чек-лист по защите системы для инженеров

Источники

← AI Security Directory →