• 'RIOT'S APPROACH TO ANTI-CHEAT' 리뷰


게임을 하지 않는 사람도 한번쯤은 들어봤을 법한 LOL(League Of Legends) 게임을 개발한 Riot Games 에서 흥미로운 보고서를 썼다Riot Games 에서 Cheating(부정 행위) 에 대해 어떻게 대응하고 있는지에 대한 보고서이다. 


게임사에서 직접 자신들의 게임에 적용되어 있는 Anti-Cheat 기법을 보여주는 것이기 때문에 현재 서비스 중인 게임이 어떤식으로 부정 행위에 대응을 하고 있는지 간략하게 살펴보기 좋을 것 같다. 


재미있는 내용이어서 원문 보고서를 전체적으로 요약하며 정리해 보았다. 게임보안에 대한 이해가 적어 용어의 혼동이 조금 있을 수 있다.


(원문링크: RIOT'S APPROACH TO ANTI-CHEAT )






  • 본문 내용 요약


보고서 작성자는 과거 10 년 동안 치트 프로그램을 개발했었다고 한다. 하지만 지금은 라이엇 게임즈의 Anti-Cheat 팀에서 리그 오브 레전드(이하 LOL)의 보안 업무를 수행하고 있다. 이번 보고서를 쓴 이유에 대해서 라이엇 게임즈에서 치트 프로그램(혹은 부정 행위)에 대해 어떻게 대응하고 있는지 이야기 하고, 최신 Anti-Cheat 기법을 설명하고 싶었다고 한다. 그러나, 현재 서비스 중인 게임의 무결성을 위해 구체적인 사항에 대해서는 공유하지 못하는 부분이 있을 수 있다고 밝혔다. 글을 읽어보면 알겠지만, 'Anti-Cheat 기법이 실제 LOL 에서 어떻게 적용 되어 있는가' 에 대한 글 보다는 몇 가지 Anti-Cheat 기법의 간략한 설명인 느낌이 강하다.



라이엇 게임즈에서는 부정 행위에 대해 '예방(Prevent)', '탐지(Detection)', '제지(Deterrence)' 3가지에 초점을 맞추고 있다. 


'탐지' 와 '제지' 는 모니터링 중 부정 행위가 발생하면 부정 행위 당사자(플레이어)를 게임에서 제거하는 방식이다. '탐지' 와 '제지' 전략은 정상 플레이어가 부정 행위를 겪어야 된다는 단점이 있기 때문에 '예방' 을 도입했다고 한다.



보고서에서는 LOL 에서 발생하는 부정 행위를 크게 두 가지로 나누었다. ScriptingBotting 이다. 


Scripting 은 프로그램을 조작하여 기능을 변경하거나 캐릭터의 움직임을 조작 할 수 있게 하는 것이고, Botting 은 게임을 자동으로 진행해 레벨업이나 돈을 벌게 해주는 것 이라고 한다. 쉽게 말해, 보고서에서 말하는 Scripting 은 LOL 에서 헬퍼로 알려진 핵 툴 같은 분류이고, Botting 은 게임 자동 진행 시스템(?) 정도로 생각하면 될 것 같다. 


나도 LOL 을 해봤지만 핵툴을 쓰는걸 본적이 없고, 사용해 본적은 더더욱 없기에 적절한 비유를 했는지는 모르겠다. Scripting 과 Botting 의 정확한 분류가 중요한 것은 아니니 느낌만 이해하고 넘어가면 될 것 같다.



이러한 공격기법에 대해 LOL 에서는 게임 설계단계에서부터 공격이 어렵도록 만든 부분이 있다고 한다. 세 가지를 설명하고 있는데 다음과 같다.


  • 다른 플레이어 대해 공유할 필요가 없는 정보는 공유하지 않는다. 결과적으로 맵핵(Map Hacks) 이라고 불리는 일반적인 부정 행위를 피할 수 있다.
  • 기본적으로 클라이언트로부터 받는 정보를 신뢰하지 않으며, 서버 시뮬레이션으로 게임을 진행한다. 따라서, "God Mode" 나 "Disconnect Hacks" 를 방지 할 수 있다.
  • 네트워크 프로토콜은 난독화 되어 있으며, 정기적으로 난독화가 바뀌고 있다. 이 것은 네트워크 레벨의 봇의 동작을 어렵게 한다.


사실, 게임 시스템에서 가장 취약한 부분은 게임 클라이언트 부분이라고 한다. 보고서에서는 게임 클라이언트 공격에 대응하는 세 가지 구체적인 예를 제시한다. 이 세가지 구체적인 예가 이 보고서에서 우리가 가장 집중적으로 봐야 할 부분이다.



세 가지 예는 다음과 같다. '게임 코드 암호화' , '디버거의 동작을 어렵게 하기' , '데이터 보호'. 잘 살펴보면, 이 세 가지 기법은 결국 게임 클라이언트 디버깅을 어렵게 하기 위한 기법이다. 라이엇 게임즈는 세 가지 기법을 어떻게 게임에 적용했는지 알아보자




게임 코드 암호화


원문 보고서를 보면 '게임코드 암호화' 부분이 상당히 길게 작성되어 있는데, 사실 읽어보면 단순히 '패킹' 에 대한 이야기이다. 분석을 해본사람은 알겠지만, 패킹(혹은 프로텍팅)되지 않은 프로그램의 코드는 고수준의 슈도코드로 쉽게 변환 될 수 있다. 시간이 얼마나 걸리냐의 문제일뿐 이렇게 되면 대규모 게임 프로젝트도 오픈소스랑 다를바가 없게 된다.



라이엇 게임즈에서도 당연히 이 문제를 알고 있기때문에 자신들이 자체 개발한 패킹 솔루션을 사용하고 있다고 한다. 패커의 원리에 대한 설명은 크게 별다를 내용이 없었다. 



패킹 원리에 대한 이야기가 끝난 뒤, 라이브러리 종속성과 무결성에 대해 재미있는 아이디어를 얘기했다. 패킹을 아무리 어렵게 제작해도 게임 클라이언트가 실행 될 때 같이 로드 되는 라이브러리들은 패커의 코드가 실행되기도 전에 이미 로드 된 후인데 이 라이브러리가 악성이면 어떻게 할 것인가에 대한 물음에서 시작한다.



패커의 엔트리 포인트가 시작되기 전 이미 로드되는 라이브러리에 대해 무결성을 검증하기 위해서 라이엇 게임즈는 재밋는 방법을 사용했다. 언패킹 루틴을 게임 클라이언트가 아닌 외부 라이브러리에 작성하는 것이다. 그리고 언패킹 라이브러리에는 언패킹 루틴 뿐만 아니라 로드 될 라이브러리들에 대한 무결성 검사를 수행하는 루틴을 작성한다. 이렇게 하면 엔트리 포인트 진입 전 외부 라이브러리에서 앞으로 로드 될 라이브러리에 대한 무결성 검증이 가능해진다. 



보고서 내용을 보고 어떤 라이브러리가 저런 역할을 하는지 직접 찾아보고 싶었지만, 현재 서비스 중인 게임 클라이언트를 분석하고 블로그에 포스팅을 할 수 없기에 여기에서는 보고서에서 밝힌 내용만 언급하고 넘어간다.



이외에도, 언팩 루틴을 진행하여 모든 코드가 한번에 풀리는 것이 아니라 게임 동작 중에 필요한 부분만 언팩이 된다고 한다. 


악성코드에서도 종종 이런 기법이 사용되는 것을 봤다. 개중에는 필요할 때만 함수를 복호화 하고 사용이 끝난 함수는 다시 암호화 해서 이전의 함수 혹은 이후의 함수를 모두 볼 수 없게 만드는 아주 귀찮은 녀석도 있었다. LOL 클라이언트에서도 이와 비슷한 루틴을 사용하지 않았을까 생각한다.



이렇게 해서 디컴파일러로의 분석은 상당히 어렵게 만들었으나, 어쨋든 원본코드는 메모리에서 반드시 실행되는 법. 다음은 디버거의 사용을 어렵게 하는 방법에 대해 설명했다.




디버거의 생존을 어렵게 하기


안티 디버깅을 수행하기 위해 라이엇 게임즈에서 취한 조치는 단순하면서도 효과적이다. 수 많은 안티 디버깅 기법을 곳곳에 숨겨 놓는다고 한다. 단, 매 빌드마다 임의의 위치임의의 안티 디버깅 기법이 적용된다고 말하고 있다. 또한, 원격으로 디버깅 당하는 사실을 확인 할 수 있으며 디버깅 당하는 도중 이후의 동작을 수정하여 예측 불가능하게 한다고 한다.




데이터 보호


게임코드가 보호되고, 안티 디버깅 레벨도 충분하지만 아직 데이터는 보호되지 않았다. 대부분의 공격자는 메모리 탐색 도구(아마 치트엔진을 말하는 것으로 보임)를 통해 게임 상의 데이터를 찾는다. 데이터의 메모리 주소를 알아내고 그것을 기반으로 다른 중요한 정보를 찾는다. 


예를 들어, Health Point, Mana 와 같은 게임에서 사용되는 값을 찾는다. 해당 값은 게임 플레이어의 상태를 나타내는 거대한 클래스나 구조체 일 수 있고, 그 구조체는 게임 플레이어의 위치, 스킬 레벨 등의 정보가 담겨 있을 수 있다. 이런 정보들은 공격자에게 아주 유용한 정보가 될 수 있다.


공격자들은 메모리 탐색 도구를 통해 플레이어가 변화 시키는 값을 통해 찾고자 하는 데이터의 메모리 위치를 좁힌다. 수 많은 반복으로 실제 어느 위치에서 해당 값이 사용되는지 찾는다. 


라이엇 게임즈는 변경된 데이터를 같은 메모리 주소에 쓰지 않는 방법으로 이런 메모리 탐색을 방지한다. 거기에 약간의 암호화를 추가하여 원하는 데이터를 바로 찾을 수 없게 만들었다고 한다.





  • 결론


이번 보고서에는 크게 특징적인 내용이나, 기발한 기법을 얘기하는 것은 아니다. 그러나, 누구나 기본이라고 생각 할 법한 기술들이 실제 서비스 중인 게임에 적용 되어 있음을 알 수 있었다. 


또한, 이미 적용되어 있는 기술들을 보며 다음은 어떻게 공격해야 취약지, 어느 부분이 덜 방어적인지 생각 해 볼 수 있는 기회를 가질 수 있다. 


이번 문서는 상세한 기술 하나하나 보단 전체적인 흐름을 파악하면 좋을 것 같다.








'기타' 카테고리의 다른 글

대칭 키 암호화와 비대칭 키 암호화  (0) 2018.01.07
암호학 관련 기본용어  (0) 2018.01.04
블로그 이미지

Elfmfl

,