태그 보관물: unity

유니티(Unity) 보안 취약점 관련 조치

개요

10월 초쯤 Unity에서 다음의 제목으로 메일이 왔습니다.

Unity 플랫폼 보호: 게임과 앱 보호를 위해 즉시 조치가 필요합니다

내용을 확인해 보니 Unity 2017.1 이상 버전으로 Android 앱을 개발, 배포한 경우 문제가 되므로 조치하라는 내용이었습니다. 게임 개발 엔진에 취약점이 발견되어 메일까지 보냈다는 것은 심각한 문제가 아닐까하는 생각이 들었습니다. 그러나 아직 피해 사실이 보고 되지 않았다는 내용을 보고 당장 조치는 필요하지 않겠다고 생각했습니다.

다량의 메일

얼마 지나지 않아 메일이 많이 왔습니다. 좋지 않은 징조라고 생각했는데 다음과 같은 제목으로 메일이 왔습니다.

조치 필요: 앱이 Google Play 정책을 준수하지 않음

Unity로 제작해서 Google Play 에 배포한 앱과 게임이 몇 개 있었는데 모두 같은 내용이었습니다. 구글에서도 심각한 문제라고 생각하고 조치를 취한 것 같았습니다.

문제해결

이번 문제와 관련된 사항과 조치 방법은 이곳에서 확인하실 수 있습니다. 요약하자면 Unity 패치를 받아 업데이트 한 후 프로젝트를 다시 빌드해서 배포하라는 것 입니다.

필자는 2022.3.62f1 버전에서 빌드해서 배포 했습니다. Unity Hub 을 실행해 보니 해당 버전의 패치가 있었습니다. 2022.3.62f2 버전으로 업데이트 했습니다. 그 다음 프로젝트를 업데이트 된 버전으로 열었습니다. 이전 버전은 보안 문제가 있다는 메시지가 나타나서 사용하면 안된다는 것을 알 수 있습니다.

모든 프로젝트를 새로운 버전으로 변경
모든 프로젝트를 새로운 버전으로 변경

버전 코드, 번호를 업데이트 한 후 Google Play 올렸습니다. 앱이 업데이트 된 것을 확인하고 혹시 몰라서 문제가 해결되었다는 알림이 올 때까지 기다렸습니다. 최초로 다시 올린 앱이 문제가 해결되었다는 알림을 받고 경고가 사라진 것을 확인 후 나머지 것도 조치했습니다.

느낌 점

게임 엔진에 보안 문제가 있고 이것을 명시적으로 알리고 조치를 취하도록 한 것은 잘한 것이라고 생각 들었습니다. 방치하거나 숨겨서 문제가 되는 것 보다는 먼저 대응하는 것이 Unity, 개발자, 사용자 모두에게 도움이 되는 것이라 생각되었습니다. 처음 겪는 일이다 보니 좀 황당하기도 했습니다. 하지만 조금 생각해 보니 게임 엔진도 일종의 프로그램이라서 그럴 수 있겠다는 생각은 들었습니다.

다만 개발자/개발사 입장에서 보면 번거로운 작업임에는 분명했습니다. 필자의 경우 규모 자체가 그리 크지 않고 간단한 게임들이라서 조치가 비교적 간단했던 것 같습니다. 그런데 이것도 개수가 많아지니 꽤 번거로운 작업이었습니다. 규모가 큰 프로젝트의 경우 조치하기가 꽤 어려울 수 있겠다는 생각이 들었습니다.

정말 많은 앱과 게임이 영향을 받았을 것으로 생각되는데 게임 엔진 개발사에서 조금 더 주의를 기울여 주었으면 좋겠습니다. 모든 것을 완벽하게 만들 수는 없지만 수 많은 개발자/개발사에 영향을 주는 중요한 부분 만큼은 만전을 기해 주었으면 좋겠습니다.

Unity Android 15 대응

개요

가끔 앱의 정보를 확인해 보는데 메시지가 많이 쌓여 있었습니다. 불길한 마음으로 확인해 보니 최신 API를 타겟팅하라는 내용 이었습니다. ‘대상 API 수준이 최신 Android 출시로부터 1년 이내가 아니면 앱을 업데이트할 수 없습니다’ 라는 내용이었습니다. 매년 이맘때 쯤 연례 행사가 되어버린 것 같다는 생각이 들었습니다.

우선적으로 시도할 사항

일단 유니티 버전을 변경하지 마시고 대상 API 를 최신으로 변경하고 빌드하신 후 실기기에서 문제없이 동작하는지 확인하시기 바랍니다. 이렇게 해서 문제가 없다면 깔끔하게 마무리 하실 수 있을겁니다.

발생한 문제

필자의 경우 Unity 2021.3.37f1 버전이었습니다. Target API Level 을 36로 변경하고 빌드하면 오류 메시지가 나타났습니다. 그래서 Unity 버전을 2022.3.62f1 로 업데이트 했습니다. 업데이트 전 백업은 필수입니다.

하지만 Unity 업데이트 이후에도 빌드를 시도해도 제대로 되지 않고 오류만 발생되었습니다.

문제 식별

필자의 앱은 전면 광고가 있습니다. 그리고 이전 버전에서 지원 했던 R8(Project Settings > Player > Minify)이 체크되어 있었습니다. 버전을 변경하니 R8 항목이 아예 사라졌습니다. 이전 버전에서는 앞으로 사용되지 않는다고 안내가 되어 있었는데 별다른 신경을 쓰지 않았습니다. 오류 메시지에서 R8 관련한 메시지가 나타나서 이것과 관련한 설정 부분을 없애야겠다는 생각이 들었습니다. 구체적인 메시지는 다음과 같습니다.

FAILURE: Build failed with an exception.

* Where:
Build file 'D:\yourproject\Library\Bee\Android\Prj\IL2CPP\Gradle\launcher\build.gradle' line: 1

* What went wrong:
A problem occurred evaluating project ':launcher'.
> Failed to apply plugin 'com.android.internal.version-check'.
   > Cannot parse project property android.enableR8='' of type 'class java.lang.String' as boolean. Expected 'true' or 'false'.

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 38s

UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)

R8 항목이 사라졌다

문제 해결

Project Settings > Player 항목에서 다음과 같이 선택합니다.

Custom Base Gradle Template, Custom Gradle Properties Template 체크

Assets\Plugins\Android\gradleTemplate.properties 파일을 열어보면 android.enableR8=**MINIFY_WITH_R_EIGHT** 항목이 있는데 이것을 삭제하거나 주석처리 합니다.

Assets\Plugins\Android\baseProjectTemplate.gradle 파일을 열고

classpath ‘com.android.tools.build:gradle:4.0.1’ 이것을 classpath ‘com.android.tools.build:gradle:7.4.2’ 을 변경하고 빌드하면 정상적으로 파일이 생성됩니다.

글로 정리를 해서 간단하게 보이지만 상당한 시간과 노력이 필요했습니다. 필자와 같은 어려움을 겪고 계신분들께 도움이 되었으면 좋겠습니다.