Weitere Vorschläge gesucht: Nur signierte Dateien laden



  • Servus,

    ich überlege gerade, wie ich am besten das Problem löse, dass mein Programm nur von mir signierte Dateien läd.
    Mein Ansatz besteht derzeit darin, DSA einzusetzen und das ganze im Programm mit libcryptopp zu implementieren.

    Derzeit funktioniert das folgendermaßen:
    -Ich bin in Besitz eines Private und eines Public Key
    -Mit meinem private Key signiere ich eine Datei, die das Programm laden soll und lege die Singatur in einer weiteren Datei ab.
    -Es werden die Dateien datai.dat und datei.sig.dat ausgeliefert
    -In meinem Programm ist mein Public Key einkompiliert
    -Soll mein Programm eine Datei laden, läd es sich die Datei und die signaturdatei rein und prüft mithilfe des Public Key ob die Datei manipuliert wurde.

    Soweit, so gut. Das funktioniert erstmal hganz prächtig.

    Wie sieht ein möglicher Angriff aus: Sich selbst ein Schlüsselpaar erzeugen, die Datei selbst signieren, und den neuen Public-Key in mein Programm reinpatchen?

    Wie würdet ihr vorgehen?
    Weitere/bessere Vorschläge?

    Philipp



  • Hat man Schreibrechte auf dein Programm?
    Disassembler öffnen -> Überprüfungsroutine kicken 🙄

    Leserechte?
    Verfolgen was das Programm macht -> public key auslesen -> eigene Datei signieren

    Weder noch?
    Sicher. (Behaupte ich jetzt einfach mal, bin kein crypto Experte also korrigiert mich ruhig :D)

    Lösung bei Schreibrechten:
    Auf lange Sicht gar keine.

    Lösung bei Leserechten:
    Überprüfung über das Netz. Ist umständlich aber wahrscheinlich die einzige Lösung.



  • So in etwa befürchte ich das nämlich auch.
    Frage: Wie macht Windows das denn (nur signierte Kerneltreiber laden) ?

    Online-Überprüfung möchte ich nicht. Das muss auch keinem Atomschlag widerstehen, eher nur den Feierabend-Debugger abhalten.

    Philipp



  • Wie Windows das macht weis ich nicht, dass es aber wohl nicht wirklich geholfen hat ist wohl jedem klar 😃

    Gegen den Feierabend debugger hilft es wahrscheinlich schon wenn man das Programm so schreibt dass der Assembler Code kaum lesbar wird.
    Allerdings stellt sich die Frage ob man das Problem nicht anders lösen kann.. warum soll dein Programm nur signierte Dateien öffnen / wo besteht die Gefahr bei fremden Dateien? Ich denke hier sollte am besten ein Lösungsansatz her 😉



  • PhilippM schrieb:

    Wie sieht ein möglicher Angriff aus: Sich selbst ein Schlüsselpaar erzeugen, die Datei selbst signieren, und den neuen Public-Key in mein Programm reinpatchen?

    Der einfachste möglich Angriff ist oft: Signatur-Check drinnen lassen, aber den bedingten Sprungbefehl des "if (allesOK)" zu einem unbedingten zu machen, bzw. mit NOP überschreiben (je nachdem ob der Sprung für "OK" durchgeführt werden muss oder nicht).

    Das ist meist einfacher als alles andere.



  • cooky451 schrieb:

    Hat man Schreibrechte auf dein Programm?
    Disassembler öffnen -> Überprüfungsroutine kicken 🙄

    Leserechte?
    Verfolgen was das Programm macht -> public key auslesen -> eigene Datei signieren

    Mit dem Public-Key alleine kannst du nichts signieren, mit dem kannst du nur die Signatur checken. Sonst wäre das ganze auch ziemlich sinnlos, nen?
    Nix verstanden haben, aber immer gleich die Augen verdrehen über die Fragen anderer Leute. 👍



  • hustbaer schrieb:

    cooky451 schrieb:

    Hat man Schreibrechte auf dein Programm?
    Disassembler öffnen -> Überprüfungsroutine kicken 🙄

    Leserechte?
    Verfolgen was das Programm macht -> public key auslesen -> eigene Datei signieren

    Mit dem Public-Key alleine kannst du nichts signieren, mit dem kannst du nur die Signatur checken. Sonst wäre das ganze auch ziemlich sinnlos, nen?
    Nix verstanden haben, aber immer gleich die Augen verdrehen über die Fragen anderer Leute. 👍

    Oh, stimmt, irgendwie habe ich da ziemlich was übersehen.. bin (warum auch immer?) davon ausgegangen dass in der Datei datei.sig.dat der private Schlüssel liegt.. was natürlich total sinnlos wäre..
    Möchte mich hiermit also wirklich für die Fehlinformation entschuldigen. Hatte wohl irgendwie meinen Kopf wo anders, vielleicht sollte ich mich jetzt mal schlafen legen^^

    Hoffe/Glaube aber mal dass das jetzt nicht so den Unterschied macht, da die meisten warscheinlich sowohl Schreibe- als auch Leserechte haben werden.

    Was ich aber noch sagen muss, das "Augenverdrehen" war ja nicht böse gemeint sondern sollte Leser eigentlich darauf aufmerksam machen dass die Aussage "Überprüfungsroutine kicken" natürlich sehr vereinfacht ist und sich das ganze in der Praxis als ziemlich umständlich erweisen kann. War also eher an die Leute gerichtet die mir dann nachher im thread vorschlagen ich solle doch diese Routine einmal finden und entfernen. Wenn das falsch rüber gekommen ist -> nochmals entschuldigung. Naja jetzt ists aber gut ich hoffe ich habe damit genug Buße getan und mein Gewissen ist wieder rein 😉



  • Naja, Misverständnis meinerseits, kein Grund sich 3x zu entschuldigen. Ne einfache Klarstellung hätte denke ich gereicht 🙂

    Und was das entfernen des Checks angeht: SO schwer ist das meistens auch nicht. Zumindest nicht wenn der Code nicht absichtlich verhunzt wurde. Und man halbwegs gut Assembler lesen kann.


Anmelden zum Antworten