FlawOpen

flawopen.com/AI Security/microsoft-365-copilot-echoleak-prompt-injection-may-2025

● CVE-2025-32711 · CVSS 9.3 · Crítica
Pesquisa · FlawOpen

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]

💡 Explicação em Linguagem Simples (ELI5)

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ção
CWE-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

Fluxo de Ataque Passo a Paso

Passo 1

E-mail não confiável entra no contexto

Segundo o estudo publicado, o Copilot precisava processar ou recuperar o e-mail controlado pelo invasor durante o uso normal. Só a entrega não iniciava a cadeia; não era necessário abrir o e-mail nem clicar em algo.[3], [6]

Passo 2

Conteúdo tenta virar instrução

Os pesquisadores relatam que o conteúdo injetado contornava o classificador XPIA do Copilot e que Markdown no formato de referência escapava da remoção de links externos na resposta gerada.[3], [6]

Passo 3

Dados autorizados ficam alcançáveis

A resposta podia inserir informações já acessíveis à vítima em uma referência a imagem remota. O cliente buscava a imagem automaticamente, sem exigir clique.[3], [6]

Passo 4

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]

IMPLEMENTAÇÃO VULNERÁVEL
# 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
PATCH SEGURO E ROBUSTO
# 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

Fontes

← AI Security Directory →