flawopen.com/AI Security/microsoft-365-copilot-echoleak-prompt-injection-may-2025
EchoLeak no Copilot: CVE-2025-32711
CVE-2025-32711 permitia injetar prompts no Copilot por e-mail, sem clique. A Microsoft corrigiu o serviço; clientes não precisam agir.[2], [3]
Imagine um assistente que resume cartas e um sistema de pré-visualização que carrega automaticamente as ilustrações da resposta. Uma carta maliciosa induz o assistente a inserir numa ilustração uma referência a um dado privado; o sistema segue essa referência sem ninguém clicar. EchoLeak cruzou a fronteira entre o e-mail não confiável, a resposta do assistente e uma busca externa automática. A defesa é impedir que conteúdo não confiável autorize buscas e verificar cada pré-visualização em uma política separada.[3], [4]
Conceitos Centrais e Termos
Injeção indireta de prompt- Instruções escondidas em dados que uma IA lê e que tentam desviá-la da tarefa do usuário.[4], [3]
CWE-74: InjeçãoCWE-74: Injeção. O registro CVE da Microsoft informa essa classificação e CVSS 3.1 de 9,3 Crítico. A NVD mostra separadamente seu próprio enriquecimento 7,5 Alto; são avaliações distintas, não uma divergência sobre o identificador da vulnerabilidade.[2], [5]Caminho fonte-destino- Caminho verificável entre conteúdo não confiável, processamento do modelo e canal de ação ou divulgação.[3]
Microsoft 365 Copilot- Assistente de trabalho da Microsoft que usa o contexto do Microsoft 365 permitido ao usuário.[1]
Menor privilégio- Conceder a uma identidade ou ferramenta somente o acesso necessário para a tarefa atual.[4]
Mapeamentos de frameworks
- Referência CWE para a fraqueza descrita neste guia: CWE-74
- OWASP GenAI 2025 — LLM01:2025 Injeção de prompt
- OWASP GenAI 2025 — LLM02:2025 Divulgação de informações sensíveis
Fluxo de Ataque Passo a Paso
Saída é a fronteira decisiva
O artigo relata que um serviço de pré-visualização do Microsoft Teams, permitido na lista de CSP, buscava o destino externo da imagem e cruzava o limite de conteúdo pretendido. A Microsoft lançou uma correção no servidor; sua orientação diz que clientes não precisam agir.[3], [1], [2], [6]
Código-Fonte: Vulnerável vs. Seguro
Modelo didático da FlawOpen, não é código-fonte nem correção da Microsoft. O caminho vulnerável representa um renderizador que carrega automaticamente uma referência escolhida pelo modelo. O caminho defensivo aceita apenas um ServerValidatedPreview criado por um resolvedor confiável no servidor, verifica a política de destino controlada pelo servidor e a classificação não privada, e solicita que uma política confiável valide a aprovação vinculada à resposta e ao destino exatos. Essas são precondições explícitas: tipos Python, por si só, não tornam um valor confiável; em produção, os limites do resolvedor e da política devem ser impostos por código controlado pelo servidor. O código não faz solicitações de rede nem reproduz o payload ou a implementação interna do EchoLeak. A aprovação também fica vinculada à classificação dos dados.[3], [4]
# MODELO ABSTRATO DE RISCO: modela uma decisão de pré-visualização automática; não faz solicitações de rede.
from dataclasses import dataclass
@dataclass(frozen=True)
class PreviewRequest:
response_id: str
destination_id: str
provenance: str
contains_private_data: bool
def vulnerable_preview_decision(request):
return True
# MODELO ABSTRATO DE RISCO: modela uma decisão de pré-visualização automática; não faz solicitações de rede.
from dataclasses import dataclass
@dataclass(frozen=True)
class ServerValidatedPreview:
response_id: str
destination_id: str
provenance: str
data_classification: str
class ServerPolicy:
def destination_is_allowed(self, destination_id):
raise NotImplementedError
def verifies_exact_approval(self, approval, *, response_id, destination_id, data_classification):
raise NotImplementedError
# PRECONDICAO: somente codigo confiavel do servidor cria este valor validado.
def authorize_preview(request: ServerValidatedPreview, approval, server_policy):
if request.provenance != 'trusted-catalog' or request.data_classification != 'public':
return False
if not server_policy.destination_is_allowed(request.destination_id):
return False
return server_policy.verifies_exact_approval(
approval, response_id=request.response_id, destination_id=request.destination_id,
data_classification=request.data_classification
)
Lista de Verificação de Segurança para Engenharia
- ✓Adicione um teste de integração do renderizador que comprove que um recurso externo originado em e-mail recuperado não é carregado automaticamente, mesmo quando o modelo o inclui na resposta.[4]
- ✓Adicione um teste unitário da política que comprove que um recurso sem identificador de destino controlado pelo servidor e procedência confiável é bloqueado antes de qualquer serviço de pré-visualização buscá-lo.[4]
- ✓Vincule qualquer aprovação excepcional ao ID imutável da resposta, ao ID do destino e à classificação dos dados; teste se alterar qualquer campo invalida a aprovação.[4]
- ✓Registre ID da resposta, ID do recurso, categoria de procedência, decisão da política e classe do destino; confirme nos testes que e-mail, prompt e conteúdo privado da resposta não aparecem nos logs.[4]
- ✓No EchoLeak, a Microsoft informa que a correção no serviço já foi aplicada e nenhuma ação do cliente é necessária. Para outros agentes de IA, revise avisos dos fornecedores e imponha menor privilégio, aprovação para ações de alto risco e testes adversariais.[2], [1]
Fontes
- Microsoft Security Insider — AI application security considerations for organizations
- Microsoft Security Response Center — CVE-2025-32711
- AAAI case study — EchoLeak zero-click prompt-injection chain
- OWASP Top 10 for LLM Applications — Prompt Injection
- NVD — CVE-2025-32711 (NVD enrichment and CNA data)
- Aim Security / Aim Labs — original EchoLeak disclosure