Dies ist ein klassisches Problem bei Internet-Spielen und -Wettbewerben. Ihr Flash-Code arbeitet mit Benutzern zusammen, um eine Punktzahl für ein Spiel zu bestimmen. Benutzer sind jedoch nicht vertrauenswürdig und der Flash-Code wird auf dem Computer des Benutzers ausgeführt. Du bist SOL. Sie können nichts tun, um einen Angreifer daran zu hindern, hohe Punktzahlen zu erzielen:
Flash ist noch einfacher zurückzuentwickeln, als Sie vielleicht denken, da die Bytecodes gut dokumentiert sind und eine Hochsprache (Actionscript) beschreiben. Wenn Sie ein Flash-Spiel veröffentlichen, veröffentlichen Sie Ihren Quellcode, egal ob Sie weiß es oder nicht.
Angreifer steuern den Laufzeitspeicher des Flash-Interpreters, sodass jeder, der weiß, wie man einen programmierbaren Debugger verwendet, jederzeit eine beliebige Variable (einschließlich der aktuellen Punktzahl) oder das Programm selbst ändern kann.
Der einfachste mögliche Angriff auf Ihr System besteht darin, den HTTP-Verkehr für das Spiel über einen Proxy auszuführen, den Highscore-Save abzufangen und ihn mit einem höheren Score erneut abzuspielen.
Sie können versuchen, diesen Angriff zu blockieren, indem Sie jeden gespeicherten Highscore an eine einzelne Instanz des Spiels binden, indem Sie beispielsweise beim Start des Spiels ein verschlüsseltes Token an den Client senden. Dies könnte folgendermaßen aussehen:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Sie können auch ein Sitzungscookie verwenden, um den gleichen Effekt zu erzielen.)
Der Spielcode gibt dieses Token mit dem Highscore-Save an den Server zurück. Ein Angreifer kann das Spiel jedoch trotzdem erneut starten, einen Token erhalten und diesen Token dann sofort in einen erneut gespielten Highscore-Save einfügen.
Als Nächstes geben Sie nicht nur ein Token oder ein Sitzungscookie ein, sondern auch einen Sitzungsschlüssel mit hoher Punktzahl. Dies ist ein 128-Bit-AES-Schlüssel, der selbst mit einem im Flash-Spiel fest codierten Schlüssel verschlüsselt ist:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Bevor das Spiel den Highscore veröffentlicht, entschlüsselt es den Highscore-Verschlüsselungs-Sitzungsschlüssel, was es tun kann, weil Sie den Highscore-Verschlüsselungs-Sitzungsschlüssel-Entschlüsselungsschlüssel in die Flash-Binärdatei fest codiert haben. Sie verschlüsseln den Highscore mit diesem entschlüsselten Schlüssel zusammen mit dem SHA1-Hash des Highscores:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
Der PHP-Code auf dem Server überprüft das Token, um sicherzustellen, dass die Anforderung von einer gültigen Spielinstanz stammt, entschlüsselt dann den verschlüsselten Highscore und stellt sicher, dass der Highscore mit dem SHA1 des Highscores übereinstimmt (wenn Sie diesen Schritt überspringen Entschlüsselung führt einfach zu zufälligen, wahrscheinlich sehr hohen, hohen Punktzahlen.
Jetzt dekompiliert der Angreifer Ihren Flash-Code und findet schnell den AES-Code, der wie ein schmerzender Daumen hervorsteht, auch wenn er nicht in 15 Minuten mit einer Speichersuche und einem Tracer aufgespürt würde ("Ich weiß Meine Punktzahl für dieses Spiel ist 666, also lasst uns 666 im Speicher finden und dann jede Operation abfangen, die diesen Wert berührt - oh schau, der Highscore-Verschlüsselungscode! "). Mit dem Sitzungsschlüssel muss der Angreifer nicht einmal den Flash-Code ausführen. Sie schnappt sich einen Spielstart-Token und einen Sitzungsschlüssel und kann einen beliebigen Highscore zurücksenden.
Sie sind jetzt an dem Punkt angelangt, an dem die meisten Entwickler einfach aufgeben - geben oder nehmen Sie sich ein paar Monate Zeit, um sich mit Angreifern herumzuschlagen, indem Sie:
Verwürfeln der AES-Tasten mit XOR-Operationen
Ersetzen von Schlüsselbyte-Arrays durch Funktionen, die den Schlüssel berechnen
Streuung gefälschter Schlüsselverschlüsselungen und Highscore-Postings in der gesamten Binärdatei.
Das ist alles meistens Zeitverschwendung. Es versteht sich von selbst, dass SSL Ihnen auch nicht helfen wird. SSL kann Sie nicht schützen, wenn einer der beiden SSL-Endpunkte böse ist.
Hier sind einige Dinge, die den Highscore-Betrug tatsächlich reduzieren können:
Erfordern Sie eine Anmeldung, um das Spiel zu spielen, lassen Sie die Anmeldung ein Sitzungscookie erstellen und lassen Sie nicht zu, dass mehrere ausstehende Spiele in derselben Sitzung oder mehrere Sitzungen gleichzeitig für denselben Benutzer gestartet werden.
Lehnen Sie Highscores von Spielsitzungen ab, die weniger als die kürzesten jemals gespielten realen Spiele dauern (für einen differenzierteren Ansatz versuchen Sie, Highscores für Spielsitzungen, die weniger als 2 Standardabweichungen unter der mittleren Spieldauer dauern, unter Quarantäne zu stellen). Stellen Sie sicher, dass Sie die Spieldauer auf der Serverseite verfolgen.
Ablehnen oder Quarantäne von Highscores von Anmeldungen, die das Spiel nur ein- oder zweimal gespielt haben, so dass Angreifer für jede von ihnen erstellte Anmeldung eine "Papierspur" mit angemessen aussehendem Spielverlauf erstellen müssen.
"Heartbeat" punktet während des Spiels, sodass Ihr Server das Wachstum der Punktzahl über die Lebensdauer eines Spiels sieht. Lehnen Sie Highscores ab, die keinen vernünftigen Score-Kurven folgen (z. B. Springen von 0 auf 999999).
"Snapshot" -Spielstatus während des Spiels (z. B. Munitionsmenge, Position im Level usw.), den Sie später mit den aufgezeichneten Zwischenergebnissen abgleichen können. Sie müssen nicht einmal eine Möglichkeit haben, Anomalien in diesen Daten zu erkennen. Sie müssen es nur sammeln, und dann können Sie zurückgehen und es analysieren, wenn die Dinge faul aussehen.
Deaktivieren Sie das Konto eines Benutzers, der eine Ihrer Sicherheitsüberprüfungen nicht besteht (z. B. indem Sie jemals einen verschlüsselten Highscore senden, bei dem die Validierung fehlschlägt).
Denken Sie jedoch daran, dass Sie hier nur Highscore-Betrug abschrecken. Es gibt nichts Sie tun können , um zu verhindern , wenn. Wenn in Ihrem Spiel Geld auf dem Spiel steht, wird jemand jedes System besiegen, das Sie sich ausgedacht haben. Das Ziel ist nicht, diesen Angriff zu stoppen ; Es geht darum, den Angriff teurer zu machen, als nur richtig gut im Spiel zu werden und es zu schlagen.