[ndc07] 게임 개발에서의 클라이언트 보안 - 송창규

70
“클라이언트는 적의 손아귀에” 게임 개발에서의 클라이언트 보안 Lambda Team 송창규

Upload: changkyu-song

Post on 23-Jun-2015

3.203 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

“클라이언트는 적의 손아귀에”

게임 개발에서의 클라이언트 보안

Lambda Team

송창규

Page 2: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

목 차

위기의 시대 위기의 시대

클라이언틔 해킹의 종류

해킹 둘러보기 해킹 툴

기본 지식 둘러보기

세상 믿을놈 하나없다

대안 피해야 할 것들

클라이언트 해킹의 기술적 대안

안전한 클라이언트 만들기

The Attacker’s Advantage and the Defender’s Dilemma

Page 3: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

위기의 시대

위기의 시대

클라이언트 해킹의 종류

해킹 툴

Page 4: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

위기의 시대 - 범람하는 핵

Page 5: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

위기의 시대 - 이젠 익숙한 단어들

프리서버, 오토클라이언트, …

오토마우스, 매크로, …

스피드핵, 메모리핵, 맵핵, …

노딜핵, 무한핵, 투명핵, …

돈버그, 무한버그, 시체버그, 무적버그, …

RMT (Real Money Trading), Gold Farms, …

Page 6: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

위기의 시대 - Hack 2.0

Hack 2.0 - 더 이상 과거의 해킹이 아니다

Rootkit 발견되지 않도록 은닉하는 형태의 해킹 툴

Hooking API Hooking, Winsock Hooking, System Hooking

Virtualization 환경 제어가 강력해짐

Hacking Earns Money

Every Computer is Connected

Hackers goes Web 2.0 (Collaborate)

Page 7: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

게임 해킹(cheating)의 종류

Reflex Augmentation (반응 향상) 인간이 해야할 역할을 도움 – 오토마우스, aimbot, 매크로, 자동반응 등

Authoritative Clients (힘자랑 클라이언트) 하지 말아야 할것을 하게 함 – 텔레포트, 능력치 올리기, 제한 풀기 등

Information Exposure (정보 노출) 알지 말아야 할것을 알게 함 – 맵핵, 스탯핵, 투명벽 등

Bugs and Design Loopholes (Exploits) (버그) 기존 로직의 버그를 이용

Others Compromised Servers Environmental Weaknesses Social Cheats Identity Theft Reverse Engineering

Page 8: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 종류

Reflex Augmentation 인간이 해야할 역할을 도움 – 오토마우스, aimbot, 매크로, 자동반응 등

Page 9: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

Sudden Quiz !

USB Memory?

NO!

Page 10: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

Sudden Quiz – Answer

USB AutoMouse!

Page 11: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 종류

Authoritative Clients 하지 말아야 할것을 하게 함 – 텔레포트, 능력치 올리기, 제한 풀기 등

Page 12: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

장동건도 즐기는 맵핵

클라이언트 해킹의 종류

Information Exposure 알지 말아야 할것을 알게 함 – 맵핵, 스탯핵, 투명벽 등

Page 13: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 둘러보기

해킹 툴

기본 지식 둘러보기

어느정도까지 왔나

세상 믿을놈 하나없다

Page 14: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 분류

데이터 파일 조작

데이터 메모리 조작

실행 파일 조작

코드 메모리 조작

패킷 조작

환경 조작

네놈도 조작해주마

Page 15: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴

데이터 파일 조작 – WinHex, UltraEdit, …

데이터 메모리 조작 – TSearch, Cheat Engine, …

실행 파일 조작 – OllyDbg, Resource Hacker, …

코드 메모리 조작 – OllyDbg, Loader, …

패킷 조작 – WPE, Proxy, …

환경 조작 – Microsoft Windows, VMWare…

Page 16: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴 – More

모니터링 – ProcExp, FileMon, RegMon, Iris, …

실행압축 – UPX, ASPack, ASProtect, PECompact, …

은둔 – HxDef (Hacker Defender)

방어무력화 – “가드내려”, nProtect Bypassing, …

키로거

Reverse Engineering – IDA, HBGary Inspector, ...

Page 17: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴

OllyDbg 현재 크래커들이 가장 많이 쓰는 유저모드 디버거

유저 친화적 인터페이스

강력한 코드 분석 기능

C Runtime (strcpy, rand, …)

Reference Analysis

Call Graph

알아보기 쉽게 친절한 가이드

API

Stack 분석, 안내

Page 18: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴

OllyDbg 현재 크래커들이 가장 많이 쓰는 유저모드 디버거

유저 친화적 인터페이스

강력한 코드 분석 기능

C Runtime (strcpy, rand, …)

Reference Analysis

알아보기 쉽게 친절한 가이드

API

Stack 분석, 안내

“CreateMutexA”

API 도 파라메터와 함께 친절하게

“strstr”

C Runtime도 파라메터와 함께 친절하게

References

특정 코드를 역참조

Page 19: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴

OllyDbg – Plugins PDK 제공

다양한 플러그인

HideDebugger

UniversalHooker

CallGraph

View Dialogs

FindCrypt

OllyScript

String Access Finder

Page 20: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴

TSearch 현재 크래커들이 가장 많이 쓰는 치팅 툴

치트 양산화의 주범

추이를 입력하여 데이터 추적

5 3 1

늘었다 줄었다 줄었다

Data Freeze + 핫키

저장 / 공유

유사품

Cheat Engine

ArtMoney

Page 21: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴

TSearch – AutoHack 1.6 부터 등장

일종의 특화된 Debugger

Data Breakpoint 를 이용하여 데이터 변경 코드를 추적

데이터 치트 양산화에서 코드 치트 양산화로

Cheat Engine 등은 로더 제작기능도 있다

Page 22: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹 툴 – 간단한 시연

ProcMon

FileMon

RegMon

OllyDbg

Page 23: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

“ 아주 쉽죠? “

자, 따라해보세요

아주 쉽죠?

Page 24: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본 지식 둘러보기

Process & Memory

API

Kernel, IA32 architecture

Code Patch, Data Breakpoint

Buffer Overflow

Page 25: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본지식 – Process & Memory

Process & Memory

Process A.exe

0x0136000 stack

0x03d0000 heap

0x0400000 A.exe

0x6400000 MyDll.dll

0x7c80000 kernel32.dll

Memory

Address

Space

0x0136000 stack

0x03d0000 heap

0x0400000 A.exe

0x6000000 A.dll

0x6400000 MyDll.dll

0x7c80000 kernel32.dll

Process B.exe

0x0136000 stack

0x03d0000 heap

0x0400000 A.exe

0x6400000 MyDll.dll

0x7c80000 kernel32.dll

Memory

Address

Space

0x0136000 stack

0x03d0000 heap

0x0400000 B.exe

0x6400000 Mama.dll

0x6500000 MyDll.dll

0x7c80000 kernel32.dll

프로세스마다 Adress Space를 갖는다

(같은 포인터값이라도 프로세스마다 다른 데이터)

EXE 는 보통 0x0400000 에 위치

같은 DLL 는 보통 같은 주소에 위치

특히 OS 기본 DLL 은 같다고 봐도 된다

하지만 같은 프로세스의

두 DLL 의 주소영역이 겹칠 수 있다 !

Relocating / Rebasing

Page 26: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본지식 – API

함수를 호출하려면:

CALL 0x12340

두 프로세스의 서로 다른 DLL 이 같은 주소를 쓰려고 하면?

OS 는 DLL 의 주소를 동적으로 바꿀 수 있게 해준다

Relocation / Rebasing

DLL 호출하는 코드는 어떻게 바꾸지?

DLL 의 함수를 import 했을 경우 아래와 같은 코드 생성

CALL [0x43210]

IAT (Import Address Table)

Page 27: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본지식 – API Hooking

IAT 를 수정하면 API Hooking 이 가능

IAT 가 가리키는 주소의 코드를

직접 수정하는 방법도 있다

코드영역을 수정하기 위해서는 VirtualProtect 이용

PAGE_EXECUTE_READ PAGE_READWRITE

하나의 API 에는 여러가지 gateway 가 있다.

TextOutA TextOutW

OpenProcess NtOpenProcess / ZwOpenProcess

kernel32.dll ntdll.dll ntoskrnl

Page 28: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본지식 – 코드 해킹 방법

해커가 코드를 실행하는 방법 코드 가로채기

CreateRemoteThread

SetWindowsHookEx

Buffer Overflow

Many more in Kernel Mode

해커가 코드를 가로채는 방법 Code patching

IAT patching

Breakpoint

DLL hijacking

SEH (Structured Exception Handling) Access Violation

Division By Zero

Many more in Kernel Mode

Page 29: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본지식 – Kernel, IA32 architecture

Kernel, IA32 architecture Kernel mode - 권한 제약이 없다

Driver 를 개발하면 Kernel mode 에서 동작하는 프로그램을 만들 수 있다

Filter Drivers – No Hooking Necessary

IA32

Debug Register (Data Breakpoint)

Trap (Interrupt)

Page 30: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

기본지식 – Buffer Overflow

Buffer Overflow "Today's Denial of Service is Tomorrow's Code Execution.“

데이터만으로 코드 실행 가능

대부분 c string 처리에서 발생

c string 을 그냥 쓰는길은 자폭의 길

String Class 로 wrapping 해서 쓸것

정 써야할곳에는 strcpy_s, strcat_s 를 쓸것

Buffer

Max Size 와 Size 를 검사할것

Page 31: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

3D Wrapper DX

Page 32: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

Extracting SkeletalMesh of Lineage II

Page 33: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

Lineage II Free Server

Page 34: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

스타크래프트 해킹 맵핵 외에 스타 자체 버그를 잡아주는 유틸리티 등장

Reverse Engineering - 맵핵을 발견해주는 유틸리티 등장

Page 35: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

한스타 – 한글 스타크래프트 자체 Text Out 함수를 교체

비트맵 처리, 캐싱, 팔레트 처리, …

맵핵 방지 기능 (無맵핵 인증 기능)

Page 36: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

“Hacking World of Warcraft”

Page 37: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

HBGary Inspector 런타임 데이터 추적

스크립트를 통한 분석 자동화

Page 38: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

IDA – Analysing, Decompiling

Page 39: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

外掛(해킹툴) 의 범람

Page 40: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

해킹, 어느정도까지 왔나

보안 솔루션도 믿을수 없다 강력하지만, 맹신은 금물

많이 사용할 수록 많이 공격당한다는 법칙에도 가장 부합됨

전세계의 수많은 해커가 노리고 있다

타 프로세스가 메모리 읽지 못하게 막아주는 보안 솔루션 PrevX 를 이용하여

nProtect 가 메모리를 읽어서 검사하지 못하게 함

Page 41: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

창과 방패, 그 무한한 싸움

클라이언트의 보안은 한계가 있다 해킹과 보안 기술은 결국 하위 레벨에서의 동작을 같은 레벨이나 상위 레벨에서 감시/조작하는 기술

가장 상위 레벨(Kernel mode)까지 올라가면 결국 먼저 떠서 상대방의 코드를 가로채고 조작할 수 있는 쪽이 승리

Page 42: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

세상 믿을놈 하나없다

코드를 믿지 말라

라이브러리를 믿지 말라

OS 를 믿지 말라

컴퓨터를 믿지 말라

보안 솔루션을 믿지 말라

서버를 믿지 말라 (?) 서버와의 커뮤니케이션을 믿지 말라

사실 유일하게 믿어야 하는 존재는 서버이다.

Page 43: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

대안

피해야 할 것들

클라이언트 해킹의 기술적 대안

안전한 클라이언트 만들기

The Attacker’s Advantage and the Defender’s Dilemma

Page 44: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야 할 것들

Page 45: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야할 것들

XOR 암호화 맨눈으로 훑어봐도 보이는 XOR 은 암호화가 아니다.

일반적인 데이터에는 “0” 이 압도적으로 많음 – 패턴과 키가 쉽게 노출됨

일부 데이터 추적기는 XOR 데이터까지 찾아준다.

Page 46: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야할 것들

즉각적인 액션 빠른 리액션은 역추적의 지름길

특히, MessageBox 를 띄우는 로직은 가장 쉽게 드러난다

서버를 경유하거나 비동기적 로직과 임의의 딜레이와 함로 처리

Page 47: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야할 것들

즉각적이지 않은 액션 “당신은 한달 전에 해킹툴을 사용하였으므로 계정이 영구 블럭되었습니다“

대응까지의 시일이 많이 걸리면 역효과 – 학습 효과도 없고 유저가 이탈한다

운영과 기술의 중간적 이슈

Page 48: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야할 것들

String Data Display 목적이 아닌 String 은 모두 주의

특히 String 을 Key 로 쓸 경우 주의 - ScriptKid 도 쉽게 해킹가능

Page 49: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야할 것들

중요한 데이터를 Client 가 그냥 처리 서버로 처리하거나

다른 Peer 를 통해서도 처리하거나

유효성 검사를 하라

Page 50: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

피해야할 것들

XOR 암호화

즉각적인 액션

즉각적이지 않은 액션

String Data

중요한 데이터를 Client 가 그냥 처리

Page 51: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

Page 52: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

서버가 결정 Server Based Computing / Thin Client Model

빠른 반응성이나 클라이언트 데이터(메시 등)가 요구될 경우에는 한계가 있음

Page 53: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

유효성 검사 검사 후 결과를 보내지 말고, 보낸 데이터를 서버가 검사하라

클라이언트도 Double Check

정교한 동기화를 사용한다면 클라이언트끼리 검사

ex) Starcraft 는 서로의 데이터가 기대된것과 틀리면

즉시 멀티플레이에서 drop 시킨다

다양한 타이밍 / 방식으로 할 수록 좋다

ex)

매번 총을 쏠때마다:

이전 발사와의 시간간격

게임 종료후:

총 발사한 총탄/총 시간

내가 가한 대미지 수 : 발사한 총탄의 총 대미지

Page 54: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

“대세는 낚시” – Honeypot In computer terminology, a honeypot is a trap set to detect, deflect or in some manner counteract attempts at unauthorized use of information systems – wikipedia

실제 데이터는 암호화, honeypot plain data 를 둔다.

걸려들 경우 100% cheating ! (no false positive)

Page 55: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

원인과 결과의 연결고리 차단 클라이언트의 중요한 정보는 서버를 경유해서 처리

중요한 로직을 비동기 로직으로 처리

ex) Window Message, Command Queue

Multithreading 활용

Page 56: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

매번 다른 동작을 요구 인증 또는 데이터 유효성 검사시에 활용하면 좋다.

ex) 서버의 랜덤을 활용한 확률 기반 검사 요청 if (rand() % 100 == 0) { if (rand() % 100 == 0) { if (rand() % 100 == 0) send_req_verify_A() // 1/1000000 else send_req_verify_B() // 약 1/10000 } else send_req_verify_C() // 약 1/100 } else send_req_verify_D() // 99/100

Page 57: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

보안 솔루션 활용 맹신은 금물

“사용하는 사람이 많을수록 노리는 사람도 많다”

Page 58: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

Online 대처 시스템 평소에는 사용하지 않다가, 보안 위협 발생시 사용할 수 있는 시스템

ex) 서버측에서 커맨드를 내리면 특정 윈도 타이틀 / 프로세스명을 검색하여 새로 발견된 치트 프로그램 사용자 제재 처리

평소에 사용하지 않는 것이 핵심 해커에게 노출/공격당할 가능성이 적음

온라인상에서 클라이언트측으로 DLL 을 내려줄 수 있다면 더욱 좋다.

(denial of service 공격을 감안하여 DLL 로부터 “실패” 메시지를 받아 제재하지 말고 DLL 로부터 “성공” 메시지를 받지 못하면 제재)

Page 59: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

정보는 최소한으로 노출하라 디버깅 정보나 로그는 최소화 시켜라

PDB 절대 배포 금지

데이터 파일은 암호화

Page 60: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

클라이언트 해킹의 기술적 대안

서버가 결정

유효성 검사

“대세는 낚시” – Honeypot

원인과 결과의 연결고리 차단

매번 다르게 동작

보안 솔루션 활용

Online 대처 시스템

정보는 최소한으로 노출하라

Page 61: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

Page 62: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

아무것도 완전히 믿지 마라

Page 63: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

기획/설계시 해킹을 고려하라 Thin Client Model 의 경우, 기획시 클라이언트 판단 여지나 비중을 최소화 ( 액션 처리, 미니 게임 등 )

설계시 데이터의 흐름과 중요한 데이터를 검토 ( 서버에서 할 수 있는 처리는 서버가 한다 )

ex) Mabinogi, Kart Rider

Page 64: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

모든 소스가 공개되었다고 생각하라

Page 65: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

언제나 불리한 위치에 있음을 자각하라 “The Attacker’s Advantage and the Defender’s Dilemma” (뒤에 나옴)

DON’T UNDERESTIMATE

THE DARK SIDE OF THE

FORCE

HACKERS ARE

YOUR FATHER

Page 66: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

전문가와 상의하라 보안은 단순히 구현하는 영역이 아니다

직접 막는다고 하지만, 모르는 부분의 보이지 않는 구멍이 수두룩하다

전문가와 상의하면 보다 현명한 솔루션을 얻을 수 있다

Page 67: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

책임감을 가져라 결국 개발하는것은 사람이다

책임감은 개발 보안에서의 가장 중요한 요소중 하나

Page 68: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

안전한 클라이언트 만들기

아무것도 완전히 믿지 마라

기획/설계시 해킹을 고려하라

모든 소스가 공개되었다고 생각하라

언제나 불리한 위치에 있음을 자각하라

전문가와 상의하라

책임감을 가져라

Page 69: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

The Attacker’s Advantage and the Defender’s Dilemma

The defender must defend all points;

the attacker can choose the weakest point. 방어자는 모든 지점을 다 막아야 하지만 공격자는 한 곳만 골라 공격할 수 있다.

The defender can defend only against known attacks;

the attacker can probe for unknown vulnerabilities. 방어자는 알고 있는 범위만을 막을 수 있지만 공격자는 모르는 취약점을 찾아낼 수 있다.

The defender must be constantly vigilant;

the attacker can strike at will. 방어자는 언제나 늘 지키고 있어야 하지만, 공격자는 원하는 아무때 공격할 수 있다.

The defender must play by the rules;

the attacker can play dirty. 방어자는 원칙을 지켜 행동해야하지만, 공격자는 비열하게 공격할 수 있다.

Page 70: [NDC07] 게임 개발에서의 클라이언트 보안 - 송창규

Q & A

Any Questions?