Ho scritto un'applicazione C# .NET che utilizza un popolare file DLL non gestito per una parte delle sue funzionalità. La DLL viene importata utilizzando DllImport standard da System.Runtime.InteropServices.Come verificare una firma digitale di una DLL in .NET
Tuttavia, sfortunatamente, la mia applicazione (insieme alla maggior parte delle applicazioni .NET che utilizzano DllImport) è vulnerabile al dirottamento DLL. I.e. un utente malintenzionato può inserire una copia malvagia della DLL importata nella stessa directory di qualsiasi file aperto dalla mia applicazione. Ciò potrebbe dare all'utente malintenzionato il pieno controllo della macchina dell'utente.
Per mitigare questa vulnerabilità mi piacerebbe verificare che il file DLL sia firmato correttamente (con Authenticode predefinito) prima di importarlo. So che le firme possono essere verificate con strumenti come sigcheck.exe, ma questa non è una soluzione praticabile per me dal momento che ho bisogno di farlo dal mio codice C#.
Quindi la mia domanda è semplicemente: Come posso verificare che una DLL abbia una firma Authenticode valida, dal mio codice C# gestito, prima di caricare la DLL?
Limitazioni:
- La DLL importato non è sviluppato da me, è da una società esterna.
- La DLL non è distribuita con la mia applicazione, dovrebbe essere già installata prima di eseguire la mia app.
- La DLL importata esiste in molte versioni diverse (e ne arriverà ancora di più), quindi non posso semplicemente verify an MD5 checksum of the DLL prima di importarla.
approcci falliti:
- Microsoft hanno un interessante resoconto sulla preventing "DLL preloading attacks", tuttavia, questa informazione non è applicabile per DllImport di NET.
- Ho visto alcune persone che suggeriscono l'uso della funzione non gestita WinVerifyTrust da Wintrust.dll. Questa è ovviamente una soluzione stupida, poiché ciò renderebbe la mia applicazione vulnerabile all'iniezione DLL tramite Wintrust.dll.
Questo è probabilmente dup di http://stackoverflow.com/questions/3281057/get-timestamp-from-authenticode-signed-files-in-net, ma poiché non si specifica come viene firmata la DLL non gestita, è possibile essere molto sicuro –
Perché un hacker non dovrebbe sostituire solo * il tuo * programma? Molto più facile da fare. –
Penso che potresti ancora usare sigcheck.exe.Puoi eseguire il processo da C# e catturarne l'output: http://stackoverflow.com/a/10380353/1415732 – Alden