FlawOpen

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

● CVE-2025-32711 · CVSS 9.3 · 심각
보안 연구 · FlawOpen

EchoLeak: Copilot 프롬프트 인젝션 CVE-2025-32711

CVE-2025-32711은 조작된 이메일로 클릭 없이 Copilot에 프롬프트를 주입할 수 있었습니다. Microsoft가 서비스 측에서 수정해 고객 조치는 필요 없습니다.[2], [3]

💡 알기 쉬운 설명 (ELI5)

편지를 요약하는 도우미와 답변 속 이미지를 자동으로 불러오는 미리보기 시스템을 상상해 보세요. 악성 편지가 도우미를 속여 이미지 참조에 비공개 정보의 참조를 넣게 하고, 미리보기는 클릭 없이 그 참조를 불러옵니다. EchoLeak는 신뢰할 수 없는 이메일, 도우미의 답변, 자동 외부 요청 사이의 경계를 넘었습니다. 방어하려면 신뢰할 수 없는 콘텐츠가 요청을 승인하지 못하게 하고 별도의 정책으로 각 미리보기를 검사해야 합니다.[3], [4]

핵심 개념 및 용어

간접 프롬프트 인젝션
AI가 읽는 데이터에 포함되어 사용자 작업에서 벗어나게 하려는 지시입니다.[4], [3]
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]

프레임워크 매핑

단계별 공격 실행 흐름

단계 1

신뢰할 수 없는 이메일이 컨텍스트에 들어감

공개된 사례 연구에 따르면 일반적인 사용 중 Copilot이 공격자가 제어한 이메일을 처리하거나 검색해야 했습니다. 이메일 전달만으로는 공격이 시작되지 않았으며, 이메일을 열거나 클릭할 필요도 없었습니다.[3], [6]

단계 2

콘텐츠가 작업과 경쟁함

연구진은 삽입된 콘텐츠가 Copilot의 XPIA 분류기를 우회했고, 생성된 답변의 참조 형식 Markdown이 외부 링크 제거를 피해 갔다고 보고했습니다.[3], [6]

단계 3

허용된 데이터에 도달 가능

답변에는 피해자가 이미 접근할 수 있는 정보가 원격 이미지 참조에 포함될 수 있었습니다. 클라이언트는 클릭 없이 이미지를 자동으로 가져왔습니다.[3], [6]

단계 4

출력이 결정적 경계

논문에 따르면 CSP 허용 목록에 있던 Microsoft Teams 미리보기 서비스가 이미지의 외부 대상을 가져와 의도된 콘텐츠 경계를 넘었습니다. Microsoft는 이후 서버 측 수정 사항을 배포했으며 고객 조치는 필요하지 않다고 안내합니다.[3], [1], [2], [6]

소스 코드 비교: 취약한 구현 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
    )

엔지니어링 및 시스템 보안 강화 체크리스트

출처

← AI Security Directory →