FlawOpen

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

● FlawOpenの対応付け: CWE-94 · 編集上の深刻度: 高
セキュリティ研究 · FlawOpen

Manus AIエージェントのメール経由プロンプトインジェクション:警告前にコードが実行

Salt Labsは、細工したメールによりManusがユーザーへの警告前にサーバー側ランタイムでコードを実行したと報告しました。研究者は責任ある開示を行い、問題は修正済みとしています。CVEや実際の被害者侵害は報告されていません。[1]

💡 わかりやすい解説 (ELI5)

郵便係が手紙を読み上げ、信頼できるか上司に確認する前に、隠された指示に従う場面を想像してください。警告は行動の後に届きます。未信頼の手紙の文面が最初から実行可能な指示にならないよう、セキュリティ境界で止める必要があります。[1]

主要な概念と専門用語

間接プロンプトインジェクション
ユーザーの直接指示ではなく、メールなどAIが調べるコンテンツに埋め込まれた指示です。[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はMetaのバグ報奨金制度を通じて報告し、この具体的な手法はすでに悪用できないと説明しています。研究者による実証であり、顧客侵害の報告ではありません。CVEや公開パッチ差分はありません。[1]

ソースコード比較:脆弱 vs 堅牢化

Salt LabsはManusの脆弱なソースコードやベンダーのパッチ差分を公開していません。これらは一般的な信頼境界の誤りと防御アーキテクチャを示す例で、製品を再現するものではありません。未信頼メールは実行機能のない要約経路で扱います。別個のサーバーポリシーが、ツールやランタイムの実行前に具体的な操作を認可する必要があります。[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 →