Binäres Netzwerk Protokoll



  • Hallo C++ler,

    ich möchte ein Binäres Netzwerk Protokoll entwerfen. Ich hatte mir so was wie das Narses Binary Frame Protocol gedacht: http://www.entwickler-ecke.de/viewtopic.php?t=66706&postorder=asc&start=0&view=dl

    In diesem Protokoll wir zuerst der Header der gesammten Nachricht gesendet (indem z.B. der Befehl und die Anzahl aller Parameter steht), danach die Länge des ersten "Parameters", dann der entsprechende Parameter, danach wieder die Länge des nächsten Parameters usw.. Das Problem besteht jetzt darin, dass ein Angreifer einfach vor einen Parameter eine zu falsche Länge stellt, mein Programm per

    memcpy()
    

    zuviel kopiert, und eine Exception auslöst!
    Das alleine wäre kein Problem, jedoch kommen noch andere Sachen hinzu:
    1. Es kommt bei mir nur ein Bytestrom an, ich kann verschiedene Befehle nur durch die Anzahl der Parameter (aus dem Header des Befehls) trennen. Diesen Wert kann ein Angreifer aber fälschen.
    2. Wenn eine Exception ausgelöst wird, muss ich den Server im Prinzip neustarten, weil ich nicht mehr entscheiden kann was die nächsten ankommenden Bytes sind 😕
    3. Ein "Nicht-Binär"-Protokoll kommt leider nicht infrage, da es nicht beliebige Daten übertragen kann und auch keinen Schutz gegen Exceptions (und die darauffolgende "Verwirrtheit" meines Programmes bietet)

    Eine Bibliothek kommt auf keinen Fall infrage, weil ich aus Spaß programmiere und jeder Depp ein Programm programmieren kann, das nur aus Bibliotheken zusammenkopiert ist.

    Meine Frage ist also, wie kann ich verhindern (oder es zumindest schwer machen), dass ein Angreifer meinen Server lahmlegt?

    Wenn irgendwas unklar ist, fragt ruhig nochmal nach 😃

    mfg -Infected-



  • ...



  • Leider bietet auch das keinen wirklichen Schutz:

    Ich kann nicht die gesammte Nachricht verschlüsseln (weil mein Programm nicht weiß, wieviel vom Bytesstrom noch zu meiner Nachricht gehört (unverschlüsselt könnte man es aus dem Header auslesen)) und alle sinnvollen Verschlüsselungen Blockverschlüsselungen sind, bei denen ich die gesammte Nachricht übergeben muss... nochdazu ist dem Angreifer der Schlüssel bekannt (er kann ihn aus der Exe auslesen).

    Ich vermute, dass es leider keinen wirklichen Schutz gibt... Aber weshalb kann ich dann dem Skype Server, der auch ein Binärprotokoll verwendet so nicht zum Absturz bewegen? (Nein ich habe das nicht ausprobiert, aber ich vermute das haben schon genug Leute mit mehr Ahnung als ich versucht)

    Danke an alle Antwortenden 😃



  • Du kannst die Nachrichten signieren. Das hat aber einigen Overhead.
    Aber das Problem scheint mir eher zu sein, dass dein Programm ein falsches memcpy macht. Wenn die Nachricht sagt "Jetzt kommt ein 100 Bytes Parameter" aber du nur 20 Bytes hast, dann musst du halt warten und nicht memcpy mit 100 Bytes aufrufen. Ich wüsste nicht, warum dein Programm bei falscher Eingabe und korrekter Implementierung abstürzen sollte.



  • Jetzt kommt ein Parameter mit 2 Mrd. Bytes. Loesung maximale Laenge festlegen. Problem: Wie auf Pakete aufteilen falls doch mehr erwartet werden?

    Ich vermute, dass es leider keinen wirklichen Schutz gibt...

    Doch gibt es, aber das erfordert mehr Wissen. ssh bzw. openssl sind beste Beispiele.



  • Für mein Programm kommen da halt einfach sagen wir mal 100 Bytes rein:
    Sagen wir das sind 2 Befehle a 50 Bytes:
    Mein Programm liest aus dem Header der ersten Nachricht die Anzahl der Parameter der ersten Nachricht. Dann liest sie die nächsten 4 Bytes ein und interpretiert diese als Länge des Parameters, dann kopiert sie soviele Bytes weiter in einen Buffer, dann liest sie die nächsten 4 Bytes ein (also die ersten 4 nach dem Parameter) und interpretiert diese wieder als Länge des Parameters:

    (00 00 00 05) [12 34 56 78 90] (00 00 00 01) [FE] ... (Die Längen habe ich in runde , die Daten in echicke Klammern gesetzt 😃

    Nach dem alle Parameter ausgelesn sind (ich habe ja die Anzahl) weiß mein Programm: "Die nächsten Bytes sind ein neuer Befehl!" und liest wieder den Header ein. Ich kann leider nicht überprüfen, ob die Nachricht wirklich so lang ist (ich habe nur die Anzahl der Parameter und selbst die kann ein Angreifer einfach im Header ändern)....

    Danke an Alle 😃



  • Oder einfach ausgedrueckt, dein gewaehltes Protokoll ist nicht fuer diese Art der Anwendung geeignet.



  • Darum frage ich ja: Es muss doch eine Möglichkeit geben, ohne gleich auf ein (aus meiner Sicht unpraktisches und schlechtes) Terminatorzeichen-Protokoll umzusteigen 😞

    Danke an alle 😃



  • Kauf dir einfach bei Media Markt einen Computer mit Windows da ist auch schon ein Netzwerk Protokoll (TCP,UDP, und noch andere) mit dabei.



  • Für die Integrität ->
    HMAC - http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

    Und denn ganzen Datenstrom natürlich verschlüsseln.



  • knivil schrieb:

    Oder einfach ausgedrueckt, dein gewaehltes Protokoll ist nicht fuer diese Art der Anwendung geeignet.

    👍



  • -Uninfected- schrieb:

    Kauf dir einfach bei Media Markt einen Computer mit Windows da ist auch schon ein Netzwerk Protokoll (TCP,UDP, und noch andere) mit dabei.

    Also beim besten Willen: Du hast nicht den Hauch einer Ahnung! Ich meinte kein Transportschicht-Protokoll sondern ein Anwendungsschicht-Protokoll, das übrigens auf TCP aufbaut. Da du aber vermutlich nicht weißt was ich meine: http://de.wikipedia.org/wiki/Internetprotokollfamilie#Anwendungsschicht_.28entspricht_OSI-Layer_5.E2.80.937.29

    Danke an alle 😃



  • Frag einfach bei Media Markt in der Software Abteilung die haben ganz viel Software da. Ich finde da immer alles was ich brauche. 👍



  • Im Gegensatz zu dir habe ich wenigstens den Hauch einer Ahnung, was Computer sind, bevor du hier mit WIRKLICH unqualifizierten Kommentaren nervst, lernst du besser mal was ein Computer überhaupt ist!

    An alle anderen, was für ein Protokoll wäre den geschickter? 😃



  • Ich verweise auf mein ersten Post.



  • -Infected- schrieb:

    Im Gegensatz zu dir habe ich wenigstens den Hauch einer Ahnung, was Computer sind, bevor du hier mit WIRKLICH unqualifizierten Kommentaren nervst, lernst du besser mal was ein Computer überhaupt ist!

    Ich weiss was ein Computer ist!

    Ich habe auch einen Computer zuhause damit surfe ich immer im Internet ich hab nämlich eine DSL Flatrate und einen Router besser gesagt eine FritzBox!

    Mein Computer hat einen Intel i5 Prozessor, 2GB-RAM und eine 512MB Grafikkarte sowie eine 500GB große Festplatte. Als Betriebssystem verwende ich Windows 7 64 Bit!

    Den Computer habe ich übrigens bei Media Markt gekauft!

    Jetzt guckste was?! Wenn ich mal etwas ins detail gehe dann hast du da keine Schnitte!



  • Btw. du solltest auch mal nach Media Markt gehen die können dir da bestimmt bei deinem Problem helfen den die haben höchst qualifiziertes Fachpersonal!



  • Da kann ich nur zustimmen, das Media Markt Team hat mich auch immer sehr gut beraten. 👍 🙂

    @ -Uninfected-

    Den PC den du da hast das ist aber kein Einsteiger Model mehr daher denke ich das du schon ein Computer Vollprofi bist.



  • @ -Uninfected-

    Kannst du mir kurz erklären was DDR-Ram ist?



  • Hallo Alfons, ja du hast recht mein Computer ist aus der Profi Serie. Ich selber bin ja auch Computer Profi.

    Bei uns im bekannten Kreis da bin ich der Computer Experte. Vor ein paar Tagen hab ich einem Nachbarn bei Word geholfen er wusste nicht wie man die Schrift größer Stellen kann aber für mich war das kein Problem das Problem hatte ich unter einer Minute gelöst. 🕶

    Ja das mit dem DDR-Ram da hatte mich ein bekannter gefragt ob ich ihm Speicher einbauen kann:

    Also ich hab kurz auf Youtube geschaut wie sowas geht und auch sofort verstanden. Ich hatte noch ein Ram-Riegel bei mir rumliegen aber der ließ sich nicht beim ihm einbauen. Der Speicher den ich hatte das war kein Deutscher Speicher sondern der war aus dem Sudan kurz gesagt SD-RAM.

    Daher musste ich bei Media Markt Deutschen Ram kaufen kurz gesagt DDR-RAM.

    Und jetzt weisst du auch was DDR-Ram ist! 👍


Anmelden zum Antworten