2011-02-01 7 views
5

La firma con un nome sicuro (coppia di chiavi memorizzata in un file .snk) è (tra gli altri) significato per protect against forging assemblies.In che modo la firma con un nome sicuro protegge contro la creazione di un insieme di assiemi?

Ad esempio: Spedisco il mio assembly firmato con un nome sicuro, quindi un altro sviluppatore usa il mio assembly e quindi il suo assembly ora contiene un riferimento al mio, menzionando la chiave pubblica della mia coppia di chiavi. Alcuni utenti installano l'assembly dello sviluppatore e il mio assembly e utilizza felicemente il codice dello sviluppatore. Se qualcun altro tenta di produrre un assembly che assomiglia a una mia versione e convincere l'utente che si tratta di un "aggiornamento che vale la pena installare" che l'assembly forgiato non verrà caricato perché controllo la mia coppia di chiavi e quell'assemblaggio forgiato non è firmato con la stessa coppia di chiavi . Va bene, d'accordo.

Ma che cosa impedisce a una parte malintenzionata di falsificare sia il mio assembly che l'assembly dipendente dell'altro sviluppatore e "spedirlo" entrambi? Prendono il mio assemblaggio e l'assemblaggio di quello sviluppatore, manomette entrambi, firmano la versione contraffatta del mio assembly con qualunque chiave, quindi aggiungono un riferimento ad esso nella versione contraffatta dell'assembly dipendente, firmano anche quest'ultimo e inviano entrambi. Intendo "spedire" malmente due assiemi non dovrebbe essere molto più difficile di "spedire" un assemblaggio.

In che modo la firma con i nomi sicuri protegge da falsificare più assiemi?

+0

Bene, nome forte anche all'assemblaggio. Continua a tirare quella stringa e finirai con l'EXE. Se l'attaccante può rimpiazzare anche quello, non ha più senso usare nomi forti. –

+0

@Hans Passant: Penso che tu abbia ragione.Potresti aggiungere questo come risposta? – sharptooth

risposta

5

La denominazione forte di un assembly non ha lo scopo di proteggere l'assembly firmato. È per proteggere l'altro assembly che sta caricando l'assembly firmato.

Ad esempio, se un EXE è affidabile e desidera caricare una DLL nota da una posizione nota (come GAC, una condivisione di rete, Internet, ecc.), Può farlo utilizzando un nome sicuro con un certo livello di fiducia che l'assemblea non sia stata manomessa.

Ma, se l'insieme delle assemblee si smonta poi ri-assemblato e ri-firmato, allora sì, hai ragione potevano solo riscrivere le righe di codice che caricano il resto delle assemblee in modo tale che li carica con la nuova chiave (falsa).

Ma questo tipo di manomissione sarebbe evidente. In altre parole, la firma del nome forte fornisce una chiara evidenza di manomissione, ma non la previene in tutti i casi. Aggiungete a ciò il fatto che un amministratore locale può disabilitare completamente la verifica del nome sicuro (per scopi di "sviluppo") ed è ovvio che la firma del nome forte non è un meccanismo di sicurezza a prova di proiettile.

Lo stesso vale per Authenticode e firma autista. Tutti abbiamo visto un prodotto là fuori che ordina agli utenti di "ignorare l'avviso di sicurezza". Questo è fondamentalmente ciò che l'EXE farebbe se la verifica del nome forte fosse disabilitata o l'intero gruppo di assiemi avesse le loro firme spogliate - ignorerebbe l'avviso.

0

Nome forte è tutto, beh ... "nome". Cito da qui: Using Strong Name Signatures

"I nomi sicuri offrono un potente meccanismo per conferire identità uniche agli assembly di .NET Framework."

Questo è tutto ciò che otterrete da questo meccanismo. Significa che posso forgiare il tuo assemblaggio e tutti gli assembly a cui fa riferimento, ma non sarò in grado di fingere "l'hai fatto". Non sarò in grado di fingere e tu sei l'editore di questi assembly.

+0

Il problema che vedo è che l'intera infrastruttura non include la pubblicazione della chiave pubblica. Supponiamo che io scarichi un assemblaggio e voglia scoprire se è da te. Come lo faccio? – sharptooth

+0

@sharptooh - Ci sono alcune cose che puoi fare con la nuova interfaccia ICLRStrongName (http://msdn.microsoft.com/en-us/library/dd409349.aspx), ad esempio StrongNameCompareAssemblies, ma se aggiungi questo tipo di controlli nella tua app, anche le chiamate possono essere falsificate :-) –

+0

Sì, esattamente, e il problema è che non esiste un modo centrale in cui potresti aver pubblicato la tua chiave pubblica. Questo perché l'intero meccanismo non serve a verificare che l'assembly provenga da te: è solo per verificare che tutte le versioni successive provengano dallo stesso editore della versione iniziale. – sharptooth

Problemi correlati