IL2CPP 메타데이터 노출 취약점 대응 방안
다음과 같이 Unity 에디터의 소스 코드를 수정함으로써 공격자의 심볼 복구에 대한 대비를 할 수 있습니다.
Unity Editor의 설치 폴더에는 Unity에서 사용하는 다양한 플러그인, 리소스들이 존재할 뿐만 아니라, 프로젝트 빌드 시 사용되는 코드들 또한 존재합니다. Unity Editor는 Unity Hub 설치 시 기본적으로 C:\Program Files\Unity\Hub\Editor에 버전 별로 설치됩니다. 본 대응 방안에서는 Unity 2018.4.8f1 에디터를 예시로 사용하며, IL2CPP 빌드와 관련된 코드가 존재하는 C:\Program Files\Unity\Hub\Editor\2018.4.8f1\Editor\Data\il2cpp\libil2cpp를 기준으로 서술하겠습니다.
Il2CPP로 빌드된 프로그램의 경우 Runtime::Init() -> MetadataCache::Initialize() 과정을 거치게 되는데, 이 때 MetadataCache::Initialize()에서 LoadMetadataFile() 함수를 호출함으로써 global-metadata.dat 파일을 메모리에 로드하게 됩니다. 해당 함수들은 다음과 같습니다.
LoadMetadataFile()의 리소스 디렉토리 경로와 인자로 넘어간 파일 이름을 합쳐서 string 타입의 파일 경로를 resourceFilePath 변수에 저장하게 되는데, 이 부분을 수정함으로써 로드하는 파일의 경로를 수정할 수 있습니다.
코드 패치 예시
MetadataCache::Initialize() 함수의 경우 vm 디렉토리 내의 MetadataCache.cpp 파일 내에 존재합니다. LoadMetadataFile()를 호출할 때 전달하는 인자 값으로 메타데이터 파일의 이름을 줄 수 있습니다. 아래의 예시에서는 resource1.dat로 전달했습니다.
MetadataLoader::LoadMetadataFile() 함수의 경우 역시 vm 디렉토리 내의 MetadataLoader.cpp 파일 내에 존재합니다. 다음과 같이 메타데이터 파일을 읽어올 디렉토리 주소를 지정할 수 있습니다. 아래의 예시는 assets\bin\Data\Managed\TEST 디렉토리를 메타데이터가 존재하는 디렉토리로 지정한 예시입니다.
헤더파일 역시 필요에 따라 수정해준 뒤, IL2CPP로 빌드합니다.
이후, 생성된 앱을 디컴파일 한 뒤, 앞서 지정한 위치에, 알맞은 이름으로 global-metadata.dat 파일을 저장합니다. 아래의 예시에서는 TEST 디렉토리를 새로 추가하고 해당 디렉토리 안에 resource1.dat으로 global-metadata.dat 파일의 이름을 변경하여 저장했습니다.
위의 과정을 모두 수행한 뒤, 앱을 다시 리패키징하여 변경된 위치에서 메타데이터 파일을 로드시켜 정상적으로 앱을 동작시킬 수 있습니다.
로드하는 부분을 사용자가 직접 수정할 수 있기 때문에, 위의 예시처럼 단순히 메타데이터 파일의 이름을 변경할 수 있을 뿐만 아니라, 다른 파일 내에 메타데이터 파일을 저장한 뒤 해당 부분만 불러올 수도 있고, 암호화된 메타데이터 파일을 복호화하여 불러올 수도 있습니다.
상용솔루션이 아닌 개발자 단계에서 간단하게 적용할 수 있는 방법입니다.
'좀 열심히 쓴 글' 카테고리의 다른 글
[Project Zero] Bad Binder: Android In-The-Wild Exploit 분석글 (0) | 2020.03.07 |
---|---|
Unity IL2CPP 분석 (0) | 2020.03.06 |
시스템 수준 입출력(I/O) (0) | 2019.05.17 |
free.c 상세 분석일지 2 (glibc-2.25) (0) | 2019.04.16 |
malloc.c 상세 분석일지 1 (glibc-2.25) (0) | 2019.04.15 |