- EA 인증·게이트웨이 API의 노출된 Swagger 문서와 persona 업데이트 권한 검증 실패가 맞물리며, 다른 사용자의 계정 데이터와 로그인 흐름까지 영향을 받을 수 있었음
- 핵심은
/identity/pids/{pidId}/personas/{personaId}의 PUT 요청이 일반 EA Desktop OAuth 클라이언트의dp.client.default범위로 접근 가능했고, 본문 pidId와 경로 personaId의 소유권 검사가 부족했다는 점임 - 공격자는 persona 사용자명 변경,
BANNED상태 설정, persona 이동, 숨김 계정 persona ID 검색, Xbox persona 기반 로그인 우회를 조합해 계정 웹 로그인까지 도달할 수 있었음 - 영향 범위는 사용자명·일부 게임 데이터 탈취, 온라인 게임 접속 차단, 게임 밴 우회, Xbox를 통한 EA 계정 로그인까지 이어졌고, 심각도는 CVSS 10.0으로 평가됨
- 취약점은 2024년 6월 16일 EA에 보고됐고, EA는 6월 25일 critical로 분류한 뒤 7월 8일부터 10월 8일까지 persona 소유권 검사와 문서 제거를 포함한 패치를 배포함
EA 인증 환경에서 시작된 API 문서 노출
- EA Desktop에서 발견한 개발 환경 integration 테스트가 출발점이었음
- 프로덕션 인증 API는
accounts.ea.com - integration 인증 호스트는
accounts.int.ea.com
- 프로덕션 인증 API는
- integration 환경에서 권한 있는 access token을 얻을 수 있었고, 이 토큰으로 접근 가능한 API를 확인하기 위해 노출된 문서를 찾기 시작함
- 인증 엔드포인트는 reverse proxy 뒤에 있었으며,
/connect경로와 일반/경로의 404 응답 형식이 달랐고server헤더는istio-envoy였음 /connect/api-docs가 다른/connect경로와 다르게 빈 404를 반환해 별도 서비스 라우팅 가능성이 보였고,/connect/api-docs/index.json에서 Swagger 1.1 문서를 찾음- Swagger 문서는
/api-docs/connect를 가리켰으며, 이를swagger-codegen-cli로 OpenAPI 3.0 명세로 변환해 로컬 Swagger UI에서 확인함
Gateway에서 드러난 내부 API 목록
- EA Desktop은 “Service Aggregation Layer”라는 GraphQL API를 사용하지만, integration 환경의 SAL은 방화벽 뒤에 있었음
- 이전 버전으로 보이는
gateway.ea.com의 gateway API는proxy/{service}/{route}형식의 엔드포인트를 사용함 gateway.int.ea.com/proxy/api-docs/index.json은 80개가 넘는 서비스 문서 목록을 반환함addresses,agerequirements,billing,commerce등 여러 서비스가 포함됨
- 각 API 문서를 내려받아 최신 OpenAPI 명세로 변환한 뒤 접근 가능한 기능을 확인함
- 일부 엔드포인트는 EA 게임 팀 관련 “projects” 데이터를 반환했고,
basic.domaindata권한 범위가 필요했으며 프로덕션에서 해당 범위를 가진 클라이언트도 찾음- 예시 데이터에는 취소된 Star Wars 게임과 Apex Legends가
Titanfall3관련 그룹명으로 표시된 항목이 있었음
- 예시 데이터에는 취소된 Star Wars 게임과 Apex Legends가
- integration 환경에는 커스텀 게임 entitlement를 부여하는 방법도 문서화돼 있었지만, 다운로드와 플레이에 필요한 integration 서비스가 방화벽 뒤에 있어 실용성은 낮았음
- Xbox Live Server Token을 반환하는 엔드포인트도 있었으나 sandbox ID가
RETAIL이 아니어서 더 깊게 조사하지 않음
프로덕션 계정 정보와 persona 구조
- 문서의 각 엔드포인트는 필요한 인증 범위를 표시했고, 확인은 프로덕션 OAuth 클라이언트로 접근 가능한 엔드포인트를 중심으로 진행됨
/identity/pids/me는 계정의 일반 정보를 반환함- 이메일 마스킹 값, 이메일 상태, 생년월일 일부, 국가, 언어, 계정 상태, 약관 버전, 생성·수정·마지막 인증 시각, 2FA 활성화 여부 등이 포함됨
/identity/pids/me/personas는 계정에 연결된 persona 목록을 반환함- 기본 EA 계정은
cem_ea_idnamespace를 사용함 - Steam, Xbox 등 연결된 외부 계정도 각각 persona로 표시됨
- 기본 EA 계정은
- 게임은 일반적으로 persona 아래에 통계, 인벤토리 같은 데이터를 저장할 수 있어 플랫폼별 데이터가 분리될 수 있음
- 이후
cem_ea_idnamespace의 persona를 “Origin” persona로 지칭함
핵심 취약점: persona 업데이트 권한 검증 실패
/identity/pids/{pidId}/personas/{personaId}엔드포인트는 GET, PUT, DELETE 요청을 받음- PUT 요청은
dp.client.default와dp.server.default범위를 허용했고, 일반 EA Desktop 인증 클라이언트가dp.client.default를 갖고 있었음 - 요청 본문은
displayName,namespaceName,status,statusReasonCode,lastAuthenticated,nickName,pidId등을 받을 수 있었음 - 자신의 Origin persona에 대해
displayName을 바꾸는 PUT 요청은 성공했고, EA 계정 웹사이트의 사용자명이 변경됨- 이 요청은 사용자명 변경 쿨다운과 사용자명 변경 이메일 검증을 우회함
namespaceName변경은 효과가 없었음status값은ACTIVE,DISABLED,PENDING,DELETED,BANNED가 가능했고, 자신의 Origin persona 상태를BANNED로 바꾸자 EA Desktop은 계속 사용할 수 있었지만 게임 로그인은 차단됨- 더 큰 문제는 요청 본문의 pidId를 다른 계정 ID로 바꿀 수 있었다는 점임
- 자신의 Steam persona를 친구의 EA 계정으로 이동시키는 요청이 성공함
- 이후 다시 자신의 계정으로 되돌리는 것도 가능했음
로그인 검증과 XSS 시도
- 자신의 Steam persona를 친구 계정으로 옮긴 뒤 Steam으로 EA 웹사이트 로그인을 시도하자, 새 위치·신뢰되지 않은 기기 기반 이메일 검증이 나타남
- 표시된 일부 이메일은 자신의 것이 아니어서 친구 계정으로 로그인하려는 흐름까지 도달했지만, 위치 기반 2FA 단계에서 막힘
- persona 사용자명을
BattleDash <script>alert(1)</script>형태로 변경하는 요청도 성공함 - 계정 연결 페이지에서 alert가 실행돼 XSS가 가능했음
- 사용자가 EA 계정에 로그인된 상태에서 해당 연결 페이지로 유도되면 브라우저에서 코드를 실행해 세션을 추출할 수 있는 상황이었음
다른 계정 persona 직접 조작
- 경로의
personaId도 소유권 검증이 부족한지 확인하기 위해, 자신이 소유하지 않은 persona ID로 사용자명 변경을 시도함 - 새 테스트 계정의 persona ID를 얻은 뒤, 피해 계정 인증 없이 해당 계정의 사용자명을 바꾸는 요청이 성공함
- 같은 방식으로
status를BANNED로 바꿀 수 있었고, 해당 계정은 게임에 로그인할 수 없게 됨 /identity/personas는displayName으로 persona를 검색하고 persona ID, 계정 ID, 생성일, 마지막 로그인 시각을 반환함- 다만 계정을 숨긴 사용자는 표시하지 않음
/identity/namespaces/{namespace}/personas는 특정 namespace에서 검색하며, 사용자명과 persona ID만 반환하지만 숨김 계정도 반환함- 이 엔드포인트만으로도 필요한 persona ID를 얻을 수 있었음
persona 이동의 제약과 부분 계정 탈취
- 다른 사용자의 Origin persona를 자신의 계정으로 옮기려 하자
TOO_MANY_PERSONAS_FOR_NAMESPACE오류가 발생함- 자신의 계정에 이미 Origin persona가 있었기 때문임
- 콘솔로 가입한 계정은 해당 플랫폼 persona만 있고 Origin persona가 없을 수 있다고 보고, 콘솔 계정을 이용해 namespace 충돌을 피함
- 테스트 계정의 Origin persona를 콘솔 계정으로 옮긴 뒤, 피해 계정의 Origin persona를 자신의 계정으로 옮기는 방식이 가능했음
- 이 상태에서 로그인하면 피해자의 사용자명, 비크로스플랫폼 게임 통계, 일부 기타 계정 세부 정보가 표시됨
- 피해 계정으로 로그인하면 새 계정을 만든 것처럼 사용자명 선택을 요구하는 “Finish setting up my account” 흐름이 나타남
- Battlefield 2042 같은 최신 크로스플랫폼 게임의 entitlement, 친구, 저장 데이터는 persona가 아니라 EA 계정 자체에 저장돼 전송되지 않았음
- 그래도 공격자는 사용자 밴, 게임 밴 우회, 사용자명 탈취, 계정 데이터 인질화를 수행할 수 있었음
Xbox persona를 이용한 로그인 우회
- 기존 상태에서 가능한 작업은 자신의 linked account persona를 임의의 EA 계정으로 이동, 임의 persona를 자신의 계정으로 이동, persona 밴·사용자명 변경이었음
- 다른 사용자의 계정으로 로그인하려고 자신의 persona를 이동하면 이메일 검증이 나타났음
- 콘솔에서 EA 게임을 플레이할 때 2FA 프롬프트를 본 적이 없다는 점에 착안해 Xbox/PSN 토큰 기반 로그인을 확인함
- Nexus Connect API 문서에는 Xbox/PSN 토큰 전달 방식이 있었고, EA 사이트의 PSN 로그인 흐름에서 PSN client ID를 얻어 PSN 토큰 로그인을 시도함
- PSN 토큰 로그인은
ps3namespace persona를 만들고 2FA 없이 계정 로그인이 가능했지만,dp.client.default가 있는 클라이언트는ps3namespace를 다룰 수 없었음 /connect/tokeninfo에X-Include-Namespace헤더를 추가하자 OAuth 클라이언트별로 조작 가능한 persona namespace 목록이 있음을 확인함- 예시
JUNO_PC_CLIENT는cem_ea_id,steam,epic,xboxnamespace를 포함함
- 예시
- Xbox namespace는 허용됐지만 수동으로 게임 유효 Microsoft XSTS 토큰을 만들 수 없어, 실제 Xbox에서 테스트함
- 새 Microsoft 계정을 만들고 Xbox persona를 테스트 EA 계정에 연결한 뒤, 그 Xbox persona를 피해자 계정으로 이동함
- EA 웹사이트에서 Xbox 계정으로 로그인하면 새 위치 이메일 검증이 떴지만, Xbox에 Battlefield 2042를 설치해 게임에 로그인하자 피해 계정으로 접속됨
- 이후 같은 Xbox 계정으로 EA 웹사이트에 로그인했을 때 이메일 검증 없이 피해 계정 웹 로그인까지 성공함
영향 범위와 심각도
- 공격자가 사용할 수 있는 주요 경로는 두 가지였음
- 다른 사람의 persona 데이터를 계정 밖으로 이동해 사용자명과 게임 데이터를 탈취함
- 자신의 Xbox persona를 피해 계정으로 옮기고 Xbox에서 EA 게임에 로그인한 뒤, 네트워크가 신뢰된 상태가 되면 Xbox 계정으로 EA 웹사이트에 로그인함
- 추가 영향도 컸음
- 다른 사람의 persona를 밴 처리해 대부분의 온라인 게임 플레이를 막을 수 있음
- 다른 사람의 사용자명을 바꾼 뒤 자신이 가져갈 수 있음
- 게임 밴이 계정 전체 게임 entitlement 비활성화로 처리되기 때문에 persona를 새 계정으로 옮겨 게임 밴을 우회할 수 있음
- 이 흐름은 사용자 상호작용 없이 주로 단일 API 엔드포인트를 통해 가능했음
- 심각도는
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H기준 CVSS 10.0으로 평가됨
수정 일정과 후속 의견
- 취약점은 2024년 6월 16일 EA에 보고됨
- EA는 2024년 6월 25일 확인을 보내고 critical 심각도를 부여함
- 패치 일정은 다음과 같음
- 2024년 7월 8일: Patch 1 배포, persona ownership check
- 2024년 7월 18일: Patch 2 배포, 세부 내용 미상
- 2024년 9월 6일: Patch 3 배포, 세부 내용 미상
- 2024년 9월 10일: Patch 4 배포, 문서 제거
- 2024년 10월 8일: Patch 5 배포, 세부 내용 미상
- EA의 초기 예상은 수정이 연말까지 걸릴 수 있다는 것이었고, 노출된 문서와 단일 불안전 엔드포인트가 핵심인 사안에서는 더 빠른 임시 패치가 바람직했다는 평가가 나옴
- EA에는 아직 bug bounty 프로그램이 없고, 실질적 신고 보상이 없으면 취약점을 비공개로 보유하는 사람이 생길 수 있다는 우려가 남음
- 초기 테스트에 사용된 친구 계정은 동의를 받은 계정이었음