Unity 플랫폼 보호: 개발자 문제 해결 가이드
개요
Unity 2017.1 이상 버전으로 빌드된 Android, Windows, macOS용 게임과 애플리케이션에 영향을 미치는 심각한 보안 취약점이 확인되었습니다. 이 취약점으로 인해 로컬 액세스 권한을 가진 악의적인 사용자가 애플리케이션의 컨텍스트 내에서 임의 코드를 실행할 수 있으며, 그 결과 데이터 노출이나 권한 상승이 발생할 수 있습니다.
이 취약점은 Unity 애플리케이션이 임의 코드를 로드하고 실행할 수 있도록 하는 커맨드 라인 인자에서 발생합니다. 이 취약점의 영향은 호스트 플랫폼마다 다릅니다. 이 취약점이 타겟 플랫폼에 미치는 영향을 이해하려면 플랫폼별 기술 참고 사항을 확인하세요.
중요: 프로젝트가 Unity 2017 버전부터 오늘 배포된 패치 릴리스 사이의 버전으로 빌드된 경우 영향을 받을 수 있습니다. 영향을 받는 프로젝트를 소유한 모든 개발자는 조치를 취해야 합니다.
문제 해결 옵션
Unity 2017.1 이상 버전으로 빌드된 Android, Windows, Linux, macOS용 게임과 애플리케이션에 영향을 미치는 보안 취약점이 확인되었습니다. 취약점의 악용 사례는 발견되지 않았으며, 사용자나 고객에게 미친 영향도 없는 것으로 알려졌습니다. 이 취약점은 Unity 애플리케이션이 네이티브 및 관리되는 확장 프로그램을 로드하고 실행할 수 있도록 하는 커맨드 라인 인자에서 발생합니다. 이 취약점이 타겟 플랫폼에 미칠 수 있는 영향을 이해하려면 플랫폼별 기술 참고 사항을 확인하세요.
중요: 프로젝트가 Unity 2017 버전부터 오늘 배포된 패치 릴리스 사이의 버전으로 빌드된 경우 영향을 받을 수 있습니다. 영향을 받는 프로젝트를 소유한 모든 개발자는 조치를 취해야 합니다.
1. 패치된 Unity 에디터로 다시 빌드(권장)
영향을 받는 Unity 에디터 버전별로 패치된 릴리스를 다운로드할 수 있습니다. 패치된 Unity 에디터를 다운로드한 다음 애플리케이션을 다시 빌드할 수 있습니다.
패치된 Unity 에디터 버전으로 애플리케이션을 다시 빌드하는 방법은 다음과 같습니다.
- 애플리케이션을 빌드할 때 사용한 Unity 버전(예: Unity 6.1, Unity 2022.2 등)과 일치하는 Unity 에디터 최신 릴리스를 다운로드합니다.
- Unity Hub
- Unity 다운로드 아카이브
- 업데이트된 에디터에서 프로젝트를 엽니다.
- 애플리케이션을 다시 빌드하고 다시 테스트합니다.
- 배포 채널에 다시 퍼블리시합니다.
2. 빌드된 애플리케이션 패치
소스에서 다시 빌드할 수 없는 경우(또는 앱을 다시 빌드하는 동안 핫픽스를 배포하려는 경우), Unity 애플리케이션 패치 프로그램을 사용하여 기존 Android, Windows, macOS 빌드를 업데이트하세요.
Unity 애플리케이션 패치 프로그램을 사용하는 방법은 다음과 같습니다.
- Unity 애플리케이션 패치 프로그램 다운로드: 툴 다운로드
- 라이선스 계약, 사용 가이드, 고급 옵션을 검토하세요. 자세한 내용은 패치 프로그램 기술 자료를 참조하세요.
- 기존 빌드를 대상으로 패치 프로그램 툴을 실행합니다. Windows 또는 macOS 빌드를 패치하려면 인터넷에 연결되어 있어야 합니다.
- 패치 후 애플리케이션을 테스트하여 기능을 확인합니다.
- 배포 채널에 다시 퍼블리시합니다.
Unity 애플리케이션 패치 프로그램이 어떻게 동작하는지 이해하려면 플랫폼별 기술 참고 사항을 확인하세요.
참고:
- 패치 프로그램은 일부 변조 방지 또는 부정 행위 방지 솔루션으로 보호된 빌드와 호환되지 않습니다.
- 패치 후에는 항상 애플리케이션의 무결성과 기능을 확인하세요.
- Unity 애플리케이션 패치 프로그램 툴 자체는 Unity 6.0으로 개발되었으므로, 툴 실행에는 관련 Windows 또는 macOS 시스템 요구 사항이 적용됩니다.
플랫폼별 기술 참고 사항
다음 섹션에서는 보안 취약점이 Android, Windows, macOS 애플리케이션에 미치는 영향과 Unity 애플리케이션 패치 프로그램이 각 플랫폼에서 어떻게 동작하는지를 설명합니다.
커맨드 라인 | 영향을 받는 최종 릴리스 버전 | 설명 |
---|---|---|
-xrsdk-pre-init-library | Android, Windows, Mac, Linux: Unity 2019.1 이상 | 내부 Data/boot.config 파일에서 로드되어야 하는 인자에서 실행 시 Unity가 네이티브 라이브러리를 로드하도록 하며, 커맨드 라인 인자로 사용하도록 의도된 것이 아닙니다. |
-dataFolder | Windows: Unity 2022.2 이상 Mac: Unity 2023.2 이상 Linux Unity 2022.3 이상 | 데이터 폴더 이동 및 여러 데이터 폴더 간에 하나의 실행 파일 공유를 허용합니다. |
-overrideMonoSearchPath | Android 32-bit(mono), Windows(mono), Mac(mono), Linux(mono): Unity 2017 이상 | Mono에서 어셈블리를 로딩할 때 검색할 추가 폴더를 지정합니다. IL2CPP를 사용하는 경우 이 인자는 동작하지 않습니다. |
-monoProfiler | Windows(mono): Unity 2018.3 이상 | 외부 라이브러리에서 가져올 수 있는 Mono 런타임 내에서 프로파일러를 초기화하고 설정하는 데 사용합니다. IL2CPP를 사용하는 경우 이 인자는 동작하지 않습니다. |
커맨드 라인 | 영향을 받는 최종 릴리스 버전 | 설명 |
---|---|---|
-xrsdk-pre-init-library | ||
영향을 받는 최종 릴리스 버전 Android, Windows, Mac, Linux: Unity 2019.1 이상 | ||
설명 내부 Data/boot.config 파일에서 로드되어야 하는 인자에서 실행 시 Unity가 네이티브 라이브러리를 로드하도록 하며, 커맨드 라인 인자로 사용하도록 의도된 것이 아닙니다. |
커맨드 라인 | 영향을 받는 최종 릴리스 버전 | 설명 |
---|---|---|
-dataFolder | ||
영향을 받는 최종 릴리스 버전 Windows: Unity 2022.2 이상 Mac: Unity 2023.2 이상 Linux Unity 2022.3 이상 | ||
설명 데이터 폴더 이동 및 여러 데이터 폴더 간에 하나의 실행 파일 공유를 허용합니다. |
커맨드 라인 | 영향을 받는 최종 릴리스 버전 | 설명 |
---|---|---|
-overrideMonoSearchPath | ||
영향을 받는 최종 릴리스 버전 Android 32-bit(mono), Windows(mono), Mac(mono), Linux(mono): Unity 2017 이상 | ||
설명 Mono에서 어셈블리를 로딩할 때 검색할 추가 폴더를 지정합니다. IL2CPP를 사용하는 경우 이 인자는 동작하지 않습니다. |
커맨드 라인 | 영향을 받는 최종 릴리스 버전 | 설명 |
---|---|---|
-monoProfiler | ||
영향을 받는 최종 릴리스 버전 Windows(mono): Unity 2018.3 이상 | ||
설명 외부 라이브러리에서 가져올 수 있는 Mono 런타임 내에서 프로파일러를 초기화하고 설정하는 데 사용합니다. IL2CPP를 사용하는 경우 이 인자는 동작하지 않습니다. |
릴리스 스트림의 일부 베타와 패치 릴리스는 영향을 받지 않을 수 있습니다. 최종 릴리스가 아닌 버전으로 빌드해 배포한 경우 영향을 받는 전체 버전 목록을 확인하시기 바랍니다.
참고: Google, Meta, Microsoft에서는 플랫폼을 더 안전하게 보호하기 위해 OS 수준의 추가 조치를 배포했습니다. 그러나 Unity 애플리케이션을 완전히 안전하게 유지하려면 반드시 패치하거나 다시 빌드해야 합니다.
Android
참고: 취약점의 악용 사례는 발견되지 않았으며, 사용자나 고객에게 미친 영향도 없는 것으로 알려졌습니다.
Android의 경우, 제작한 Unity 앱이 Unity 2019.1 이상 버전으로 빌드되었다면 어떠한 특별한 권한이나 설정에 관계없이 조치를 취해야 합니다.
또한 앱이 Unity 2017 이상 버전으로 빌드되었고 Mono 런타임(32비트만 해당)을 사용하는 경우 취약점이 존재할 수 있습니다. 최종 릴리스가 아닌 버전으로 빌드해 배포한 경우 영향을 받는 전체 버전 목록을 확인하시기 바랍니다.
- Android에서는 일반적으로 애플리케이션이 서로 격리되어 있고, 취약점이나 잘못된 구성이 없는 한 앱 간 코드 삽입은 불가능합니다.
- 이 취약점을 악용하면 동일 디바이스 내 다른 앱이 목적별로 제작된 인텐트와
xrsdk-pre-init-library
커맨드 라인 인자나 Mono로 빌드한 32비트 앱에서overrideMonoSearchPath
를 통해 Unity 앱을 실행하고 악성 네이티브 라이브러리를 삽입할 수 있습니다. - Android 앱은
datafolder
나monoProfiler
커맨드 라인 인자에 취약하지 않습니다.
Android 관련 주요 변경 사항
Android의 이 취약점 해결과 관련된 주요 변경 사항은 없습니다.
Android용 Unity 애플리케이션 패치 프로그램
Android에서 Unity 애플리케이션 패치 프로그램은 APK 또는 AAB를 언팩하고 libunity.so
와 boot.config
를 로컬에서 수정하여 취약한 코드 경로를 차단한 다음, APK 또는 AAB를 다시 패키징하고 다시 서명합니다.
Unity 애플리케이션 패치 프로그램은 xrsdk-pre-init-library
문자열을 8rsdk-pre-init-library
로 변경하여 libunity.so
와 boot.config
모두에서 취약한 코드 경로를 차단합니다. 이 변경으로 인해, 인자 구문 분석 방식의 특성상 커맨드 라인 인자(또는 Android의 인텐트 엑스트라)로는 사용할 수 없게 됩니다. 단, boot.config
설정에서는 여전히 동작할 수 있으므로 boot.config
파일 내에서 사용되는 내용도 함께 패치합니다.
또한 Unity 애플리케이션 패치 프로그램은 Mono를 사용하는 32비트 빌드에서 overrideMonoSearchPath
인수를 비활성화하며, libunity.so
에서 overrideMonoSearchPath
문자열의 첫 번째 문자를 유효하지 않은 유니코드 문자 0xC0
로 교체합니다.
Windows
참고: 취약점의 악용 사례는 발견되지 않았으며, 사용자나 고객에게 미친 영향도 없는 것으로 알려졌습니다.
Windows와 같은 데스크톱 플랫폼에서는 실행 중인 프로세스에 코드를 삽입할 수 있는 다양한 방법이 있습니다. 그러나 이러한 방법들은 일반적으로 시스템 권한 수준과 보안 경계에 의해 제한됩니다. 대부분의 경우 본인이 직접 시작한 프로세스에만 코드를 삽입할 수 있고, 만일 삽입하더라도 해당 프로세스가 이미 가진 권한 이상으로는 추가 권한을 얻을 수 없습니다.
그러나 이 상황에서 Unity 앱이 커스텀 URL 스키마 핸들러로 등록되어 있다면 권한 상승에 취약할 수 있습니다. 이러한 등록은 애플리케이션에서 수행하거나(예: 딥링크 지원 또는 브라우저에서의 앱 실행), 다른 애플리케이션에서 수행할 수도 있습니다(예: 타사 게임 런처 또는 스토어 플랫폼).
타사 애플리케이션이 사용자의 애플리케이션을 스키마 핸들러로 등록했는지 확인하거나 등록을 막을 방법이 없으므로, Unity에서는 모든 Windows용 Unity 애플리케이션에 대해 예방 차원에서 패치를 적용할 것을 권장합니다.
- 등록된 URL 스키마가 있는 경우, 무결성 수준이 낮으면(샌드박스 환경이거나 권한이 제한된 프로세스 등) 코드를 실행하는 공격자가 이 Unity 취약점을 악용하여 앱을 실행하고 DLL을 삽입할 수 있습니다. 그 결과 애플리케이션이 원래보다 높은 권한으로 공격자가 제공한 코드를 실행하게 됩니다.
- 삽입은 위에 나와 있는 취약한 커맨드 라인 인자를 통해 발생할 수 있습니다.
Windows 관련 주요 변경 사항
- 앱에서
-datafolder
커맨드 라인 인자를 사용하여datafolder
를 이동하는 경우, 다음과 같이 customDataFolder를 UnityMain 함수에 두 번째 인자로 전달해야 합니다. int UnityMain(HINSTANCE hInst, LPCWSTR customDataFolder, LPWSTR szCmdLine, int nCmdShow)
- 앱에서 XR 제공자를 전환하기 위해
xrsdk-pre-init-library
를 커맨드 라인 인자로 사용한 경우, OpenXR을 사용하거나 별도의 빌드를 제공하는 방식으로 전환할 것을 권장합니다. overrideMonoSearchPath
커맨드 라인 인자를 제거하고 별도의 앱을 빌드하거나 동일한 빌드에 모든 스크립트를 포함하는 것이 좋습니다.
Windows용 Unity 애플리케이션 패치 프로그램
Windows 빌드의 경우 Unity 애플리케이션 패치 프로그램 툴에서는 사용 중인 Unity 버전에 맞는 패치된 UnityPlayer.dll
(또는 Unity 2017.1로 빌드한 애플리케이션의 .exe
)을 다운로드한 다음 빌드된 애플리케이션의 취약한 파일을 해당 파일로 교체합니다.
참고: Unity 애플리케이션 패치 프로그램은 Unity 서버에서 사전 패치된 바이너리를 가져오며, 사용자가 해당 바이너리를 받기 전에 테스트와 검증을 거쳤음을 보장합니다.
UnityPlayer.dll
은 취약한 커맨드 라인 파라미터를 무시하도록 수정되었습니다.
xrsdk-pre-init-library
는 여전히 boot.config
설정으로 동작합니다.
중요: 앱에서 -datafolder
커맨드 라인 인자를 사용하여 datafolder
(Unity 2022.2에서 도입)를 이동하는 경우 Windows 관련 주요 변경 사항 섹션에 안내된 새로운 방식을 적용해야 합니다.
macOS
참고: 취약점의 악용 사례는 발견되지 않았으며, 사용자나 고객에게 미친 영향도 없는 것으로 알려졌습니다.
macOS에서는 카메라 액세스나 사용자 문서 폴더 액세스와 같이 많은 권한이 애플리케이션 단위로 관리됩니다. macOS는 이러한 권한의 남용을 방지하기 위해 강화된 런타임 보안 기능을 포함한 여러 메커니즘을 제공합니다. 기본적으로, 강화된 런타임 보안으로 빌드된 앱은 서명되지 않았거나 다른 서명이 적용된 코드를 로드할 수 없습니다. 강화된 런타임 보안의 사용은 인증 절차이며 Mac App Store에 배포하기 위한 필수 사항입니다.
그러나애플리케이션이Unity 2017.1 이상(Mono 스크립팅 백엔드 포함) 또는 Unity 2019.1 이상(스크립팅 백엔드 포함)으로 빌드되었고, 강화된 런타임 보안으로 구성되어 있으며, 코드 삽입 보호를 약화시키는 특정 런타임 예외가 활성화되어 있다면 조치를 취해야 합니다. 앱을 취약하게 만들 수 있는 예외는 다음과 같습니다.
- 라이브러리 확인 비활성화(
com.apple.security.cs.disable-library-validation
) - 서명되지 않았거나 다른 서명이 적용된 플러그인이나 프레임워크 로드를 허용합니다. 이로 인해xrsdk-pre-init-library
나datafolder
인자를 사용할 때 악성 네이티브.dylib
파일이 로드될 수 있습니다. - JIT 컴파일 코드 실행 허용(
com.apple.security.cs.allow-jit
) -datafolder
또는overrideMonoSearchPath
인자가 악용될 경우 악성 관리 코드가 실행될 수 있습니다. 이 예외를 허용하는 것은 Mono 스크립팅 백엔드를 사용하는 모든 경우에 필수 사항입니다. - 서명되지 않은 실행 가능한 메모리 허용(
com.apple.security.cs.allow-jit
) - 이 또한datafolder
인자가 악용될 경우 악성 관리 코드 실행으로 이어질 수 있습니다.
강화된 런타임 보안은 일반적으로 흔히 사용되는 코드 삽입 방식을 차단하여 애플리케이션을 이러한 공격으로부터 보호합니다. 위 예외 중 하나라도 활성화된 경우, 영향받는 Unity 앱에서는 공격자가 xrsdk-pre-init-library
나 datafolder, overrideMonoSearchPath
커맨드 라인 인자를 통해 코드를 삽입할 수 있습니다.
이로 인해 공격자가 프로세스에 악성 .dylib
또는 관리되는 어셈블리를 삽입할 수 있습니다. 앱 자체에 부여되지 않은 권한에는 액세스할 수 없습니다.
macOS 관련 주요 변경 사항
- 앱에서
-datafolder
커맨드 라인 인자를 사용하여datafolder
를 이동하는 경우, 심링크를 사용할 것을 권장합니다. overrideMonoSearchPath
커맨드 라인 인자를 제거하고 별도의 앱을 빌드하거나 동일한 빌드에 모든 스크립트를 포함하는 것이 좋습니다.
macOS용 Unity 애플리케이션 패치 프로그램
macOS 프로젝트의 경우 Unity 애플리케이션 패치 프로그램 툴에서는 사용 중인 Unity 버전에 맞는 패치된 UnityPlayer.dylib
를 다운로드한 다음 빌드된 애플리케이션의 취약한 파일을 해당 파일로 교체합니다. boot.config
변수 xrsdk-pre-init-library
가 8rsdk-pre-init-library
로 변경되었습니다. 이 변경으로 인해 인자 파싱 방식의 특성상 커맨드 라인 인자로는 사용할 수 없게 됩니다. 단, boot.config
설정에서는 여전히 동작할 수 있으므로 boot.config
에 포함된 경우에도 함께 패치합니다.
중요: 앱에서 -datafolder
커맨드 라인 인자를 사용하여 datafolder
(macOS용 Unity 2023.2에서 도입)를 이동하는 경우 macOS 관련 주요 변경 사항 섹션에 안내된 새로운 방식을 적용해야 합니다.
패치 프로그램은 .app을 로컬에서 실행할 수 있도록 임시 서명을 사용하여 다시 서명합니다. 애플리케이션이 이전에 개발자 ID 인증서로 서명되고 Apple에서 인증된 경우, 패치 프로세스에서 해당 인증이 무효화됩니다. Apple 소프트웨어 배포 권고 사항에 따라 애플리케이션을 릴리스하세요.
Linux
참고: 취약점의 악용 사례는 발견되지 않았으며, 사용자나 고객에게 미친 영향도 없는 것으로 알려졌습니다.
Linux에서는 취약한 Unity 커맨드 라인 인자가 LD_PRELOAD
메커니즘과 유사하게 작동합니다. 표준 Linux 보안 모델에 따르면 이러한 인자는 권한 경계를 넘지 않으므로 LD_PRELOAD
에서 발생 가능한 것과 비교해 추가적인 위험이 발생하지 않습니다.
AppArmor, bubblewrap, Firejail 또는 SELinux와 같은 환경에서 제한된 프로세스가 제한 범위를 벗어나 Unity 애플리케이션을 실행할 수 있는 경우, 이미 임의 코드 실행이 가능하며, 이 취약점이 추가적인 위험을 초래하지는 않습니다. 특정 SELinux 또는 AppArmor 설정에서는 Unity가 임의의 인자로 시작될 수 있는 동안에도 흔히 사용되는 삽입 방식(LD_PRELOAD
, ptrace
)이 차단될 수 있습니다. 이 경우, 취약한 인자는 정책 제한을 우회하여 실행 가능한 악용 경로가 될 수 있습니다.
완화 조치
위험이 적기 때문에 유니티는 Unity 애플리케이션 패치 프로그램의 Linux 버전을 출시하지 않았습니다. 특히 엄격한 액세스 제어 정책이 적용되는 환경에서 필요한 경우, 패치된 Unity 에디터로 Linux 애플리케이션을 다시 빌드하여 취약한 코드 경로를 제거하세요.
기타 플랫폼(iOS, 콘솔 등)
iOS를 포함한 다른 모든 Unity 지원 플랫폼에서는 취약점이 악용될 가능성이 발견되지 않았습니다. 최고 수준의 보안을 위해, 유니티에서는 최신 패치가 적용된 Unity 에디터로 앱을 다시 빌드할 것을 권장합니다.
리소스
애플리케이션의 보안을 강화하고 사용자를 보호하기 위해 조치가 필요합니다. 질문이 있거나 도움이 필요한 경우, Unity 지원 팀에 문의해 주세요.