flawopen.com/AI Security/microsoft-365-copilot-echoleak-prompt-injection-may-2025
EchoLeak: Copilot 프롬프트 인젝션 CVE-2025-32711
CVE-2025-32711은 조작된 이메일로 클릭 없이 Copilot에 프롬프트를 주입할 수 있었습니다. Microsoft가 서비스 측에서 수정해 고객 조치는 필요 없습니다.[2], [3]
편지를 요약하는 도우미와 답변 속 이미지를 자동으로 불러오는 미리보기 시스템을 상상해 보세요. 악성 편지가 도우미를 속여 이미지 참조에 비공개 정보의 참조를 넣게 하고, 미리보기는 클릭 없이 그 참조를 불러옵니다. EchoLeak는 신뢰할 수 없는 이메일, 도우미의 답변, 자동 외부 요청 사이의 경계를 넘었습니다. 방어하려면 신뢰할 수 없는 콘텐츠가 요청을 승인하지 못하게 하고 별도의 정책으로 각 미리보기를 검사해야 합니다.[3], [4]
핵심 개념 및 용어
CWE-74: 인젝션CWE-74: Injection. Microsoft CVE 기록은 이 분류와 CVSS 3.1 9.3 Critical을 표시합니다. NVD는 별도로 7.5 High를 평가하며, 이는 서로 다른 평가이지 취약점 식별자의 불일치가 아닙니다.[2], [5]소스-싱크 경로- 신뢰할 수 없는 콘텐츠, 모델 처리, 작업 또는 공개 채널을 잇는 감사 가능한 경로입니다.[3]
Microsoft 365 Copilot- 허용된 Microsoft 365 컨텍스트를 사용하는 Microsoft 업무 도우미입니다.[1]
최소 권한- 현재 작업에 필요한 접근 권한만 ID나 도구에 부여하는 원칙입니다.[4]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-74
- OWASP GenAI 2025 — LLM01:2025 프롬프트 인젝션
- OWASP GenAI 2025 — LLM02:2025 민감 정보 노출
단계별 공격 실행 흐름
소스 코드 비교: 취약한 구현 vs 보안 패치
FlawOpen 교육용 모델이며 Microsoft 소스 코드나 패치가 아닙니다. 취약한 분기는 모델이 선택한 참조를 렌더러가 자동으로 불러오는 상황을 모델링합니다. 방어 분기는 신뢰할 수 있는 서버 측 리졸버가 만든 ServerValidatedPreview만 받아들이고, 서버가 관리하는 대상 정책과 비공개 데이터 분류를 확인하며, 신뢰할 수 있는 승인 정책에 정확한 응답과 대상에 결합된 승인을 검증하도록 합니다. 이는 명시적인 전제 조건입니다. Python 타입만으로 값이 신뢰 가능해지는 것은 아니므로 운영 환경에서는 서버가 관리하는 코드로 리졸버와 정책 경계를 강제해야 합니다. 네트워크 요청을 하지 않으며 EchoLeak 페이로드나 내부 구현을 재현하지 않습니다. 승인은 데이터 분류에도 결합됩니다.[3], [4]
# 추상 위험 모델: 자동 미리보기 결정을 모델링하며 네트워크 요청은 수행하지 않습니다.
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
# 추상 위험 모델: 자동 미리보기 결정을 모델링하며 네트워크 요청은 수행하지 않습니다.
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
# 전제 조건: 신뢰할 수 있는 서버 코드만 이 검증된 값을 생성합니다.
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
)
엔지니어링 및 시스템 보안 강화 체크리스트
- ✓렌더러 통합 테스트를 추가해 검색된 이메일에서 비롯된 외부 리소스가 모델 답변에 포함되어도 자동으로 불러오지 않음을 입증하세요.[4]
- ✓서버가 관리하는 대상 ID와 신뢰할 수 있는 출처가 없는 리소스는 미리보기 서비스가 가져오기 전에 거부된다는 정책 단위 테스트를 추가하세요.[4]
- ✓예외 승인을 변경 불가능한 응답 ID, 대상 ID, 데이터 분류에 결합하고 필드 하나라도 바뀌면 승인이 무효화되는지 테스트하세요.[4]
- ✓응답 ID, 리소스 ID, 출처 범주, 정책 결정, 대상 유형을 기록하고 원본 이메일, 프롬프트, 비공개 답변 내용이 로그에 없는지 테스트하세요.[4]
- ✓EchoLeak은 Microsoft가 서비스 측에서 수정해 고객 조치가 필요 없습니다. 다른 AI 에이전트는 공급업체 권고를 확인하고 최소 권한, 고위험 작업 승인, 적대적 테스트를 적용하세요.[2], [1]
출처
- 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