Request-Quelle validieren?



  • Es gibt hier in einem Spiel (Dota 2) ein Dilemma, das mich wundern lässt, ob man es lösen kann:

    Durch den Workshop kann man custom maps erstellen, die dann auf den von Dota 2 bereitgestellten Servern laufen.
    Dazu kann man seine eigenen Logik etc. per Scriptsprache (lua AFAIK) implementieren. Dieses läuft dann auf dem Server, der Code liegt also auch dort.
    Jetzt gibt es gewisse Maps, die auch ein Save/Load-System implementieren.
    Dazu hosten die Betreiber dieser Maps ihren eigenen Server, der die Datenbank bei sich hat.
    In der Map (auf dem Dota 2 Server) kann man dann einen Save auslösen. Der schickt einen Request an diesen Datenbank-Server mit entsprechenden Informationen (was für Gegenstände, Attribute, etc habe ich).

    Jetzt gibt es natürlich das Problem, dass irgendjemand einfach so tun kann, als wäre er der Client und willkürliche Informationen an den Server schickt.
    Anscheinend kann man den Code von Maps, die man spielt, in Dota 2 relativ leicht einsehen. Daher weiß man also wohin man den Kram schicken muss und auch in welchem Format.

    Kann man dagegen denn überhaupt was sinnvolles unternehmen? Oder ist das von vornherein einfach kaputt?
    Wie soll der Datenbank-Server feststellen, ob ein legitimer Client die Informationen geschickt hat?
    Dazu gibt es höchsten die Möglichkeit, nachzuschauen, ob die IP die eines offiziellen Dota 2 Servers ist.
    Das ist aber 1.) vermutlich auch relativ simpel zu faken und 2.) gibt es die Möglichkeit, einfach eine eigene Custom-Map zu schreiben, die dann auch auf so einem Server läuft und dann von dort aus zu verschicken.

    Vermutlich gibt es keine Möglichkeit, sich hier abzusichern? Weil man eben diesen Dota 2 Server nicht unter seiner Kontrolle hat?



  • security schrieb:

    Kann man dagegen denn überhaupt was sinnvolles unternehmen? Oder ist das von vornherein einfach kaputt?

    Ich würde nicht sagen kaputt, ich würde sagen es war von vornherein nicht vorgesehen.

    security schrieb:

    Wie soll der Datenbank-Server feststellen, ob ein legitimer Client die Informationen geschickt hat?

    Die Custom-Map bräuchte dazu einen geheimen Teil (entweder ein Stück Code oder ein kleines Stück Daten das sie auf dem Dota-Server speichern kann). Dort könnte sie dann einen Schlüssel gespeichert haben, mit dem sie die Requests signieren kann.

    security schrieb:

    Anscheinend kann man den Code von Maps, die man spielt, in Dota 2 relativ leicht einsehen.

    Das ist der Knackpunkt. Prüfe das nach. Also was genau ist für wen einfach so einsehbar.



  • hustbaer schrieb:

    Die Custom-Map bräuchte dazu einen geheimen Teil (entweder ein Stück Code oder ein kleines Stück Daten das sie auf dem Dota-Server speichern kann). Dort könnte sie dann einen Schlüssel gespeichert haben, mit dem sie die Requests signieren kann.

    Verstehe - also das ist tatsächlich einfach die Vorraussetzung. Das muss funktionieren, ohne das lässt es sich nicht sinnvoll umsetzen.
    Wie würde der Schlüssel dann genau verwendet werden?
    Der würde wohl einfach als "passwort" dienen, ja?

    hustbaer schrieb:

    Das ist der Knackpunkt. Prüfe das nach. Also was genau ist für wen einfach so einsehbar.

    Okay, das müsste ich mir dann genauer anschauen. Sofern ich weiß, ist der Code leider rekonstruierbar, da die VPK-Datein auslesbar sind. Man müsste das also irgendwo anders platzieren. Hm.



  • security schrieb:

    hustbaer schrieb:

    Die Custom-Map bräuchte dazu einen geheimen Teil (entweder ein Stück Code oder ein kleines Stück Daten das sie auf dem Dota-Server speichern kann). Dort könnte sie dann einen Schlüssel gespeichert haben, mit dem sie die Requests signieren kann.

    Verstehe - also das ist tatsächlich einfach die Vorraussetzung. Das muss funktionieren, ohne das lässt es sich nicht sinnvoll umsetzen.

    Ja, kann mMn. nicht anders gehen.
    Wenn alles offen einsehbar ist, wüsste ich nicht wie man sowas fälschungssicher machen kann.

    Also ausser den Sachen die du selbst schon erwähnt hast, wie IP des Absenders prüfen, fällt mir da auch nicht viel ein.

    security schrieb:

    Wie würde der Schlüssel dann genau verwendet werden?
    Der würde wohl einfach als "passwort" dienen, ja?

    Den geheimen Teil als Passwort mitzuschicken wäre die einfachste Lösung. Und vielleicht schon ausreichend - je nachdem wie viel Sicherheit du benötigst. Wenn ein Angreifer die Möglichkeit hat die Nachrichten mitzulauschen die vom "Game-Server" zum "Save-Server" gehen. Darin sieht er ja das Passwort und kann es dann auch verwenden.

    Die sichere Variante wäre die Messages mit einem Public-Key-Verschlüsselungsverfahren zu signieren. So wie man das bei der Verwendung von Zertifikaten macht. Zum Signieren braucht man da auch den geheimen Teil. Zum Prüfen der Signatur allerdings nicht. Wichtig ist aber dass aus der Nachricht + Signatur der Nachricht (+ öffentlichem Schlüssel-Teil) nicht auf den geheimen Schlüssel-Teil zurückgerechnet werden kann. In dem Fall könnte der Angreifer also ruhig die Möglichkeit haben die Nachrichten zwischen den Server mitzulauschen - es würde ihm nichts bringen.

    Dabei bleibt dann bloss noch die Möglichkeit Replay-Attacken zu machen. Also eine Nachricht + Signatur abzufangen, und diese dann wiederholt an das andere System zu schicken. Wenn es wichtig ist das zu verhindern gibt es da aber einiges was man machen kann.



  • hustbaer schrieb:

    Ja, kann mMn. nicht anders gehen.
    Wenn alles offen einsehbar ist, wüsste ich nicht wie man sowas fälschungssicher machen kann.

    Alright, verstehe. Ich fürchte fast, dass es darauf hinaus läuft, aber das muss ich mir noch mal genauer anschauen.
    Weiß nicht genau, wieso das wieder exakt wie damals in Warcraft 3 Zeiten gemacht wurden - also dass jeder immer die Custom-Map dann auch selber samt allen Daten auf der lokalen Platte hat.
    Da hätte man doch auch irgendwie anders lösen können. Dann wäre es zu mindestens nötig, dass man sich in das Spiel selber injected und von dort aus arbeitet. Das ist schon mal wesentlich schwerer, als einfach lokal eine Datei aufzumachen und zu googeln, wie man das Format lesbar macht.

    hustbaer schrieb:

    Den geheimen Teil als Passwort mitzuschicken wäre die einfachste Lösung. Und vielleicht schon ausreichend - je nachdem wie viel Sicherheit du benötigst. Wenn ein Angreifer die Möglichkeit hat die Nachrichten mitzulauschen die vom "Game-Server" zum "Save-Server" gehen. Darin sieht er ja das Passwort und kann es dann auch verwenden.

    Ist das "Zwischenschalten" denn relativ simpel? Oder schon eine Nummer größer, als einfach requests zu faken?
    Wenn das wenigstens etwas schwieriger ist, dann könnte man ja eventuell das Saven andersrum machen (falls die obige Lösung nicht implementierbar ist). Also der Save-Server fragt aktiv beim DotA 2 Server nach, anstatt gefüttert zu werden.
    Dann kommt es halt darauf an, wie simpel oder nicht simpel es ist, sich da tatsächlich zwischen zu schalten.



  • security schrieb:

    Alright, verstehe. Ich fürchte fast, dass es darauf hinaus läuft, aber das muss ich mir noch mal genauer anschauen.
    Weiß nicht genau, wieso das wieder exakt wie damals in Warcraft 3 Zeiten gemacht wurden - also dass jeder immer die Custom-Map dann auch selber samt allen Daten auf der lokalen Platte hat. ...

    Also nur damit du das nicht falsch verstehst: ich weiss nicht ob das so ist. Ich sagen nur wenn alles offen einsehbar ist, dann geht es nicht. Darüber ob dieses "wenn" erfüllt ist weiss ich nix, da hab ich mich auf das verlassen was du geschrieben hast.

    security schrieb:

    hustbaer schrieb:

    Den geheimen Teil als Passwort mitzuschicken wäre die einfachste Lösung. Und vielleicht schon ausreichend - je nachdem wie viel Sicherheit du benötigst. Wenn ein Angreifer die Möglichkeit hat die Nachrichten mitzulauschen die vom "Game-Server" zum "Save-Server" gehen. Darin sieht er ja das Passwort und kann es dann auch verwenden.

    Ist das "Zwischenschalten" denn relativ simpel? Oder schon eine Nummer größer, als einfach requests zu faken?
    Wenn das wenigstens etwas schwieriger ist, dann könnte man ja eventuell das Saven andersrum machen (falls die obige Lösung nicht implementierbar ist). Also der Save-Server fragt aktiv beim DotA 2 Server nach, anstatt gefüttert zu werden.
    Dann kommt es halt darauf an, wie simpel oder nicht simpel es ist, sich da tatsächlich zwischen zu schalten.

    Für jemanden ohne spezielle Möglichkeiten ist das soweit ich weiss quasi unmöglich. Für jemanden der als Techniker für nen grossen Provider arbeitet, der auch zufällig der Provider ist der entweder den Game-Server oder Save-Server ans Internet anbindet, ist es vermutlich nicht so schwer.

    ----

    Da ich mich mit Dota2 und dessen Scripting und Netzwerk-Gedöns nicht auskenne, und anscheinend auch sonst niemand (zumindest niemand der bis jetzt Lust hatte hier 'was beizutragen)...
    Also ich kann dir nur allgemeine Dinge beantworten - wie Sachen in Netzwerken so funktionieren, Verschlüsselung etc. Die Implementierungsdetails von Dota etc. kenne ich nicht.

    Sogesehen wäre es vielleicht besser wenn du die Frage in einem speziellen Dota2 Custom Map Bastler Forum nochmal fragst. Die Community ist ja riesig, da würde es mich schon wundern wenn es kein passendes Forum dafür gäbe.

    Und: Was ist überhaupt das Problem das du lösen willst? Willst du Cheats verhindern? Oder dass jemand deinen Save-Server mit Müll zuballert?



  • hustbaer schrieb:

    Also nur damit du das nicht falsch verstehst: ich weiss nicht ob das so ist. Ich sagen nur wenn alles offen einsehbar ist, dann geht es nicht. Darüber ob dieses "wenn" erfüllt ist weiss ich nix, da hab ich mich auf das verlassen was du geschrieben hast.

    Nene, wir ham uns schon, keine Angst 😃
    Es ist tatsächlich so - jede Map, die man spielen will, muss man vorher downloaden. Dieses landet in einem gewissen Format auf der lokalen Platte (VPK).
    Für dieses Format gibt es längst tools, mit denen man die Dinger öffnen kann - ist dann sehr ähnlich wie ein Archiv.
    Darin ist der gesamte Code der Map enthalten.

    hustbaer schrieb:

    Für jemanden ohne spezielle Möglichkeiten ist das soweit ich weiss quasi unmöglich. Für jemanden der als Techniker für nen grossen Provider arbeitet, der auch zufällig der Provider ist der entweder den Game-Server oder Save-Server ans Internet anbindet, ist es vermutlich nicht so schwer.

    Okay, das ist ja schon mal nicht schlecht. Wenn man das Saven also andersrum machen würde, dann müsste der hacker wenigstens irgendwie Zugriff auf das Verhalten des Codes, der auf dem Server läuft, haben.
    Das ist ja schon mal ein Schritt weiter, als einfach nur einen Request zu schicken.

    hustbaer schrieb:

    Also ich kann dir nur allgemeine Dinge beantworten - wie Sachen in Netzwerken so funktionieren, Verschlüsselung etc. Die Implementierungsdetails von Dota etc. kenne ich nicht.

    Klar, kein Problem - finde deine Antworten sehr gut, beantworten halt genau das, was mir so im Kopf rumschwirrt. Danke dafür!

    hustbaer schrieb:

    Und: Was ist überhaupt das Problem das du lösen willst? Willst du Cheats verhindern? Oder dass jemand deinen Save-Server mit Müll zuballert?

    Es gibt eine ziemlich bekannte Map, die genau mit diesen Problemem kämpft. Ich hab das mitbekommen und als ich darüber nachgedacht habe, hat es mich einfach interessiert, wie man sowas denn generell löst.
    Klar, in einem D2-Forum wäre ich besser aufgehoben - allerdings überlasse ich das dem Betreiber der Map, ist ja schließlich sein Bier.
    Mich hatte hier jetzt nur die allgemeine Thematik doch irgendwie nachdenklich gemacht.



  • security schrieb:

    hustbaer schrieb:

    Für jemanden ohne spezielle Möglichkeiten ist das soweit ich weiss quasi unmöglich. Für jemanden der als Techniker für nen grossen Provider arbeitet, der auch zufällig der Provider ist der entweder den Game-Server oder Save-Server ans Internet anbindet, ist es vermutlich nicht so schwer.

    Okay, das ist ja schon mal nicht schlecht. Wenn man das Saven also andersrum machen würde, dann müsste der hacker wenigstens irgendwie Zugriff auf das Verhalten des Codes, der auf dem Server läuft, haben.
    Das ist ja schon mal ein Schritt weiter, als einfach nur einen Request zu schicken.

    BTW: Um dem ganzen nicht noch eine weitere Verwundbarkeit zu verpassen sollte der Save-Server auf jeden Fall direkt die IP des Game-Servers verwenden. Sonst könnte man versuchen den DNS zu manipulieren. Ist auch alles andere als einfach, aber da die IP des Game-Servers vermutlich nicht oft wechselt würde es kaum Umstände bereiten.


Log in to reply