이것은 인터넷 게임 및 콘테스트의 고전적인 문제입니다. Flash 코드는 사용자와 함께 게임 점수를 결정합니다. 그러나 사용자는 신뢰할 수 없으며 Flash 코드는 사용자의 컴퓨터에서 실행됩니다. 당신은 SOL입니다. 공격자가 높은 점수를 얻지 못하도록하기 위해 할 수있는 일은 없습니다 :
바이트 코드가 잘 문서화되어 있고 고급 언어 (Actionscript)를 설명하기 때문에 Flash는 생각보다 리버스 엔지니어링이 훨씬 쉽습니다. 플래시 게임을 게시 할 때 소스 코드를 게시하고 있습니다. 알고 있든 없든
공격자는 Flash 인터프리터의 런타임 메모리를 제어하므로 프로그래밍 가능한 디버거를 사용하는 방법을 알고있는 사람은 언제든지 변수 (현재 점수 포함)를 변경하거나 프로그램 자체를 변경할 수 있습니다.
시스템에 대한 가장 간단한 공격은 프록시를 통해 게임의 HTTP 트래픽을 실행하고 점수를 많이 저장 한 후 더 높은 점수로 재생하는 것입니다.
예를 들어 게임 시작시 클라이언트에 암호화 된 토큰을 전송하는 등의 각 최고 점수 저장을 게임의 단일 인스턴스에 바인딩하여이 공격을 차단할 수 있습니다.
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(세션 쿠키를 같은 효과로 사용할 수도 있습니다).
게임 코드는이 토큰을 높은 점수 저장과 함께 서버로 에코합니다. 그러나 공격자는 여전히 게임을 다시 시작하고 토큰을 얻은 다음 해당 토큰을 즉시 재생 된 최고 점수 저장에 붙여 넣을 수 있습니다.
따라서 다음으로 토큰 또는 세션 쿠키뿐만 아니라 높은 점수의 암호화 세션 키도 제공합니다. 이것은 128 비트 AES 키이며, 플래시 게임에 하드 코드 된 키로 자체 암호화됩니다.
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
이제 게임에서 최고 점수를 올리기 전에 최고 점수 암호화 세션 키를 해독합니다. 이는 최고 점수 암호화 세션 키 암호화 키를 Flash 바이너리로 하드 코딩했기 때문에 가능합니다. 이 해독 된 키를 사용하여 최고 점수의 SHA1 해시와 함께 최고 점수를 암호화합니다.
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
서버의 PHP 코드는 토큰을 확인하여 요청이 유효한 게임 인스턴스에서 온 것인지 확인한 다음 암호화 된 최고 점수를 해독하여 최고 점수가 최고 점수의 SHA1과 일치하는지 확인합니다 (이 단계를 건너 뛰는 경우) , 해독은 단순히 임의의, 아마도 매우 높고 높은 점수를 생성합니다).
이제 공격자는 플래시 코드를 디 컴파일하고 AES 코드를 신속하게 찾아냅니다. AES 코드는 아픈 엄지 손가락처럼 튀어 나오지만 15 분 안에 메모리 검색 및 추적 프로그램으로 추적되지는 않습니다. 이 게임에 대한 내 점수는 666입니다. 메모리에서 666을 찾은 다음 해당 값에 해당하는 모든 작업을 포착하십시오. 세션 키를 사용하면 공격자가 플래시 코드를 실행할 필요조차 없습니다. 그녀는 게임 시작 토큰과 세션 키를 잡고 임의의 높은 점수를 다시 보낼 수 있습니다.
이제 대부분의 개발자가 포기하고 --- 다음 몇 가지 방법으로 공격자와 엉망이되는 몇 달을 포기합니다.
이것은 대부분 시간 낭비입니다. 말할 것도없이 SSL도 도움이되지 않습니다. SSL은 두 SSL 엔드 포인트 중 하나가 악한 경우 보호 할 수 없습니다.
고득점 사기를 실제로 줄일 수있는 몇 가지 사항은 다음과 같습니다.
게임을 플레이하려면 로그인이 필요하고, 로그인으로 세션 쿠키를 생성하고, 동일한 세션에서 여러 개의 미해결 게임을 실행하거나 동일한 사용자에 대해 여러 개의 동시 세션을 허용하지 마십시오.
가장 짧은 실제 게임보다 오래 지속되지 않은 게임 세션에서 높은 점수를 거부합니다 (보다 정교한 접근 방식을 위해서는 평균 게임 지속 시간보다 2 표준 편차 미만으로 지속되는 게임 세션에 대해 "정리"높은 점수를보십시오). 서버 측 게임 시간을 추적하고 있는지 확인하십시오.
한 번 또는 두 번만 게임을 한 로그인에서 높은 점수를 거부하거나 격리하여 공격자가 생성하는 각 로그인에 대해 합리적인 모양의 게임 플레이를 "종이 추적"해야합니다.
"하트 비트"는 게임 플레이 중 점수를 매기므로 서버는 한 게임 플레이 동안 평생 동안 점수가 증가하는 것을 볼 수 있습니다. 합리적인 점수 곡선을 따르지 않는 높은 점수를 거부합니다 (예 : 0에서 999999로 점프).
게임 플레이 중 "스냅 샷"게임 상태 (예 : 탄약의 양, 레벨에서의 위치 등)는 나중에 기록 된 중간 점수와 조정할 수 있습니다. 시작하기 위해이 데이터에서 이상을 탐지 할 방법이 없어도됩니다. 당신은 그것을 모으기 만하면, 물고기가 비린 것처럼 보이면 돌아가서 분석 할 수 있습니다.
보안 검사 중 하나에 실패한 사용자의 계정을 비활성화합니다 (예 : 유효성 검사에 실패한 암호화 된 최고 점수를 제출 함).
여기서는 높은 점수의 사기 만 저지한다는 사실을 기억하십시오. 없습니다 아무것도 당신이 경우에 방지하기 위해 할 수있는가. 게임에 돈이 있으면 누군가가 당신이 생각 해낸 시스템을 물리 칠 것입니다. 목표는 이 공격 을 막는 것이 아닙니다 . 게임을 정말 잘하고 치는 것보다 공격을 더 비싸게 만드는 것입니다.