2011-12-19 34 views
21

Tentativo di comprendere la firma del codice Authenticode e la denominazione sicura.La firma del codice senza nomi forti lascia aperta la tua app agli abusi?

Ho ragione nel pensare che se firmo codice un exe che fa riferimento a poche dll (non di sicuro nome) che un utente malintenzionato potrebbe sostituire le mie DLL e distribuire l'app in un modo che appare come se fosse firmato da me , ma sta eseguendo il loro codice?

Supponendo che sia vero, sembra che tu non voglia davvero firmare un'app .NET senza nominare il tutto, altrimenti darai alle persone la possibilità di eseguire il codice con le sembianze di un'app che hai scritto ?

Il motivo per cui non sono sicuro, è che nessuno degli articoli che ho trovato online (incluso il documento MSDN sull'uso di SN + Authenticode) sembra menzionare questo, e sembra un punto abbastanza importante da capire (se io hai capito bene)?

risposta

15

Ho ragione di pensare che se io in codice firmare un exe che fa riferimento a un paio di DLL (non forti di nome) che un utente malintenzionato potrebbe sostituire il mio DLL e distribuire l'applicazione in un modo che appare come se è firmato da me, ma sta eseguendo il loro codice?

Sì se il resto delle DLL sono solo firmato e non un nome sicuro che può essere sostituito senza .NET sollevare un'eccezione. È possibile, all'interno dell'exe, verificare che le DLL siano firmate dalla stessa chiave dell'exe. Nessuno di questi approcci impedisce a qualcuno di sostituire le DLL o l'EXE.

Supponendo che sia vero, sembra che non si vuole veramente firmare un'applicazione .NET senza una forte-nominare il tutto, altrimenti si sta dando alle persone la possibilità di eseguire codice con il pretesto di un'app che hai scritto?

generale suppongo che è la 'best practice', ma ancora una volta non hanno impedito nulla. Una volta che un utente ha i diritti per modificare i file sul sistema locale, non c'è molto che puoi fare per impedirgli di svolgere attività dannose.

Esistono diverse tecnologie di offuscamento che creano progetti .NET completi in un unico exe, questo potrebbe rendere l'approccio "più sicuro" ma ancora in grado di manometterlo.

La vera domanda è cosa stai cercando di impedire loro di fare? Voglio dire, perché qualcuno dovrebbe essere interessato a sostituire la tua DLL? Cosa speravano di ottenere, qual è il loro obiettivo? Se stai cercando di impedire a qualcuno di leggere informazioni sensibili dal processo in cui ti trovi per una lunga e dura strada di delusione. Supponete che una parte malintenzionata abbia accesso completo al vostro codice sorgente e ogni informazione utilizzata dal vostro processo, perché lo fanno. Supponiamo che possano sostituire tutto o parte del codice a volontà, perché possono farlo.

Updated reindirizzamento

Così vincolante funziona solo con assembly con nome con la stessa chiave, e quindi non vi protegga da DLL di essere cambiato?

corretta, con l'eccezione ha osservato che l'iniezione di codice può ancora essere fatto in molti modi.

... e tornando alla domanda originale, fa la firma del codice senza una forte denominazione po minare il punto di firma del codice?

Non proprio. La firma del codice (non denominazione forte) ha due scopi distinti:

  1. Autenticazione. Verifica chi è l'autore del software.
  2. Integrità. Verifica che il software non sia stato manomesso dal momento della firma.

Spesso questo è solo autenticato e convalidato durante l'installazione. Questo è il motivo per cui firmiamo il nostro setup.exe, per garantire che il cliente abbia ricevuto da noi il programma di installazione non modificato. Viene richiesto con "Ti fidi di XXXX Company" e concedi quindi l'autorizzazione al programma di installazione autenticato/firmato. Una volta installato, tuttavia, vi è un piccolo uso incorporato della firma del codice da parte del sistema operativo (eccetto per i driver e alcuni altri casi oscuri).

Strong Naming sull'altro aveva uno scopo completamente diverso per la sua esistenza. È interamente focalizzato sull '"integrità" dell'applicazione. Non esiste alcun certificato, nessuna autorità di firma (CA) per verificarlo, nessuna informazione visualizzata dall'utente da confermare e nulla che il sistema operativo possa verificare sull'eseguibile che verrà eseguito.

Il framework .NET utilizza nomi sicuri per molte cose, tutti loro ho vagamente categorizzare come l'integrità delle applicazioni:

  1. Il contenuto del dll/exe ha un hash firmato in modo che non può essere manomesso.
  2. Ogni riferimento deve essere un nome sicuro e verificato quando si carica la dipendenza.
  3. Gli assembly possono essere registrati nel GAC e le politiche del publisher possono essere utilizzate.
  4. Le immagini native possono essere inventate per produrre un'immagine IL dell'assemblaggio.

Sono sicuro che ci sono altre cose che mi mancano qui, ma questi sono gli usi primari di cui sono a conoscenza.

Le migliori pratiche per la firma e Forte di denominazione

  • Utilizzare un installatore firmato
  • utilizzare un codice-firmato eseguibile
  • Utilizzare una con nome eseguibile
  • nome sicuro tutte le dipendenze e riferimenti ad essi
  • Generalmente le dipendenze per la firma del codice non sono richieste *
  • consideri GAC registrazione assemblee al momento dell'installazione

* Nota: La firma del codice può essere utile in alcuni casi per una DLL, per esempio oggetti COM classificati come 'sicuri' e incorporati in un browser dovrebbe essere firmato e con nome sicuro come se fosse un eseguibile. La firma del codice può essere utile anche per verificare esternamente le dipendenze senza caricare l'assembly o riflettere gli attributi.

+0

Non ho un esempio che sto cercando di proteggere, sto solo cercando di comprendere appieno codice/SN :-) Suggerisci che SN può essere bypassato con i collegamenti di reindirizzamento ... Non è una specie di sconfitta il punto di SN interamente? –

+0

Si è corretto, il reindirizzamento vincolante non può modificare la chiave di firma. Mi limito a controllare i fatti dopo che ho postato, ma mi sono distratto. –

+0

Il reindirizzamento vincolante funzionerà solo con gli assembly con nome sicuro con la stessa chiave e pertanto * si * protegge dalle DLL che vengono modificate? (e tornando alla domanda originale, la firma del codice senza il nome con caratteri forti indebolisce il punto di firma del codice?) –

1

Una volta che qualcuno può sostituire dll o eseguire il codice sulla macchina, non ci sono molte garanzie a te riservate. Nel mio caso tutte le Dll sono firmate singolarmente. Il mio codice si rifiuta di scaricare Dll che non sono firmati come parte dell'aggiornamento automatico. Tuttavia, qualsiasi app in esecuzione al mio livello di integrità o superiore sul mio sistema (nel caso di> = Windows Vista) può ancora iniettare una DLL nel mio exe con qualcosa come CreateRemoteThread ecc (http://www.codeguru.com/Cpp/WP /dll/article.php/c105) Ma assumendo nuovamente che qualcuno possa ottenere codice estraneo nel sistema è la parte difficile. Il resto è facile.

0

è inoltre necessario ricordare che il Code Signing spesso introduce molto dolore durante l'aggiornamento di dll senza la distribuzione di altre parti dell'applicazione.

Questo è il motivo per cui molte biblioteche popolari non con forza il nome del

0

dll Dopo essere stato ricerca per lo stesso e letto molte cose. Finalmente posso dire alla tua domanda, SÌ, un nome forte per le dipendenze è necessario se stai per firmare digitalmente il tuo exe di app.

Presupposto, se le dipendenze non hanno un nome sicuro. E vengono sostituiti. La tua applicazione li caricherà senza problemi. E l'utente vedrà la finestra di dialogo "Verificato editore: il tuo nome". Mentre l'eseguibile era intoccato ma le dipendenze sono state alterate.

Il problema non è quell'utente, ma la distribuzione di quel pacchetto con dipendenze alterate mentre tutti vedranno il tuo nome su di esso.