Wie kann ich verhindern, dass in globalen Highscore-Tabellen falsche Score-Berichte erstellt werden?

44

Browser- und Handyspiele haben normalerweise globale Highscore-Tabellen. Es ist auch üblich, dass diese Tabellen Punktzahlen von 2.147.483.647 enthalten - wobei die Benutzer den Webservice-Aufruf herausgefunden haben, der Punktzahlen meldet, und ihn zum Aufzeichnen einer fiktiven Punktzahl verwendet haben.

Für einfache Puzzlespiele können wir uns dagegen wehren, indem wir eine Aufzeichnung aller Bewegungen des Spielers (und aller zufälligen Startwerte, die zur Erzeugung des Levels verwendet werden) mit dem Aufruf zur Ergebnismeldung hinzufügen. Das gesamte Spiel kann dann auf dem Server reproduziert und verifiziert werden.

Für etwas Größeres als Pac-Man wird dies jedoch schnell unmöglich.

Wie kann sonst ein solches Betrügen verhindert werden?

teedyay
quelle
Ich hatte genau die gleiche Frage bezüglich iPhone-Spielen, die dieselbe Technik zum Erstellen einer globalen Highscore-Tabelle verwendeten.
deft_code
Sind Sie sicher , dass es unmöglich wäre, die Wiederholung zu senden?
o0 '.
Ja, ich bin sicher. :)
Teedyay

Antworten:

9

Das interne System, das wir für Moblox (später durch OpenFeint ersetzt) ​​verwendet haben, funktionierte folgendermaßen:

  • Senden Sie eine JSON-Nachricht über HTTP (nicht HTTPS). Fügen Sie einen MD5-Hash aller Felder sowie eine magische Zeichenfolge hinzu.
  • Überprüfen Sie auf dem Server die Integrität der Nachricht mit demselben Vorgang.

Um das System zu knacken, müsste man diesen magischen Faden finden. Es ist mit Reverse Engineering möglich, aber schmerzhaft.

OpenFeint, ScoreLoop und CocosLive verwenden denselben Trick, jedoch mit HTTPS. Sehr einfach zu implementieren.

Ellis
quelle
29
Ich bin ziemlich zweifelhaft, dass Reverse Engineering, um Ihre magische Saite zu finden, allzu schwierig sein würde.
Kylotan
4
Dies ist eine Android-Anwendung in nativem C ++. Es gibt kein Symbol und keinen guten Debugger. Sie können den ARM-Code also lesen, aber nicht einfach nachvollziehen. Der Schlüssel besteht aus mehreren Operationen, sodass nicht alle Zeichenfolgen ausreichen. Das ist nicht perfekt, aber ziemlich schmerzhaft.
Ellis
3
Zumindest an US-amerikanischen Universitäten gehört es zur Standardübung, Kennwörter, die wie von Ihnen beschrieben erstellt wurden, durch Lesen des Assembler-Codes y86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/… ) zurückzuentwickeln.
12
Dies ist eine schrecklich schwache Technik, die den Entwicklern ein sehr falsches Sicherheitsgefühl verleiht.
o0 '.
2
Dies ist ein sehr gutes Beispiel für en.wikipedia.org/wiki/Security_through_obscurity
kaoD
21

Während Sie Recht haben, dass es bei komplexen Spielen nicht immer möglich ist, vollständige Wiederholungen an den Server zu senden, kann ein ähnliches System verwendet werden, indem der Server den Client regelmäßig (und halb zufällig) nach einem Teil seines Zustands fragt, während der Spiel läuft.

In einem FPS könnten Sie beispielsweise jede Minute fragen: "Wie viele Kills haben Sie?", "Wo sind alle Feinde?" Usw. Wenn der Client nicht mit einer vernünftigen Antwort auf eine Herausforderung in a zurückkommt Angemessene Zeit, sie betrügen.

Dies funktioniert natürlich nur, wenn das Spiel während der gesamten Spielsitzung online ist. Da das Ziel hier darin besteht, in eine Online-Bestenliste hochgeladen zu werden, halte ich das für vernünftig. Werfen Sie den Spieler nicht aus dem Spiel, wenn er falsch antwortet, sondern lassen Sie ihn nicht in die Punkteliste.

Ich würde Sie jedoch ermutigen, das Senden von Wiederholungen zu überdenken. Alles, was Sie wirklich brauchen, ist die anfängliche Zufallseingabe und die Eingabe mit Zeitstempel. Das sollte eigentlich höchstens ein paar hundert KB sein. Viele Arcade-Spiele tun dies bereits, um Wiederholungen für die Überprüfung der Spieler zu speichern. Es mag nicht trivial sein, wenn Ihr Server diese überprüft, aber es verhindert alle Arten von Betrug, mit Ausnahme von Botting.


quelle
10

Sie können den offensichtlichsten Missbrauch einschränken, indem Sie die höchsten Ergebnisse in der Top-Score-Tabelle überwachen. Abhängig von Ihrem Spiel haben Sie möglicherweise eine "perfekte Punktzahl", über der jede Punktzahl betrügerisch sein muss. Wenn nicht, können Sie die niedrigste "unmögliche Punktzahl" berechnen. Kann der Spieler 10 Schüsse pro Sekunde abschießen, das Spiel dauert 1 Minute und jeder getötete Gegner ist 100 Punkte wert? Dann muss jede Punktzahl höher als 60.000 betrügerisch sein.

Sie können das Problem auch beheben, indem Sie einige Metadaten senden. Nicht die gesamte Spielgeschichte, wie Sie beschreiben, sondern nur die Komponenten, aus denen sich die Punktzahl zusammensetzt. Sprich: Erziele 60000 Punkte, töte 500 Gegner und erhalte einen Bonusgegenstand. Sie können dann einfache Überprüfungen durchführen. Dies ist "Sicherheit durch Dunkelheit" und daher überhaupt nicht sicher, hilft jedoch dabei, die naivsten Angreifer auszuschalten.

Gregory Avery-Weir
quelle
Sie können einen Benutzer auch kennzeichnen (möglicherweise nach IP-Adresse), wenn er eine Bewertung abgibt, die nicht mit den Metadaten übereinstimmt. Wenn sie dann erneut versuchen, eine Partitur einzureichen, deren Metadaten korrekt sind, können Sie sie überprüfen und möglicherweise ganz sperren. Sie könnten auch eine freche Nachricht von dort zurücksenden, um eine Punktzahl anzufordern :)
Adam Harte
Ich denke, diese Antwort ist besser als die akzeptierte Antwort. Finden Sie heraus, welche Anzahl Ihre Spieler maximal erreichen können. Alles, was höher ist, einfach wegwerfen.
6
Wenn also ein Spieler, der eine Universität besucht, betrügt, ist jeder im Netzwerk jetzt ein "Betrüger"
AttackingHobo
6

Letztendlich können Sie nur unglaublich hohe Punktzahlen ausschließen, da der Rest (per Definition) nur unplausibel ist und somit ein legitimer (und großartiger) Spieler sein könnte.

Andernfalls müssen Sie sich auf Verschleierungstechniken verlassen (z. B. Verschlüsselung und Senden anderer Statistiken, die über die reine Punktzahl hinausgehen).

Sie können den Spielstand auch in regelmäßigen Abständen senden, während das Spiel gespielt wird, wodurch das Betrügen noch komplexer wird. Der Server kann also entscheiden, ob das Spiel lange genug gespielt wurde, um einen bestimmten Spielstand zu gewährleisten, und sicherstellen, dass genügend Zwischenberichte vorliegen wurden während der Spielzeit empfangen (schaffe es einfach nicht 100% oder der Zug, der auf meinem Heimweg in einen Tunnel fährt, führt dazu, dass ich das Telefon aus dem Fenster werfe).

Letztendlich wird jemand einen Weg finden, es zu brechen, also töte dich nicht selbst und versuche, sie aufzuhalten.

JasonD
quelle
6

Ich habe vor einiger Zeit eine schnelle / schmutzige Highscore-Tabelle zu einem meiner Projekte hinzugefügt und bin überhaupt nicht mit Internetsicherheit / usw. vertraut. Es stellte sich als fehlerhaft heraus. Überraschenderweise hatte ich mit fast 1.200.000 aufgenommenen Noten nur fünf oder sechs Mal eine Reihe von offensichtlich falschen Noten, die ganz oben auf dem Brett lagen. Die meisten Partituren sahen im Spiel sogar eher wie eine Panne aus, als wie ein echtes "Hacken".

Ich denke, ein wichtiger Punkt ist: Stellen Sie sicher, dass das Punktesystem Ihres Spiels luftdicht ist , oder führen Sie zumindest eine wirklich gute Machbarkeitsprüfung durch. Dieses Spiel, von dem ich spreche, war ein 48-Stunden-Eintrag von Ludum Dare, daher war es nicht das stabilste, was es gibt. Aber im Großen und Ganzen denke ich, dass es oft wahrscheinlicher ist, dass der Gelegenheitsspieler einen Ingame-Fehler entdeckt / ausnutzt als jemanden direkt die Bestenliste "hacken" zu lassen.

Das heißt, ich arbeite gerade an einer Neufassung dieses Projekts, und ich werde alles tun, um die Verschleierung zu verhindern. Ich werde nicht zu sehr ins Detail gehen, aber ich habe im Grunde genommen alle Bewertungen einen Schlüsselwert basierend auf einer Reihe von Zufallswerten und Hashing und einer magischen Zeichenkette, dann jede Bewertung, die diese Prüfung besteht und hoch genug ist, um das tatsächliche Ergebnis zu erzielen. " Die Bestenliste von Top X muss eine weitere Validierungsrunde bestehen (diesmal mit einem auf der Serverseite generierten ablaufenden Schlüsselwert und gründlicheren Durchführbarkeitsprüfungen).

Ich würde auch raten, eine Art Paket-Tracer zu verwenden, um zu testen, welche Art von Dingen sichtbar sind (ich habe ursprünglich eine viel einfachere Überprüfung durchgeführt, die bedeutete, dass jemand die http-Anfrage eines hochgeladenen Scores mit einem Paket-Tracer finden und duplizieren konnte, ohne es zu wissen die magische Saite oder irgendetwas anderes (bedeutete, dass Sie zuerst eine legitime Punktzahl brauchten, aber Sie konnten Duplikate dieser Punktzahl senden, so oft Sie wollten ..)). Ich habe das mit Wireshark getestet.

Huh, das ist ein bisschen lang geworden, aber hoffentlich hilft es ...

Riley Adams
quelle
Sicher ist. Sieht aus wie ein gesalzener Hasch ist ein guter Weg zu gehen. Ich hatte nicht daran gedacht, dass sie die gleiche gültige Punktzahl viele Male erneut senden würden. Eine GUID und ein Zeitstempel, die im Paket (und im Hash) enthalten sind, sollten bezahlt werden - ich kann auf dem Server nach Dupes suchen. Danke.
Teedyay
3

Ich bin kein Experte auf diesem Gebiet, aber wenn ich Sie wäre, würde ich versuchen, die Partitur mit einem in Ihren Code eingebetteten Schlüssel zu verschlüsseln. Diese Personen müssen Reverse Engineering anstelle des für die Webservices verwendeten Klartexts auf Ihren Code anwenden.


quelle
2
Ich würde noch einen Schritt weiter gehen. Generieren Sie einen Hash aus dem Code, indem Sie die exe-Datei (oder einen Teil davon) hashen. Beim Senden von Partituren wird die Versionsnummer gesendet und der Server kann anhand einer Tabelle mit einfachen Konstanten, Versionsnummer-> Hash-Code, validieren. Dann bekommst du den zusätzlichen Bonus, dass wenn jemand durch Modifizieren des Programms schummelt, sein Highscore nicht zählt.
Konfigurator
7
Wenn jemand das Programm ändert, kann er bereits den gewünschten Schlüssel senden.
2
@ Joe Wreschnig, sie können jeden gewünschten Schlüssel senden, aber der Server sollte so eingestellt sein, dass nur gültige Schlüssel akzeptiert werden.
AttackingHobo
5
Ich denke, Joes Argument war, dass sie nicht den Hash des neu modifizierten Programms verwenden müssen, sondern nur das senden können, was der vorherige Hash war.
Kylotan
1
@ gd1: wie hilft das
Kylotan
1

Speedruns zeichnen im Grunde genommen jeden Tastendruck auf, und sie zeichnen über ein GANZES Spiel auf. Also, ja, du kannst das ganze Spiel aufnehmen, es ist nicht unmöglich. Jeder andere Weg, dies zu tun, ist durch Reverse Engineering zu knacken (ich kann es nicht genug betonen: Sie erhöhen nicht die Sicherheit, Sie erhöhen die Dunkelheit).

Selbst wenn Sie dies auf diese Weise tun, könnten sie tatsächlich einen Speedrun einreichen. Sie können nichts dagegen tun.

o0 '.
quelle
2
Normalerweise ist die Wiedergabe und nicht die Aufnahme der Teil, der für den Server nicht möglich ist. Wenn der Client das Spiel einige Stunden lang gespielt hat, kann die serverseitige Resimulation viele CPU-Minuten oder noch schlimmer dauern. Das ist nicht wirklich akzeptabel, wenn viele Leute Ergebnisse einreichen.
2
Die Größe des Datenpakets würde für mobile Spiele zu einem Problem werden - insbesondere, wenn der Spieler seine Bandbreite byteweise bezahlt.
Teedyay
Oh, was ihr beide sagt, ist wahr. Trotzdem gibt es keine andere "echte" Lösung.
o0 '.
11
Sie müssen nicht jede eingereichte Aufnahme validieren, sondern nur diejenigen, die es in die Top 10 schaffen. Es macht nicht viel Sinn, zu schummeln, um die Nummer 11 zu werden. Und das müssen Sie nicht in Echtzeit tun. Periodische Stapelverarbeitung wäre in Ordnung.
Grau
@teedyay Angenommen, der Spieler führt durchschnittlich 5 Aktionen pro Sekunde aus, und jede Aktion kann vollständig in 32 Bit beschrieben werden. Das sind 20 Bytes pro Sekunde oder 72 kB pro Stunde. Der typische Preis für mobile Daten in den USA beträgt 10 US-Dollar pro GB oder 1 Cent pro 1000 kB.
Damian Yerrick
1

Während Sie dabei sind, stellt sich die Frage, ob ein Highscore einfach ein Spieler ist, der einen Exploit gefunden hat. hoch positiv werden ... oder einfach nur ein Spieler, der eine bestimmte Spielbedingung findet, wie einen sicheren Platz auf dem Brett, an dem er einfach nur sitzen kann und sich keine Sorgen machen muss, auf unbestimmte Zeit zu verlieren.

Um den Unterschied zwischen einem Hack und einem Spiel-Exploit zu erkennen, wäre es gut, zumindest einige Spieldaten hochzuladen. Zumindest hilft es Ihnen, die Exploits zu beheben.

Bei einigen Spielen (insbesondere rundenbasierten Spielen) können Sie das Spiel tatsächlich über den Server spielen lassen, wobei die gesamte Spiellogik auf der Serverseite vorhanden ist und der Client nur eine Schnittstelle ist. Dies erschwert nicht nur das Hacken von Punkten erheblich, sondern ermöglicht es Ihnen auch, alle Spieleraktionen auf dem Server einfach zu protokollieren und so jedes Spiel jederzeit zu wiederholen. Mir ist klar, dass dies für so etwas wie einen zuckenden Action-Shooter unpraktisch sein kann.

Ian Schreiber
quelle
1

Machen Sie alle Zufälligkeiten aus einem Startwert und speichern Sie die Eingabe für jeden Frame. Wann immer Sie einen Highscore haben (sagen wir Top 50), senden Sie den Startwert und die vollständige Eingabe an den Server. Spielen Sie das Spiel erneut auf dem Server und aktualisieren Sie die Bestenliste, wenn Sie einen Highscore erzielen.

Wenn Sie dies aufgrund der Größe der Anforderung für anspruchsvollere Spiele für nicht durchführbar halten, sehen Sie sich dieses Beispiel an.

Angenommen, das Spiel hat einen 8-Tasten-Eingang (1 Pad und 4 Tasten) und läuft mit 60 fps. Eine einstündige Spieleingabe kann mit 3,6 KB ohne Komprimierung übertragen werden. Ihre Sitzung wird wahrscheinlich weniger als eine Stunde dauern, und die Komprimierung sollte dies um ein Vielfaches verringern, da die Eingaben des Benutzers sehr redundant sind.

Die Herausforderung besteht darin, das Spiel deterministisch, spielbar und auf dem Server ausführbar zu machen.

Vinicius Canaa
quelle
0

Nie zuvor implementiert, aber ...

Senden Sie die Ergebnisse schrittweise mit Zeitstempeln. Auf diese Weise können Sie protokollieren, wie oft sich die Punktzahl verbessert hat, und das "Momentum" des Highscores verfolgen.

Sie würden dann Meilensteine ​​/ Kriterien für Ihre Ergebnisse festlegen.

Zum Beispiel: Eine Punktzahl von mehr als 20.000 kann nicht in den ersten 20 Sekunden eines Spiels erreicht werden. Eine Punktzahl größer als 250.000 kann nicht ohne einen Eintrag größer als 200.000 eintreffen.

Dies ist nicht genau das Gleiche wie das Senden eines Spielstatus, liegt jedoch in der Nähe.

Nebeneffekt: Denken Sie an alle nützlichen Spielstatistiken, die Sie dadurch erhalten würden. Jemand würde wahrscheinlich gutes Geld dafür bezahlen.

Markus
quelle