1. 개요

December 16, 2021 · View on GitHub

목차


1. 개요

UE4의 공격 벡터를 선정하고 분석한다.

공격 벡터를 리소스와 네트워크로 구분하고 분석을 진행하였다.

2. 리소스

Unreal Engine을 통해 만든 프로젝트는 패키징 과정을 거친다. 패키징을 하게 되면 게임의 기본 설정, 모델링, 오디오와 같은 리소스 파일, 게임의 로직을 표현하는데 사용되는 블루프린트 등은 Cook이라는 과정을 거치며, 이를 통해 게임에서 사용되는 파일인 Ini와 uasset, umap등의 파일로 변환된다.

UE4을 통해 만든 프로젝트는 자체적인 파일 포맷으로 리소스를 관리하며 게임을 배포할 시 쿠킹과 패키징 과정을 거쳐 최적화된 리소스 파일을 사용한다. 쿠킹과 패키징의 대상은 텍스쳐, 모델, 오디오와 같은 일반적인 리소스 파일부터, 게임 실행시 필요한 기본 설정, 게임의 로직을 표현하는데 사용되는 블루프린트등 여러가지 리소스 파일이 존재한다.

쿠킹과 패키징 과정에서 압축과 암호화가 이루어지며 이 과정에서 파일 크기, 이름, 오프셋등 다양한 정보가 직렬화 되어 저장되며 게임을 실행할 경우 해당 과정을 역순으로 진행하여 최종적으로 플레이어가 경험할 수 있는 리소스 파일로 메모리에 적재된다.

우리는 리소스 파일을 로딩하는 과정에서 취약점이 존재할 것으로 보고 여러 리소스 파일을 대상으로 공격 벡터를 선정하였다.

2.1. 리소스 파일

리소스 파일은 크게 에디터에서 사용하는 리소스 파일과 게임에서 사용하는 리소스 파일이 존재한다. 에디터에서는 크게 uasset과 umap이 존재한다. umap은 UE4에서 자체적으로 사용하는 파일로 모델과 액터의 위치와 각 모델과 액터에 대한 블루프린트등 정보가 저장된다. uasset은 에셋이 저장되는 파일로 에디터에서 텍스쳐, 모델, 임포트, 폰트등 임포트할때 추가적인 메타데이터를 포함하여 저장된다.

에디터에서 사용하는 파일의 경우 메타데이터와 원본데이터가 저장되어있기 때문에 게임에서 사용하기에는 크기가 크다. 그렇기 때문에 게임에서 사용하기 위해서는 처리를 거쳐야 되며 이 처리를 쿠킹과 패키징이라고 한다.

쿠킹과 패키징 과정에서 압축과 암호화가 이루어진다. 쿠킹과 패키징된 리소스 파일은 게임 배포시 배포되며 모드등으로 유저간에 공유가 용이하기에 취약점 발생시 파급력이 크며 퍼징 테스트에도 용이하기에 공격 벡터로 선택하였다.

우리가 선정한 공격 벡터는 다음과 같다.

  • 텍스쳐, 모델, 오디오 등 원본 데이터 파일
  • uasset
  • umap
  • pak

3. 네트워크

UE4에서는 자체적으로 네트워크와 관련된 다양한 기능을 제공하며 그 중, 공격 벡터로 이용할 수 있는 부분을 정리하였다.

3.1. RPC

RPC는 Remote Procedure Call(원격 프로시저 호출)의 약자로 프로세스의 내부가 아닌 외부 프로세스나 다른 네트워크에 존재하는 프로세스의 함수(메소드)를 호출하기 위한 인터페이스로 UE4에서는 온라인 게임을 구현하기 위해 사용된다. 크게 클라이언트끼리 통신하는 P2P(Pear to Pear) 방식과 일반적인 클라이언트-서버 구조를 가진 데디케이트 서버 방식이 존재한다.

UE4는 RPC를 호출하기 위해, 다양한 검증과 인증 과정을 거치며 해당 과정에서 취약점이 발생하면 사용자 권한 문제와 임의 결제등 게임의 운영과 직결된 치명적인 문제가 발생할 것으로 보여 공격 벡터로 선정하였다.

3.2. Pixel Streaming

Pixel Streaming(픽셀 스트리밍)은 UE4 4.27에서 추가된 기능으로 웹 프로토콜을 이용하여 게임을 제공하는 기능이다. 사용자 입력을 웹 브라우저로 입력받고, 연산과 렌더링등 부하가 큰 작업은 서버를 사용하는 방식이다. UE4에서는 플러그인 형식으로 제공하며 클라우드와 접목하여 사용자는 클라우드를 통해 제공되는 게임을 하거나 스트리밍을 할 수 있다.

우리는 최신 기능이며 픽셀 스트리밍이 이루어지는 과정에서 통신이 발생하고 패킷을 처리하는 과정에서 취약점이 발생할 수 있을 것으로 보고 공격 벡터로 선정하였다.