모바일 앱 보안 솔루션 에스이웍스(SEWORKS) 김호 연구원이 총 세번의 연재를 통해 모바일 보안에 대한 인사이트를 전합니다.
3. 게임 앱 개발자들을 위한 대비책
지난 화에서는 일반 앱 개발자들이 보안에 관련된 구조적 문제들을 알아보고 어떻게 해결하는지에 대해 알아보았다. 이번 컬럼은 게임 앱 개발자들에게는 생소한 보안 문제점들을 파악하고 해결하는 방법을 탐구해 볼 것이다.
먼저 게임 앱과 일반 앱의 차이점에 대해 알아보자. 영화 티켓 예매와 같은 일반 앱은 기본적으로 이용자가 사용하지 않으면 앱의 응답이 없는 것이 보편적이지만, 대다수의 게임 앱은 사용자의 이용 여부와 상관 없이 실시간 작동이 가능하다. 현재 대다수의 게임 앱들이 이러한 실시간 처리 방식을 채택하고 있는데, 이를 위한 보안은 일반 앱의 수동적 입/출력 방식의 보안 방식보다 훨씬 더 까다롭다.
게임 앱을 개발하는 방식은 크게 두 가지로 나눌 수 있는데, 자바를 중심으로 개발하는 방식과, 다양한 게임 엔진들을 활용해서 개발하는 방식이 그것이다. 스마트폰 게임 시장은 개발 속도와 호환성이 성공의 중요한 요소로 불리는 만큼, iOS와 안드로이드를 동시에 지원하면서 여러 개발언어(C#, 자바스크립트, Boo)들을 지원하는 게임 엔진을 활용하는 게임 앱이 점차 많아지고 있는 추세다.
그렇다면 게임 앱에서는 어떠한 보안 문제점들이 존재할까? 게임 앱을 위협하는 악의적인 해커들과의 전쟁에서 지피지기 백전불태(知彼知己 百戰不殆) 하기 위해서는 그들이 어떠한 방법으로 게임 앱을 위변조하고 조작하는지에 대해 미리 숙지하는 것이 가장 중요하다. 일반적으로 게임을 크래킹할 때, 앱을 리패키징(Re-packaging)하여 내부에 작동되는 코드들을 수정하는 경우가 있고, 또한 메모리 해킹 앱을 이용해서 메모리 주소에 있는 값을 비정상적으로 조작하는 방법이 있다.
안드로이드에서 게임 앱 보안이 어려운 이유는 게임의 작동 흐름을 감지하는데 있어서 유지 비용이 굉장히 크기 때문이다. 일반적으로 게임 앱은 사용자의 입력, 상황 처리, 그리고 렌더링이 연속적으로 실행되기 때문에 이에 대한 보안을 실시간으로 검증하는 기능을 추가해야 한다. 하지만 이런 보안 대책을 수립하기에는 여러가지 성능 문제나 호환성의 문제가 있을 수 있다. 예를 들어, 실시간 상황으로 처리되는 부분마다 보안 기능을 일일이 추가하게 된다면, 게임 속도와 효율성이 저하될 뿐만 아니라 사용자의 게임 플레이 자체에도 영향을 끼칠 수 있다.
물론 이러한 문제들은 앱의 네트워크 통신 의존도에 따라 달라질 수 있다. 예를 들어, 온라인 게임 앱이 수시로 네트워크랑 통신 하는 경우, 서버 측에서는 비정상적인 값을 패턴화시키거나 판별하여 서버에서는 클라이언트의 패킷을 충분히 검증 하도록 설계하는 것이 좋다. 이 경우에, 클라이언트는 서버 통신의 무결성 검사와 서버에서 리턴 되는 값들을 검증하고 구분화 시키는 기능만 추가하면 되기 때문에 클라이언트가 비교적 보안을 통한 속도의 부담을 줄일 수 있다. 반면, 앱이 온라인 통신을 하지 않는 경우에는 앱 내부에서 모든 입출력에 관한 보안 기능을 쓰레드 혹은 유사한 기능으로 구현을 해야 하므로 클라이언트의 부담이 커질 수 밖에 없다.
또 다른 문제점은, 일반 앱과 마찬가지로 게임 앱도 앱 리패키징(Re-packaging)과 소스 디컴파일(Decompile)을 피해갈 수 없다는 점이다. 지난 화에서도 설명했지만 자바 코드는 디컴파일이 가능하며 다른 개발자들이 보기 쉽게 구현 되어있다. 이와 함께 게임 앱 개발시 이 부분을 한번 더 확인 해야하는 이유 중 하나가 유니티 엔진으로 개발된 코드들이 닷넷(.NET)을 활용하여 크로스 플랫폼으로 운영되고 개발되기 때문이다.
닷넷은 자바 가상머신과 똑같은 코드 실행 기반을 가지고 있으며, MSIL라는 언어로 컴파일이 된다. 아무래도 자바 가상머신과 같은 코드 실행 방식을 채택하고 있다 보니 디컴파일 또한 매우 쉽다는 문제점이 존재한다. 이 또한 지난 화에서 언급한 것과 마찬가지로 Proguard와 같은 난독화 솔루션이 닷넷에도 존재하지만 이를 해커 입장에서 봤을 때는 그다지 큰 장애물이 되지 않는다는 점이다. 결국 유니티 앱 또한 닷넷 기반 코드로 구성된 만큼 일반적인 디컴파일 프로그램을 통해 소스 코드를 확인할 수 있으며, MSIL 에 대한 어느 정도의 이해도만 있으면 유니티로 구현한 코드의 실행 흐름 또한 변조하여 리패키징 할 수 있다.
유니티와 같은 상용 게임 엔진들도 아직 완벽한 것이 아닌 것도 문제점이다. 유니티는 닷넷을 오픈소스로 구현한 Mono 엔진을 기반으로 작동이 되는데, 현재 유니티가 지원하는 Mono 버전은 현재 출시된 닷넷의 버전과는 차이가 나기 때문에 닷넷 개발 환경에 익숙한 개발자는 불편함을 느낄 수 있다. 이는 개발 과정 중 실수를 유발하게 할 수도 있을 뿐 아니라 버그와 취약점을 만들어내는데 한 몫을 할 수 있다. 따라서, 게임 엔진을 사용하여 개발 시, 많은 주의를 요하지 않으면 보안 위협이 늘어날 수 있다.
개발자이자 보안 연구원으로써 권유하고 싶은 제안으로는 보안 기능을 추가할 때 서버 측의 의존성을 높이고 게임 내 커뮤니티 활성화를 유도하는 것이다. 게임 내 커뮤니티를 활성화 시키면 해킹시도를 하는 사용자를 잡는데 큰 도움이 될 뿐만 아니라 게임 유저들과 함께 소통 하면서 기존에 발생하던 버그나 문제점을 개발자가 더 빠르게 이해하고 대처할 수 있도록 만드는 장점도 있다.
비용을 최소화하면서도 가장 효율적으로 보안을 하기 위한 방법으로는 비교적 리소스가 많은 서버가 보안을 담당하도록 지정하는 것을 추천한다. 구체적으로 설명하자면, 서버 측에서 사용자의 패턴을 확인한 이후, 만약 비정상적인 패턴이 발견되었을 때에 이를 차단하는 방식이다. 예전과 비교해서 최근에 출시되는 게임들은 이와 같은 서버에서 사용자의 행동을 파악하여 비정상적인 행동을 필터하는 보안 방식을 채택하였다. 물론 앱에서도 보안이 확실하게 검토되고 확인되어야 하지만, 서버 측의 보안이 가장 중요한 요소를 꼽힐 수 있다는 점을 유념해야 한다.
에스이웍스 (SEWORKS)는 국내 유명 화이트햇 해커 홍민표 대표와 와우해커 멤버들 및 보안 전문가들이 모여 설립한 모바일 앱 보안 솔루션 전문 스타트업이다.
글/김호 에스이웍스 연구원
You must be logged in to post a comment.