Frage:
Wie kann ich sicherstellen, dass meine DLL nicht geändert wurde?
Vallo
2015-04-21 16:36:58 UTC
view on stackexchange narkive permalink

Ich habe ein altes Projekt in VB, das einen eindeutigen PC-Code aus der MAC-Adresse und der Disc-ID erstellt hat. Dies wurde verwendet, um einen PC zu identifizieren, sodass Anmeldeinformationen nicht zwischen PCs verwendet werden können.

Dieses Projekt wurde nach C # migriert, und ich habe diese Logik in eine DLL gekapselt, die einfach eine Methode aufruft, die die pc_id zurückgibt.

Das Problem, das ich jetzt habe, ist, dass es verdammt einfach ist, einfach eine neue DLL mit demselben Klassennamen und derselben Methodensignatur zu erstellen und die gewünschte pc_id zurückzugeben.

Wie kann ich sicherstellen? Die DLL, auf die mein Programm verweist, gehört mir?

Ich habe darüber nachgedacht, den Hash meiner DLL mit einem fest codierten zu vergleichen, aber ist dies zwischen verschiedenen Betriebssystemen sicher? Wird sich der Hash der Datei zwischen Dateisystemen ändern?

Oder welche Methode wird bevorzugt, um die Integrität / Herkunft der Dateien sicherzustellen?

Sie können einen Hash verwenden oder die Datei mit einem privaten Schlüssel signieren. Sie können dann den fest codierten öffentlichen Schlüssel speichern und überprüfen, ob die DLL Ihnen gehört.
Wie stellen Sie sicher, dass das laufende Programm tatsächlich Ihnen gehört? Wenn Sie dies nicht tun können, stellen Sie sicher, dass die DLL Ihnen gehört.
Wen versuchst du mit einem Hash zu beschützen? Ein Hash ist nützlich, um den Benutzer zu schützen, indem festgestellt wird, ob eine DLL von einer anderen Partei manipuliert wurde (z. B. wenn die DLL von irgendwoher heruntergeladen wurde). Wenn der Benutzer selbst aktiv versucht, die DLL zu ersetzen, sind alle Wetten ungültig. Der Benutzer könnte wahrscheinlich auch einfach das Hauptprogramm ändern, um es mit einem anderen Hash zu vergleichen oder die Validierung insgesamt zu überspringen.
Bitte bearbeiten Sie Ihre Frage, um Ihr Bedrohungsmodell zu erläutern. Gegen welche Bedrohungen versuchen Sie sich zu verteidigen? Welche Arten von Angreifern oder Szenarien? Was sind Ihre Ziele, d. H. Was versuchen Sie zu verhindern? Versuchen Sie sicherzustellen, dass der Benutzer über eine gültige lizenzierte Kopie Ihrer Software verfügt? Versuchen Sie, DRM zu machen? Wie würden Sie auf @bdsl reagieren? Bitte lesen Sie die Kommentare unter http://security.stackexchange.com/help/on-topic und bearbeiten Sie Ihre Frage entsprechend (z. B. "Welchen Hintergrund sollte ich in meiner Frage angeben?").
Stellen Sie sich vor, Sie könnten. Wie stellen Sie dann sicher, dass Ihr Programm nicht nur geändert wird, um die DLL-Änderungsprüfung zu entfernen?
Wenn die DLL wirklich klein ist, können Sie ihre Bytes nicht einfach in eine statische Variable in Ihrem Hauptprogramm codieren und von dort und nicht vom Dateisystem laden?
Da Ihr neues Programm in C # enthalten ist, ist es trivial, es zu ändern und die Prüfung zu entfernen. Mit Decompilern wie ILspy können Sie den zu ändernden Code einfach verstehen. [1] http://ilspy.net/
Klingt nach dem üblichen, unmöglich zu lösenden DRM-Problem.
Ich verstehe, dass es immer eine Problemumgehung gibt, um eine Validierung zu überspringen. Sicherheit ist hier kein großes Problem (und ich bin in diesem Bereich sehr unterqualifiziert), aber zumindest versuche ich, es nicht sehr einfach zu machen, diese Validierung zu überspringen. Außerdem soll diese pc_id nur verhindern, dass ein Benutzer dasselbe Konto für alle PCs verwendet. Es handelt sich nicht um das echte DRM. Vielen Dank für Ihre Antworten!
Fünf antworten:
Marcos Zolnowski
2015-04-21 23:54:41 UTC
view on stackexchange narkive permalink

Für Windows-Binärdateien würde ich empfehlen, die Datei digital zu signieren .

Wenn Sie Zertifikate verwenden, entspricht dies fast der HTTPS-Technologie.

Einführung in die Codesignatur

SignTool

Anschließend sollten Sie Windows-Kryptografie-APIs verwenden, um die Signatur zu überprüfen von geladenen DLLs.

Ich weiß, dass Sie viel Arbeit benötigen, um dies zu erreichen. Für Windows ist dies jedoch der sicherste Pfad . Wenn SHA-Hashes nicht ausreichen, ist dies die Alternative.

Ich bin verwirrt.Ich bin damit einverstanden, dass eine digitale Signatur, die von einer vertrauenswürdigen Behörde unterstützt wird, der bessere Weg ist. Sind jedoch nicht alle Kommentare im ursprünglichen Beitrag noch gültig?Kann der Angreifer die Assembly nicht noch ändern, um die Überprüfung der Signaturüberprüfung zu überspringen?Oder mit "Für Windows-Binärdateien" meinen Sie nicht verwalteten Code (der schwieriger zu ändern ist)?
Bevor Sie die DLL laden, überprüfen Sie seine Signatur.Die Signatur enthält die Prüfsumme des Inhalts.Wenn Sie ein einzelnes Bit davon ändern (verwaltet oder nicht verwaltet), stimmen diese nicht überein.
Klar, macht Sinn.Ich denke, es hängt wirklich vom Bedrohungsmodell ab.Beispiel: Angenommen, sie haben Zugriff auf die DLL, die das Laden durchführt und die Signatur validiert.Sie können diesen Verteidigungscode bei der Signaturüberprüfung einfach entfernen.(Ganz leicht, ich habe ein paar Minuten gebraucht).Hoffentlich hält mein Verschleierungswerkzeug dies aufrecht, denke ich ...
Ja, der nächste Schritt wäre, die Überprüfung aus der EXE-Datei zu entfernen.Also müssen Sie auch die EXE unterschreiben.Richten Sie Windows so ein, dass die EXE-Datei vor der Ausführung überprüft wird.Sie werden als Group Policy - Software Restriction Policies bezeichnet.Dies bedeutet, dass Windows nur Dateien ausführt, die mit Ihrem Zertifikat signiert sind.Für Windows ist dies das Beste an Sicherheit.
Gilt diese Richtlinie zur Einschränkung von Gruppenrichtliniensoftware nur für eine EXE-Datei (oder eher für einen Prozess?).Zum Beispiel versuche ich wirklich nur ein paar verwaltete DLLs zu schützen. Wäre das noch möglich?Oder sagen Sie, dass ich eine Exe in den Mix einführen muss, z. B. wenn eine meiner Assemblys die digital signierte Exe lädt?"Dies bedeutet, dass Windows nur Dateien ausführt, die mit Ihrem Zertifikat signiert sind" Kann diese Datei eher eine DLL als eine Exe sein?
Die Sache ist, jemand muss Ihre DLLs laden.Wenn der Prozess (die Instanz) gefährdet ist, hilft es wenig, eine signierte DLL zu haben.Wer das System steuert, kann das System umgehen.
Simon Richter
2015-04-21 22:11:33 UTC
view on stackexchange narkive permalink

Mit dem geringen Schutzniveau, das die MAC-Adresse bietet, würde ich mich nicht darum kümmern. Das Ändern der MAC-Adresse ist weniger aufwändig als das Austauschen Ihrer DLL.

AlexH
2015-04-21 16:42:23 UTC
view on stackexchange narkive permalink

Hashes ändern sich nicht zwischen Dateisystemen. Überprüfen Sie den SHA1-Hash der Datei anhand des bekannten "guten" Werts in Ihrem Code, und Sie sollten abwesend sein!

Das ist auch trivial, um mit einem [Shim] (https://technet.microsoft.com/en-us/library/dd837644%28v=ws.10%29.aspx) zu umgehen. Keine schlechte Antwort, wohlgemerkt, aber Sie müssen die Einschränkung verstehen
Und doch können Sie die Funktion, die den Hash überprüft, einfach deaktivieren und umgehen. Sie können nicht zu 100% sicherstellen, dass die DLL die richtige ist.
IMHO ist dies eine schlechte Antwort, solange es nicht auch erklärt, dass die Frage falsch ist.
alex
2015-04-22 02:00:38 UTC
view on stackexchange narkive permalink

Wenn Sie verhindern möchten, dass Anmeldeinformationen auf anderen PCs verwendet werden, lesen Sie die Windows-Datenschutz-API. Damit können Sie Ihre Anmeldeinformationen oder andere Daten verschlüsseln. Diese können nur auf diesem Computer (oder nur unter dem aktuellen Windows-Benutzerkonto, falls erforderlich) entschlüsselt werden.

Loren Pechtel
2015-04-23 07:18:37 UTC
view on stackexchange narkive permalink

Die MAC-Adresse bietet nicht nur keinen großen Schutz, sondern das Eingeben einer Festplatten-ID ist auch eine schlechte Sache. Nicht alle "Festplatten" geben eine konsistente Festplatten-ID zurück. Das Problem ist, dass einige RAID-Controller auf eine Anfrage nach einer Festplatten-ID antworten, indem sie diese von einem beliebigen verfügbaren Laufwerk abrufen.

Ganz zu schweigen davon, was passiert, wenn jemand Hardware aktualisiert.

Wenn sie ihre Hardware aktualisieren, fordern sie einfach ein Zurücksetzen ihrer pc_id an. Diese Validierung soll lediglich verhindern, dass in mehreren PCs derselbe Berechtigungsnachweis verwendet wird. Ich wusste das nicht über RAID, da jeder unserer Benutzer ein RAID hatte. Unsere Kunden verwenden in der Regel alte Hardware und Notebooks, sodass wir mit diesem Thema nie Probleme hatten.
@Vallo Ich habe seit Mitte der 00er Jahre ein RAID-Array in einem Computer gesehen - zugegebenermaßen ein High-End-Computer, als er gekauft wurde. Seit ungefähr dieser Zeit besitze ich auch RAID-fähige Laptops (aber ich habe die RAID-Funktionen nie wirklich genutzt.)


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...