Jak mogę zapobiec fałszywym raportom wyników do globalnych tabel najlepszych wyników?

44

Gry przeglądarkowe i mobilne zazwyczaj mają globalne tabele najlepszych wyników. Tabele często zawierają również wyniki w liczbie 2 147 483 647 osób - w których ludzie zorientowali się, jakie wywołanie usługi internetowej zgłosiło wyniki i wykorzystali je do zarejestrowania fikcyjnego wyniku.

W przypadku prostych gier logicznych możemy się przed tym bronić, dołączając zapis każdego ruchu wykonanego przez gracza (i wszystkich losowych nasion użytych do wygenerowania poziomu) z wezwaniem do raportowania wyników. Całą grę można następnie odtworzyć i zweryfikować na serwerze.

Jednak szybko staje się to niemożliwe dla czegoś większego niż Pac-man.

Jak inaczej można zapobiec tego rodzaju oszustwom?

teedyay
źródło
Miałem dokładnie to samo pytanie dotyczące gier na iPhone'a przy użyciu tej samej techniki do stworzenia globalnej tabeli najlepszych wyników.
deft_code
Czy jesteś pewien , że wysłanie powtórki byłoby niewykonalne?
o0 ”.
Tak jestem pewna. :)
teedyay

Odpowiedzi:

9

Wewnętrzny system, którego użyliśmy dla Moblox (później zastąpiony przez OpenFeint) działał w następujący sposób:

  • Wyślij wiadomość JSON przez zwykły HTTP (nie HTTPS). Dołącz skrót MD5 wszystkich pól plus magiczny ciąg.
  • Na serwerze sprawdź integralność wiadomości za pomocą tej samej operacji.

Aby złamać system, musisz znaleźć ten magiczny ciąg. Jest to możliwe przy inżynierii odwrotnej, ale bolesne.

OpenFeint, ScoreLoop i CocosLive używają tej samej sztuczki, ale z HTTPS. Bardzo łatwe do wdrożenia.

Ellis
źródło
29
Jestem dość wątpliwy, że inżynieria odwrotna, aby znaleźć twój magiczny ciąg, byłaby tak trudna.
Kylotan
4
Jest to aplikacja na Androida w natywnym języku C ++. Nie ma żadnego symbolu ani dobrego debuggera. Możesz więc odczytać kod ARM, ale nie łatwo go prześledzić. Klucz składa się z wielu operacji, więc znalezienie wszystkich ciągów nie jest wystarczające. To nie jest idealne, ale dość bolesne.
Ellis
3
Standardowe ćwiczenie licencjackie, przynajmniej na uniwersytetach w USA, polega na ponownej inżynierii haseł zbudowanych zgodnie z opisem, czytając kod a86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/... ).
12
Jest to wyjątkowo słaba technika, która da twórcom bardzo fałszywe poczucie bezpieczeństwa.
o0 ”.
2
To bardzo dobry przykład en.wikipedia.org/wiki/Security_through_obscurity
kaoD
21

Chociaż masz rację, że nie zawsze jest możliwe wysyłanie całych powtórek na serwer w przypadku złożonych gier, podobny system może być używany, gdy serwer okresowo (i losowo) pyta klienta o pewną część swojego stanu, podczas gdy gra jest uruchomiona.

Na przykład w FPS co minutę możesz zapytać „Ile zabijasz?”, „Gdzie są wszyscy wrogowie?” Itd. Jeśli klient nie wróci z rozsądną odpowiedzią na wyzwanie w w rozsądnym czasie oszukują.

Oczywiście działa to tylko wtedy, gdy gra jest online podczas całej sesji gry. Ponieważ celem tutaj jest możliwość przesłania do internetowej tabeli liderów, myślę, że to rozsądne - nie wyrzucaj gracza z gry, jeśli odpowiedzą źle, po prostu nie pozwól mu na liście wyników.

Zachęcam jednak do ponownego rozważenia przesłania powtórek. Wszystko, czego naprawdę potrzebujesz, to początkowe losowe źródło i znacznik czasu. Powinno to być naprawdę najwyżej kilkaset KB. Wiele gier zręcznościowych już to robi, aby zapisać powtórki do celów przeglądu gracza; sprawdzenie poprawności serwera może nie być trywialne, ale zapobiega wszelkim oszustwom, z wyjątkiem botowania.


źródło
10

Możesz ograniczyć najbardziej rażące nadużycia, monitorując najwyższe wyniki w tabeli najlepszych wyników. W zależności od gry możesz mieć „doskonały wynik”, powyżej którego każdy wynik musi być fałszywy. Jeśli nie, możesz obliczyć najniższy „wynik niemożliwy”; czy gracz może strzelić 10 strzałów na sekundę, gra trwa 1 minutę, a każdy zabity wróg jest wart 100 punktów? Zatem każdy wynik powyżej 60 000 musi być fałszywy.

Możesz także pomóc w złagodzeniu problemu, przesyłając niektóre metadane; nie pełna historia gry, jak opisujesz, ale tylko składniki, które składają się na wynik. Powiedz: zdobądź 60000, 500 zabitych wrogów i złapany jeden bonusowy przedmiot. Następnie możesz wykonać proste kontrole. Jest to „bezpieczeństwo przez zaciemnienie” i dlatego nie jest wcale bezpieczne, ale pomaga wyeliminować najbardziej naiwnych z atakujących.

Gregory Avery-Weir
źródło
Możesz także oflagować użytkownika (prawdopodobnie przez adres IP), jeśli prześle on wynik, który nie pasuje do metadanych. Następnie, jeśli spróbują ponownie przedstawić wynik, że DOES mają poprawne metadane, możesz je przeanalizować i ewentualnie po prostu całkowicie je zablokować. Możesz również wysłać zuchwałą wiadomość z powrotem, prześlij żądanie oceny :)
Adam Harte
Myślę, że ta odpowiedź jest lepsza niż odpowiedź zaakceptowana. Po prostu dowiedz się, która liczba jest maksymalną wartością, którą twoi gracze mogą osiągnąć. Coś wyżej, po prostu odrzuć.
6
Więc jeśli jeden gracz, który idzie na uniwersytet oszukuje, wszyscy w sieci są teraz „oszustami”
AttackingHobo
6

Ostatecznie możesz wykluczyć niemożliwie wysokie wyniki, ponieważ reszta jest (z definicji) mało prawdopodobna, a zatem może być legalnym (i niesamowitym) graczem.

W przeciwnym razie musisz polegać na technikach zaciemniania (takich jak szyfrowanie i wysyłanie innych statystyk poza zwykłym wynikiem).

Możesz także okresowo wysyłać wyniki w trakcie gry, co zwiększyłoby poziom skomplikowania oszustwa - tzn. Serwer może zdecydować, czy gra się wystarczająco długo, aby zagwarantować określony wynik, a także zapewnić wystarczającą liczbę raportów pośrednich zostały odebrane podczas gry (po prostu nie rób tego w 100%, bo pociąg jadący do tunelu w drodze do domu spowoduje, że wyrzucę telefon przez okno).

Ostatecznie jednak ktoś znajdzie sposób, aby go złamać, więc nie zabijaj się, próbując go powstrzymać.

JasonD
źródło
6

Dodałem szybką / brudną tabelę najlepszych wyników do mojego projektu jakiś czas temu i nie będąc w ogóle zaznajomionym z bezpieczeństwem internetowym itp. Okazało się, że jest to wada. Zaskakujące jest to, że z prawie 1 200 000 zarejestrowanych wyników, miałem tylko 5 lub 6 razy serię rażąco niepoprawnych wyników, które osiągnęły szczyt tabeli. Większość wyników wyglądała nawet bardziej na usterkę w grze niż na prawdziwe „hakowanie”.

Myślę więc, że ważną kwestią jest: upewnij się, że system punktacji twojej gry jest szczelny , lub przynajmniej wykonaj kilka naprawdę dobrych testów wykonalności; teraz ta gra, o której mówię, była postem Ludum Dare 48 godzin, więc nie była to najbardziej stabilna rzecz w okolicy ... ale ogólnie myślę, że bardziej prawdopodobne jest, że przypadkowy gracz odkryje / wykorzysta usterkę w grze niż gdy ktoś bezpośrednio „zhakuje” tabelę wyników.

To powiedziawszy, pracuję teraz nad przepisaniem tego projektu i idę na całość z zaciemnianiem. Nie będę wchodził w zbyt wiele szczegółów, ale w zasadzie wszystkie wyniki przesyłają kluczową wartość opartą na zbiorze losowych wartości i wartości mieszania i magicznego ciągu znaków, a następnie każdy wynik, który przejdzie ten test i jest wystarczająco wysoki, aby rzeczywista wartość „ Tabela liderów Top X ”musi przejść kolejną rundę sprawdzania poprawności (tym razem z wygasającą wartością klucza wygenerowaną po stronie serwera i dokładniejszymi kontrolami wykonalności).

Radziłbym również użyć jakiegoś narzędzia do śledzenia pakietów, aby sprawdzić, jakie rzeczy są widoczne (pierwotnie robiłem znacznie prostszą weryfikację, co oznaczało, że ktoś mógł użyć narzędzia do śledzenia pakietów, aby znaleźć i zduplikować żądanie HTTP przesłanego wyniku, bez wiedzy magiczny ciąg znaków lub cokolwiek innego (oznaczało to, że najpierw potrzebowałeś wiarygodnego wyniku, ale możesz wysłać duplikaty tego wyniku, ile chcesz ...)). Użyłem Wireshark do przetestowania tego.

Huh, okazało się to trochę długie, ale mam nadzieję, że to pomaga ...

Riley Adams
źródło
Z pewnością tak jest. Wygląda na to, że solony hash to dobry sposób. Nie sądziłem, że wielokrotnie wyślą ten sam ważny wynik. Identyfikator GUID i znacznik czasu zawarte w pakiecie (i w haszu) powinny być opłacone - mogę sprawdzić duplikaty na serwerze. Dziękuję Ci.
teedyay
3

Nie jestem ekspertem w tej dziedzinie, ale gdybym był tobą, postaram się zaszyfrować partyturę kluczem osadzonym w twoim kodzie. Ci ludzie będą musieli zastosować inżynierię wsteczną w kodzie zamiast zwykłego tekstu używanego w usługach internetowych.


źródło
2
Poszedłbym jeszcze jeden. Wygeneruj skrót z kodu, mieszając plik exe (lub jego część). Podczas wysyłania wyników wyślij numer wersji, a serwer może sprawdzić poprawność za pomocą tabeli, która ma proste stałe numer wersji-> kod skrótu. Otrzymujesz dodatkową premię, że jeśli ktoś oszukuje przez modyfikację programu, jego wysoki wynik nie będzie się liczył.
konfigurator
7
Jeśli ktoś modyfikuje program, może już wysłać dowolny klucz.
2
@Joe Wreschnig, mogą wysłać dowolny klucz, ale serwer powinien być ustawiony tak, aby akceptował tylko prawidłowe klucze.
AttackingHobo
5
Myślę, że Joe miał na myśli to, że nie muszą używać skrótu nowo zmodyfikowanego programu, ale mogą po prostu wysłać cokolwiek poprzedni skrót.
Kylotan,
1
@ gd1: jak to pomaga?
Kylotan,
1

Speedruns rejestrują w zasadzie każde naciśnięcie klawisza i rejestrują grę CAŁĄ. Tak, możesz nagrać całą grę, nie jest to niewykonalne. Każdy inny sposób na zrobienie tego jest możliwy do złamania za pomocą inżynierii odwrotnej (nie mogę tego wystarczająco podkreślić: nie dodajesz bezpieczeństwa, dodajesz niejasności).

Mimo to, nawet jeśli zrobisz to w ten sposób, mogą faktycznie przesłać speedrun. Nie możesz nic zrobić, aby temu zapobiec.

o0 ”.
źródło
2
Zwykle odtwarzanie, a nie nagrywanie, jest częścią, która jest niemożliwa dla serwera. Jeśli klient gra w tę grę od kilku godzin, resimulacja po stronie serwera może zająć wiele minut procesora lub gorzej. To nie jest do zaakceptowania, jeśli masz wiele osób, które przedstawiają wyniki.
2
Rozmiar pakietu danych stałby się problemem dla gier mobilnych - szczególnie, jeśli gracz płaci za przepustowość bajtu.
teedyay
Och, to, co oboje mówicie, jest prawdą. Jednak nie ma innego „prawdziwego” rozwiązania.
o0 ”.
11
Nie musisz sprawdzać poprawności każdego przesłanego nagrania, musisz tylko zweryfikować te, które znalazły się w pierwszej 10. Nie ma sensu oszukiwać, aby zostać numerem 11. I nie musisz tego robić w czasie rzeczywistym. Okresowy proces wsadowy byłby w porządku.
szary
@teedyay Powiedz, że gracz wykonuje średnio 5 akcji na sekundę, a każda akcja może być całkowicie opisana w 32 bitach. To 20 bajtów na sekundę lub 72 kB na godzinę. Typowa cena komórkowej transmisji danych w USA wynosi 10 USD za GB lub 1 cent za 1000 kB.
Damian Yerrick
1

W tym momencie pojawia się pytanie, czy wysoki wynik to po prostu gracz, który znalazł exploita (na przykład, jeśli niektóre rzeczy w grze dają karę punktową, a błąd powoduje „zawijanie” wyniku ujemnego aby stać się bardzo pozytywnym ... lub po prostu graczem, który znajdzie pewne warunki gry, takie jak bezpieczne miejsce na planszy, w którym może po prostu siedzieć i nie martwić się o przegraną w nieskończoność).

Aby odróżnić hack od exploita gry, dobrym pomysłem byłoby przesłanie przynajmniej niektórych danych gry. Pomoże ci to naprawić exploity.

W przypadku niektórych gier (szczególnie turowych) możesz grać w tę grę przez serwer, gdzie cała logika gry istnieje po stronie serwera, a klient jest tylko interfejsem. To nie tylko utrudnia hakowanie wyników, ale umożliwia także trywialne rejestrowanie wszystkich działań gracza na serwerze, a tym samym odtwarzanie dowolnej gry w dowolnym momencie. Zdaję sobie sprawę, że dla czegoś takiego jak strzelanina akcji może to być niepraktyczne.

Ian Schreiber
źródło
1

Utwórz wszystkie losowości z jednego materiału źródłowego i zapisz dane wejściowe dla każdej ramki. Ilekroć masz najwyższy wynik (powiedzmy 50 najlepszych), wyślij seed i pełne dane wejściowe do serwera. Zagraj w grę na serwerze i zaktualizuj tabelę wyników, jeśli uzyskasz wysoki wynik.

Jeśli uważasz to za niewykonalne w przypadku bardziej wyrafinowanych gier ze względu na rozmiar żądania, spójrz na ten przykład.

Załóżmy, że gra ma 8 przycisków wejściowych (1 pad i 4 przyciski) i działa z prędkością 60 klatek na sekundę. Godzinę wejściową do gry można przesyłać z 3,6 KB bez kompresji. Sesja prawdopodobnie potrwa mniej niż godzinę, a kompresja powinna ją znacznie zmniejszyć, ponieważ wkład człowieka jest bardzo redundantny.

Wyzwaniem jest uczynienie gry deterministyczną, odtwarzalną z zarejestrowanych danych wejściowych i wykonywalną na serwerze.

Vinicius Canaa
źródło
0

Nigdy wcześniej tego nie wdrażałem, ale ...

Wysyłaj wyniki stopniowo ze znacznikami czasu. To daje dziennik, aby zobaczyć, jak często poprawia się wynik, a także sposób na śledzenie „pędu” wyniku.

Następnie ustalisz kamienie milowe / kryteria swoich wyników.

Na przykład: Wynik większy niż 20 000 nie może dotrzeć w ciągu pierwszych 20 sekund gry. Wynik większy niż 250 000 nie może dotrzeć bez wpisu większego niż 200 000.

Nie jest to dokładnie to samo, co wysyłanie stanu gry, ale blisko niego.

Dodatkowa korzyść: Pomyśl o wszystkich przydatnych statystykach gry, które możesz z tego uzyskać. Ktoś prawdopodobnie zapłaciłby za to dobre pieniądze.

Markus
źródło