2013-07-20 18 views
5

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.
+0

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 –

+1

Perché un hacker non dovrebbe sostituire solo * il tuo * programma? Molto più facile da fare. –

+0

Penso che potresti ancora usare sigcheck.exe.Puoi eseguire il processo da C# e catturarne l'output: http://stackoverflow.com/a/10380353/1415732 – Alden

risposta

1

È necessario utilizzare il verificatore Authenticode. Le risposte a this question offrono l'utilizzo di P/Invoke e, se hai bisogno di una soluzione gestita, potresti essere interessato alla nostra libreria SecureBlackbox che, tra le altre funzionalità, offre firma Authenticode e verifica delle firme.

Tuttavia, mentre puoi difenderti dal caricamento di una DLL falsa, non puoi difendere l'applicazione stessa da eventuali problemi. Quindi la verifica della firma ti protegge da un solo vettore di attacco, ovviamente.

Lasciatemi puntare, che la sostituzione di WinTrust.dll dipende da un diverso vettore di attacco che richiede l'accesso al computer. In questo caso, l'utente malintenzionato può correggere del tutto l'applicazione.

+0

Per verificare la firma usando "CryptQueryObject" (come raccomandato in quella risposta) si richiede un DllImport di CRYPT32.DLL. Per come la vedo io, invece, renderei la mia applicazione vulnerabile al dirottamento DLL di crypt32.dll nello stesso modo in cui il mio punto era con WinTrust.dll. Inoltre, non sono preoccupato che la mia domanda venga violata, poiché è open source. Voglio solo proteggere i miei utenti in modo che possano aprire in sicurezza i file con la mia applicazione senza essere 0wn3d. – ErikH

+1

@EricH se esiste una possibilità per il dirottamento della DLL, il computer dell'utente è già compromesso e falso crypt32.dll ha già fatto ciò a cui era destinato, molto prima dell'applicazione. –

Problemi correlati