Wie um zu Überprüfen, eine Digitale Signatur einer DLL in .NET

Ich geschrieben habe eine C# .NET-Anwendung, die eine beliebte, nicht verwaltete DLL-Datei für einen Teil seiner Funktionalität.
Die DLL importiert, die mit dem standard DllImport aus dem System.- Laufzeit.InteropServices.

Jedoch, leider, meine Bewerbung (zusammen mit den meisten .NET-Anwendungen mit DllImport) ist anfällig für DLL-Hijacking.
I. e. ein Angreifer kann einen schädlichen Kopie der importierten DLL im gleichen Verzeichnis wie eine Datei geöffnet von my-Anwendung.
Diese könnte der Angreifer die volle Kontrolle über den Computer des Nutzers.

Zur Abschwächung dieser Anfälligkeit würde ich mag, um zu überprüfen, dass die DLL-Datei ist ordnungsgemäß unterzeichnet (mit Standard-Authenticode), bevor Sie es importieren.
Ich weiß, dass die Signaturen überprüft werden können mit tools wie sigcheck.exe aber dies ist nicht eine praktikable Lösung für mich, da ich zu tun habe, es in mein C# - code.

Also meine Frage ist einfach: Wie kann ich überprüfen, ob eine DLL eine gültige Authenticode-Signatur, von meinem managed C# - code, der vor dem laden der DLL?

Einschränkungen:

  • Die importierte DLL ist nicht von mir entwickelt wurde, ist es von einer externen Firma.
  • Die DLL nicht verteilt, mit meiner Bewerbung, es wird erwartet, dass bereits installiert sein, bevor Sie unter meine app.
  • Die importierte DLL existiert in vielen verschiedenen Versionen (und noch mehr kommen wird), also kann ich nicht einfach überprüfen, ob eine MD5-Prüfsumme der DLL, bevor Sie es importieren.

Gescheiterten Ansätze:

  • Microsoft haben einen interessanten Kommentar auf Verhinderung von "DLL preloading" - Attacken,
    aber diese info ist nicht zutreffend .NET DllImport.
  • Ich habe gesehen, einige Leute was auf die Verwendung des nicht verwalteten Funktion WinVerifyTrust aus Wintrust.dll.
    Das ist natürlich eine blöde Lösung, da würde stattdessen meine Anwendung anfällig für DLL-injection über Wintrust.dll.
  • Dies ist wahrscheinlich dup stackoverflow.com/questions/3281057/..., aber da Sie nicht angeben, wie nicht verwalteter DLL-Datei ist signiert, ich kann nicht wirklich sicher sein.
  • Warum würde ein Angreifer ersetzen Sie einfach Ihr Programm? Viel leichter zu tun.
  • Ich denke, Sie könnte noch sigcheck.exe. Sie können die Ausführung des Prozesses von C# und erfassen Sie die Ausgabe: stackoverflow.com/a/10380353/1415732
  • In der Heimat, Authenticode ist wirklich das einzige Spiel in der Stadt hier.
  • Ja, ich meine verifizieren eine Authenticode-Signatur.Aber die p/Invoke-Lösung, die Sie finden, würde nicht mein problem lösen, da diese Lösung erfordert einen DllImport der "crypt32.dll". Daher meine Anwendung würde stattdessen werden anfällig für DLL-hijacking-der crypt32.dll.
InformationsquelleAutor ErikH | 2013-07-20
Schreibe einen Kommentar